/*
 * Copyright  1999-2004 The Apache Software Foundation.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

package org.apache.savan.util;

import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.llom.factory.OMXMLBuilderFactory;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axiom.soap.SOAPFactory;
import org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder;
import org.apache.axis2.databinding.types.Duration;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.Parameter;
import org.apache.savan.SavanConstants;
import org.apache.savan.storage.SubscriberStore;
import org.apache.xmlbeans.XmlObject;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Calendar;

/** A common set of methods that may be used in various places of Savan. */
public class CommonUtil {

    public static Calendar addDurationToCalendar(Calendar calendar, Duration duration) {
        calendar.add(Calendar.YEAR, duration.getYears());
        calendar.add(Calendar.MONTH, duration.getMonths());
        calendar.add(Calendar.DATE, duration.getDays());
        calendar.add(Calendar.HOUR, duration.getHours());
        calendar.add(Calendar.MINUTE, duration.getMinutes());
        calendar.add(Calendar.SECOND, (int)duration.getSeconds());

        return calendar;
    }

    /**
     * Will be used by test cases to load XML files from test-resources as Envelopes SOAP 1.1 is
     * assumed
     *
     * @param path
     * @param name
     * @return
     */
    public static SOAPEnvelope getTestEnvelopeFromFile(String path,
                                                       String name,
                                                       SOAPFactory factory) throws IOException {
        try {
            String fullName = path + File.separator + name;
            FileReader reader = new FileReader(fullName);
            XMLStreamReader streamReader = XMLInputFactory.newInstance().createXMLStreamReader(
                    reader);
            StAXSOAPModelBuilder builder = OMXMLBuilderFactory.createStAXSOAPModelBuilder(
                    factory, streamReader);
            return builder.getSOAPEnvelope();
        } catch (XMLStreamException e) {
            throw new RuntimeException(e);
        }
    }

    public static boolean isDuration(String timeStr) {
        return timeStr.startsWith("p") || timeStr.startsWith("P") || timeStr.startsWith("-p") ||
               timeStr.startsWith("-P");

    }

    public static SubscriberStore getSubscriberStore(AxisService axisService) {
        Parameter parameter = axisService.getParameter(SavanConstants.SUBSCRIBER_STORE);
        if (parameter == null)
            return null;

        return (SubscriberStore)parameter.getValue();
    }

    public static OMElement toOM(XmlObject element) {
        org.apache.axiom.om.impl.builder.StAXOMBuilder builder =
                new org.apache.axiom.om.impl.builder.StAXOMBuilder
                        (org.apache.axiom.om.OMAbstractFactory.getOMFactory(),
                         new org.apache.axis2.util.StreamWrapper(element.newXMLStreamReader()));
        return builder.getDocumentElement();
	}
}
