/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you 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.synapse.config.xml;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.util.AXIOMUtil;
import org.apache.axiom.om.xpath.AXIOMXPath;
import org.apache.synapse.SynapseConstants;
import org.apache.synapse.util.AXIOMUtils;
import org.apache.synapse.util.xpath.SynapseXPath;
import org.jaxen.JaxenException;

import javax.xml.stream.XMLStreamException;

/**
 *
 *
 */

public class LogMediatorSerializationTest extends AbstractTestCase {

    LogMediatorFactory logMediatorFactory;
    LogMediatorSerializer logMediatorSerializer;

    private static final String SIMPLE = "simple";
    private static final String HEADERS = "headers";
    private static final String FULL = "full";
    private static final String CUSTOM = "custom";

    public LogMediatorSerializationTest() {
        super(LogMediatorSerializationTest.class.getName());
        logMediatorFactory = new LogMediatorFactory();
        logMediatorSerializer = new LogMediatorSerializer();
    }

    public void testLogMediatorSerializationWithTemplate() throws Exception {

        assertTrue(serialization(getXmlOfLogMediatorWithTemplate(), logMediatorFactory, logMediatorSerializer));
        assertTrue(serialization(getXmlOfLogMediatorWithTemplateAndProps(), logMediatorFactory, logMediatorSerializer));
        assertTrue(serialization(getXmlOfLogMediatorWithEmptyTemplateAndProps(), logMediatorFactory, logMediatorSerializer));
    }

    public void testLogMediatorSerializationSenarioOne() throws Exception {

        //    assertTrue(serialization(getXmlOfMediatorScenarioOne(SIMPLE), logMediatorFactory, logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioOne(HEADERS), logMediatorFactory, logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioOne(FULL), logMediatorFactory, logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioOne(CUSTOM), logMediatorFactory, logMediatorSerializer));

//        assertTrue(serialization(getXmlOfMediatorScenarioOne(SIMPLE), logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioOne(HEADERS), logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioOne(FULL), logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioOne(CUSTOM), logMediatorSerializer));


    }

    public void testLogMediatorSerializationScenarioTwo() throws Exception {

//        assertTrue(serialization(getXmlOfMediatorScenarioTwo(SIMPLE, ":"), logMediatorFactory, logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioTwo(HEADERS, ":"), logMediatorFactory, logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioTwo(FULL, ";"), logMediatorFactory, logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioTwo(CUSTOM, ":"), logMediatorFactory, logMediatorSerializer));

        //       assertTrue(serialization(getXmlOfMediatorScenarioTwo(SIMPLE, ":"), logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioTwo(HEADERS, ":"), logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioTwo(FULL, ";"), logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioTwo(CUSTOM, ":"), logMediatorSerializer));


    }

    public void testLogMediatorSerializationScenarioThree() throws Exception {
        assertTrue(serialization(getXmlOfMediatorScenarioThree(LogMediatorFactory.CAT_TRACE),
                logMediatorFactory, logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioThree(LogMediatorFactory.CAT_DEBUG),
                logMediatorFactory, logMediatorSerializer));
        //assertTrue(serialization(getXmlOfMediatorScenarioThree(LogMediatorFactory.CAT_INFO), logMediatorFactory, logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioThree(LogMediatorFactory.CAT_WARN),
                logMediatorFactory, logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioThree(LogMediatorFactory.CAT_ERROR),
                logMediatorFactory, logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioThree(LogMediatorFactory.CAT_FATAL),
                logMediatorFactory, logMediatorSerializer));

        assertTrue(serialization(getXmlOfMediatorScenarioThree(LogMediatorFactory.CAT_TRACE),
                logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioThree(LogMediatorFactory.CAT_DEBUG),
                logMediatorSerializer));
        //assertTrue(serialization(getXmlOfMediatorScenarioThree(INFO), logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioThree(LogMediatorFactory.CAT_WARN),
                logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioThree(LogMediatorFactory.CAT_ERROR),
                logMediatorSerializer));
        assertTrue(serialization(getXmlOfMediatorScenarioThree(LogMediatorFactory.CAT_FATAL),
                logMediatorSerializer));
    }

    public void testXPath() {
        try {
            OMElement element = AXIOMUtil.stringToOM(getXmlOfMediatorScenarioOneA("full"));

            AXIOMXPath xPath = new AXIOMXPath("//property/@name");
            //xPath.addNamespace(SynapseConstants.SYNAPSE_NAMESPACE, "");
            Object o = xPath.selectSingleNode(element);
            if (o instanceof OMAttribute) {
                System.out.println(((OMAttribute) o).getAttributeValue());
            }
        } catch (XMLStreamException e) {
            e.printStackTrace();
        } catch (JaxenException e) {
            e.printStackTrace();
        }
    }

    private String getXmlOfMediatorScenarioOne(String level) {
        return "<log xmlns=\"http://ws.apache.org/ns/synapse\" level=\"" +
                level + "\"><property name=\"Text\" value=\"Sending quote request\"/></log>";

    }

    private String getXmlOfLogMediatorWithTemplate() {
        return "<log xmlns=\"http://ws.apache.org/ns/synapse\">" +
                "<message>Processing message with ID: 123</message></log>";
    }

    private String getXmlOfLogMediatorWithTemplateAndProps() {
        return "<log xmlns=\"http://ws.apache.org/ns/synapse\">" +
                "<message>Processing message with ID: 123</message>" +
                "<property name=\"Text\" value=\"Sending quote request\"/></log>";
    }

    private String getXmlOfLogMediatorWithEmptyTemplateAndProps() {
        return "<log xmlns=\"http://ws.apache.org/ns/synapse\">" +
                "<message></message>" +
                "<property name=\"Text\" value=\"Sending quote request\"/></log>";
    }

    private String getXmlOfMediatorScenarioOneA(String level) {
        return "<log level=\"" +
                level + "\"><property name=\"Text\" value=\"Sending quote request\"/></log>";

    }

    private String getXmlOfMediatorScenarioTwo(String level, String seperator) {
        return "<log xmlns=\"http://ws.apache.org/ns/synapse\" level=\"" +
                level + "\" separator=\"" + seperator +
                "\"><property name=\"Text\" value=\"Sending quote request\"/></log>";

    }

    private String getXmlOfMediatorScenarioThree(String category) {
        return "<log xmlns=\"http://ws.apache.org/ns/synapse\" category=\"" +
                category + "\"><property name=\"Text\" value=\"Sending quote request\"/></log>";

    }

}
