/*
 * 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.ode.bpel.compiler.bom;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.ode.bpel.compiler.BpelC;
import org.apache.ode.bpel.compiler.bom.IfActivity.Case;
import org.apache.ode.utils.DOMUtils;
import org.apache.ode.utils.XMLParserUtils;
import org.jaxen.saxpath.SAXPathException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;

import javax.xml.namespace.QName;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;

public class BpelObjectFactory {

    private static final Logger __log = LoggerFactory.getLogger(BpelObjectFactory.class);
    private static BpelObjectFactory __instance = new BpelObjectFactory();

    public static final String WSDL = "http://schemas.xmlsoap.org/wsdl/";
    public static final String XML = "http://www.w3.org/2001/xml.xsd";

    private final Map<QName, Class<? extends BpelObject>> _mappings = new HashMap<QName, Class<? extends BpelObject>>();

    private Class[] __CTOR = { Element.class };

    public BpelObjectFactory() {

        //
        // BPEL 2.0 Final Mappings
        //
        _mappings.put(Bpel20QNames.FINAL_PROCESS, Process.class);
        _mappings.put(Bpel20QNames.FINAL_ASSIGN, AssignActivity.class);
        _mappings.put(Bpel20QNames.FINAL_EMPTY, EmptyActivity.class);
        _mappings.put(Bpel20QNames.FINAL_INVOKE, InvokeActivity.class);
        _mappings.put(Bpel20QNames.FINAL_RECEIVE, ReceiveActivity.class);
        _mappings.put(Bpel20QNames.FINAL_REPLY, ReplyActivity.class);
        _mappings.put(Bpel20QNames.FINAL_WAIT, WaitActivity.class);
        _mappings.put(Bpel20QNames.FINAL_THROW, ThrowActivity.class);
        _mappings.put(Bpel20QNames.FINAL_COMPENSATE, CompensateActivity.class);
        _mappings.put(Bpel20QNames.FINAL_COMPENSATE_SCOPE, CompensateScopeActivity.class);
        _mappings.put(Bpel20QNames.FINAL_RETHROW, RethrowActivity.class);
        _mappings.put(Bpel20QNames.FINAL_EXIT, TerminateActivity.class);
        _mappings.put(Bpel20QNames.FINAL_FLOW, FlowActivity.class);
        _mappings.put(Bpel20QNames.FINAL_SWITCH, IfActivity.class);
        _mappings.put(Bpel20QNames.FINAL_IF, IfActivity.class);
        _mappings.put(Bpel20QNames.FINAL_WHILE, WhileActivity.class);
        _mappings.put(Bpel20QNames.FINAL_REPEATUNTIL,RepeatUntilActivity.class);
        _mappings.put(Bpel20QNames.FINAL_SEQUENCE, SequenceActivity.class);
        _mappings.put(Bpel20QNames.FINAL_PICK, PickActivity.class);
        _mappings.put(Bpel20QNames.FINAL_SCOPE, ScopeActivity.class);
        _mappings.put(Bpel20QNames.FINAL_FOREACH, ForEachActivity.class);
        _mappings.put(Bpel20QNames.FINAL_COMPLETION_CONDITION, CompletionCondition.class);
        _mappings.put(Bpel20QNames.FINAL_BRANCHES, Branches.class);
        _mappings.put(Bpel20QNames.FINAL_COPY, Copy.class);
        _mappings.put(Bpel20QNames.FINAL_CATCH, Catch.class);
        _mappings.put(Bpel20QNames.FINAL_CATCHALL, Catch.class);
        _mappings.put(Bpel20QNames.FINAL_TO, To.class);
        _mappings.put(Bpel20QNames.FINAL_FROM, From.class);
        _mappings.put(Bpel20QNames.FINAL_START_COUNTER_VALUE, Expression.class);
        _mappings.put(Bpel20QNames.FINAL_FINAL_COUNTER_VALUE, Expression.class);
        _mappings.put(Bpel20QNames.FINAL_CORRELATION, Correlation.class);
        _mappings.put(Bpel20QNames.FINAL_CORRELATIONSET, CorrelationSet.class);
        _mappings.put(Bpel20QNames.FINAL_COMPENSATE, CompensateActivity.class);
        _mappings.put(Bpel20QNames.FINAL_COMPENSATE_SCOPE, CompensateScopeActivity.class);
        _mappings.put(Bpel20QNames.FINAL_COMPENSATIONHANDLER, CompensationHandler.class);
        _mappings.put(Bpel20QNames.FINAL_FAULTHANDLERS, FaultHandler.class);
        _mappings.put(Bpel20QNames.FINAL_TERMINATIONHANDLER, TerminationHandler.class);
        _mappings.put(Bpel20QNames.FINAL_CASE, IfActivity.Case.class);
        _mappings.put(Bpel20QNames.FINAL_CONDITION, Expression.class);
        _mappings.put(Bpel20QNames.FINAL_UNTIL, Expression.class);
        _mappings.put(Bpel20QNames.FINAL_FOR, Expression.class);
        _mappings.put(Bpel20QNames.FINAL_REPEAT_EVERY, Expression.class);
        _mappings.put(Bpel20QNames.FINAL_ONALARM, OnAlarm.class);
        _mappings.put(Bpel20QNames.FINAL_ONEVENT, OnEvent.class);
        _mappings.put(Bpel20QNames.FINAL_ONMESSAGE, OnMessage.class);
        _mappings.put(Bpel20QNames.FINAL_LITERAL, LiteralVal.class);
        _mappings.put(Bpel20QNames.FINAL_PLINKTYPE, PartnerLinkType.class);
        _mappings.put(Bpel20QNames.FINAL_PLINKROLE, PartnerLinkType.Role.class);
        _mappings.put(Bpel20QNames.FINAL_PROPALIAS, PropertyAlias.class);
        _mappings.put(Bpel20QNames.FINAL_PROPQUERY, Query.class);
        _mappings.put(Bpel20QNames.FINAL_PROPERTY,  Property.class);
        _mappings.put(Bpel20QNames.FINAL_VARIABLES, Variables.class);
        _mappings.put(Bpel20QNames.FINAL_VARIABLE, Variable.class);
        _mappings.put(Bpel20QNames.FINAL_PARTNERLINKS, PartnerLinks.class);
        _mappings.put(Bpel20QNames.FINAL_PARTNERLINK, PartnerLink.class);
        _mappings.put(Bpel20QNames.FINAL_CORRELATIONSETS, CorrelationSets.class);
        _mappings.put(Bpel20QNames.FINAL_JOIN_CONDITION, Expression.class);
        _mappings.put(Bpel20QNames.FINAL_LINKS, Links.class );
        _mappings.put(Bpel20QNames.FINAL_LINK, Link.class);
        _mappings.put(Bpel20QNames.FINAL_SOURCE, LinkSource.class);
        _mappings.put(Bpel20QNames.FINAL_TARGET, LinkTarget.class);
        _mappings.put(Bpel20QNames.FINAL_SOURCES, BpelObject.class);
        _mappings.put(Bpel20QNames.FINAL_TARGETS, BpelObject.class);
        _mappings.put(Bpel20QNames.FINAL_IMPORT, Import.class);
        _mappings.put(Bpel20QNames.FINAL_QUERY, Query.class);
        _mappings.put(Bpel20QNames.FINAL_TRANSITION_CONDITION, Expression.class);
        _mappings.put(Bpel20QNames.FINAL_THEN, Case.class);
        _mappings.put(Bpel20QNames.FINAL_ELSE, Case.class);
        _mappings.put(Bpel20QNames.FINAL_ELSEIF, Case.class);
        _mappings.put(Bpel20QNames.FINAL_CORRELATIONS, Correlations.class);
        _mappings.put(Bpel20QNames.FINAL_EVENTHANDLERS, BpelObject.class);
        _mappings.put(Bpel20QNames.FINAL_TARGETS,Targets.class);
        _mappings.put(Bpel20QNames.FINAL_SOURCES,Sources.class);

        //
        // BPEL 2.0 draft Mappings
        //
        _mappings.put(Bpel20QNames.PROCESS, Process.class);
        _mappings.put(Bpel20QNames.ASSIGN, AssignActivity.class);
        _mappings.put(Bpel20QNames.EMPTY, EmptyActivity.class);
        _mappings.put(Bpel20QNames.INVOKE, InvokeActivity.class);
        _mappings.put(Bpel20QNames.RECEIVE, ReceiveActivity.class);
        _mappings.put(Bpel20QNames.REPLY, ReplyActivity.class);
        _mappings.put(Bpel20QNames.WAIT, WaitActivity.class);
        _mappings.put(Bpel20QNames.THROW, ThrowActivity.class);
        _mappings.put(Bpel20QNames.COMPENSATE, CompensateScopeActivity.class);
        _mappings.put(Bpel20QNames.RETHROW, RethrowActivity.class);
        _mappings.put(Bpel20QNames.EXIT, TerminateActivity.class);
        _mappings.put(Bpel20QNames.FLOW, FlowActivity.class);
        _mappings.put(Bpel20QNames.SWITCH, IfActivity.class);
        _mappings.put(Bpel20QNames.IF, IfActivity.class);
        _mappings.put(Bpel20QNames.WHILE, WhileActivity.class);
        _mappings.put(Bpel20QNames.REPEATUNTIL,RepeatUntilActivity.class);
        _mappings.put(Bpel20QNames.SEQUENCE, SequenceActivity.class);
        _mappings.put(Bpel20QNames.PICK, PickActivity.class);
        _mappings.put(Bpel20QNames.SCOPE, ScopeActivity.class);
        _mappings.put(Bpel20QNames.FOREACH, ForEachActivity.class);
        _mappings.put(Bpel20QNames.COPY, Copy.class);
        _mappings.put(Bpel20QNames.CATCH, Catch.class);
        _mappings.put(Bpel20QNames.CATCHALL, Catch.class);
        _mappings.put(Bpel20QNames.TO, To.class);
        _mappings.put(Bpel20QNames.FROM, From.class);
        _mappings.put(Bpel20QNames.START_COUNTER_VALUE, Expression.class);
        _mappings.put(Bpel20QNames.FINAL_COUNTER_VALUE, Expression.class);
        _mappings.put(Bpel20QNames.COMPLETION_CONDITION, CompletionCondition.class);
        _mappings.put(Bpel20QNames.BRANCHES, Branches.class);
        _mappings.put(Bpel20QNames.CORRELATION, Correlation.class);
        _mappings.put(Bpel20QNames.CORRELATIONSET, CorrelationSet.class);
        _mappings.put(Bpel20QNames.COMPENSATE, CompensateScopeActivity.class);
        _mappings.put(Bpel20QNames.COMPENSATE_SCOPE, CompensateScopeActivity.class);
        _mappings.put(Bpel20QNames.COMPENSATIONHANDLER, CompensationHandler.class);
        _mappings.put(Bpel20QNames.FAULTHANDLERS, FaultHandler.class);
        _mappings.put(Bpel20QNames.TERMINATIONHANDLER, TerminationHandler.class);
        _mappings.put(Bpel20QNames.CASE, IfActivity.Case.class);
        _mappings.put(Bpel20QNames.CONDITION, Expression.class);
        _mappings.put(Bpel20QNames.UNTIL, Expression.class);
        _mappings.put(Bpel20QNames.FOR, Expression.class);
        _mappings.put(Bpel20QNames.REPEAT_EVERY, Expression.class);
        _mappings.put(Bpel20QNames.ONALARM, OnAlarm.class);
        _mappings.put(Bpel20QNames.ONEVENT, OnEvent.class);
        _mappings.put(Bpel20QNames.ONMESSAGE, OnMessage.class);
        _mappings.put(Bpel20QNames.LITERAL, LiteralVal.class);
        _mappings.put(Bpel20QNames.PLINKTYPE, PartnerLinkType.class);
        _mappings.put(Bpel20QNames.PLINKROLE, PartnerLinkType.Role.class);
        _mappings.put(Bpel20QNames.PROPALIAS, PropertyAlias.class);
        _mappings.put(Bpel20QNames.PROPERTY,  Property.class);
        _mappings.put(Bpel20QNames.VARIABLES, Variables.class);
        _mappings.put(Bpel20QNames.VARIABLE, Variable.class);
        _mappings.put(Bpel20QNames.PARTNERLINKS, PartnerLinks.class);
        _mappings.put(Bpel20QNames.PARTNERLINK, PartnerLink.class);
        _mappings.put(Bpel20QNames.CORRELATIONSETS, CorrelationSets.class);
        _mappings.put(Bpel20QNames.JOIN_CONDITION, Expression.class);
        _mappings.put(Bpel20QNames.LINKS, Links.class );
        _mappings.put(Bpel20QNames.LINK, Link.class);
        _mappings.put(Bpel20QNames.SOURCE, LinkSource.class);
        _mappings.put(Bpel20QNames.TARGET, LinkTarget.class);
        _mappings.put(Bpel20QNames.SOURCES, BpelObject.class);
        _mappings.put(Bpel20QNames.TARGETS, BpelObject.class);
        _mappings.put(Bpel20QNames.IMPORT, Import.class);
        _mappings.put(Bpel20QNames.QUERY, Query.class);
        _mappings.put(Bpel20QNames.TRANSITION_CONDITION, Expression.class);
        _mappings.put(Bpel20QNames.THEN, Case.class);
        _mappings.put(Bpel20QNames.ELSE, Case.class);
        _mappings.put(Bpel20QNames.ELSEIF, Case.class);
        _mappings.put(Bpel20QNames.CORRELATIONS, Correlations.class);
        _mappings.put(Bpel20QNames.EVENTHANDLERS, BpelObject.class);
        _mappings.put(Bpel20QNames.TARGETS,Targets.class);
        _mappings.put(Bpel20QNames.SOURCES,Sources.class);
        _mappings.put(Bpel20QNames.RDF_LABEL,RdfLabel.class);

        //
        // BPEL 1.1 Mappings
        //
        _mappings.put(Bpel11QNames.PROCESS, Process.class);
        _mappings.put(Bpel11QNames.ASSIGN, AssignActivity.class);
        _mappings.put(Bpel11QNames.EMPTY, EmptyActivity.class);
        _mappings.put(Bpel11QNames.INVOKE, InvokeActivity.class);
        _mappings.put(Bpel11QNames.RECEIVE, ReceiveActivity.class);
        _mappings.put(Bpel11QNames.REPLY, ReplyActivity.class);
        _mappings.put(Bpel11QNames.WAIT, WaitActivity.class);
        _mappings.put(Bpel11QNames.THROW, ThrowActivity.class);
        _mappings.put(Bpel11QNames.TERMINATE, TerminateActivity.class);
        _mappings.put(Bpel11QNames.FLOW, FlowActivity.class);
        _mappings.put(Bpel11QNames.SWITCH, SwitchActivity.class);
        _mappings.put(Bpel11QNames.WHILE, WhileActivity11.class);
        _mappings.put(Bpel11QNames.SEQUENCE, SequenceActivity.class);
        _mappings.put(Bpel11QNames.PICK, PickActivity.class);
        _mappings.put(Bpel11QNames.SCOPE, ScopeActivity.class);
        _mappings.put(Bpel11QNames.COPY, Copy.class);
        _mappings.put(Bpel11QNames.CATCH, Catch.class);
        _mappings.put(Bpel11QNames.CATCHALL, Catch.class);
        _mappings.put(Bpel11QNames.TO, To.class);
        _mappings.put(Bpel11QNames.FROM, From.class);
        _mappings.put(Bpel11QNames.CORRELATION, Correlation.class);
        _mappings.put(Bpel11QNames.CORRELATIONSET, CorrelationSet.class);
        _mappings.put(Bpel11QNames.COMPENSATE, CompensateScopeActivity.class);
        _mappings.put(Bpel11QNames.COMPENSATIONHANDLER, CompensationHandler.class);
        _mappings.put(Bpel11QNames.FAULTHANDLERS, FaultHandler.class);
        _mappings.put(Bpel11QNames.CASE, SwitchActivity.Case.class);
        _mappings.put(Bpel11QNames.OTHERWISE, SwitchActivity.Case.class);
        _mappings.put(Bpel11QNames.ONALARM, OnAlarm.class);
        _mappings.put(Bpel11QNames.ONMESSAGE, OnMessage.class);
        _mappings.put(Bpel11QNames.PLINKTYPE, PartnerLinkType.class);
        _mappings.put(Bpel11QNames.PLINKROLE, PartnerLinkType.Role11.class);
        _mappings.put(Bpel11QNames.PORTTYPE, PartnerLinkType.Role11.PortType11.class);
        _mappings.put(Bpel11QNames.PROPALIAS, PropertyAlias11.class);
        _mappings.put(Bpel11QNames.PROPERTY,  Property.class);
        _mappings.put(Bpel11QNames.VARIABLES, Variables.class);
        _mappings.put(Bpel11QNames.VARIABLE, Variable.class);
        _mappings.put(Bpel11QNames.PARTNERLINKS, PartnerLinks.class);
        _mappings.put(Bpel11QNames.PARTNERLINK, PartnerLink.class);
        _mappings.put(Bpel11QNames.CORRELATIONSETS, CorrelationSets.class);
        _mappings.put(Bpel11QNames.LINKS, Links.class );
        _mappings.put(Bpel11QNames.LINK, Link.class);
        _mappings.put(Bpel11QNames.SOURCE, LinkSource.class);
        _mappings.put(Bpel11QNames.TARGET, LinkTarget.class);
        _mappings.put(Bpel11QNames.QUERY, Query.class);
        _mappings.put(Bpel11QNames.CORRELATIONS, Correlations.class);
        _mappings.put(Bpel11QNames.EVENTHANDLERS, BpelObject.class);

        //
        // Extensibility Elements Mappings
        //
        _mappings.put(ExtensibilityQNames.FAILURE_HANDLING, FailureHandling.class);
        _mappings.put(ExtensibilityQNames.FAILURE_HANDLING_RETRY_FOR, FailureHandling.RetryFor.class);
        _mappings.put(ExtensibilityQNames.FAILURE_HANDLING_RETRY_DELAY, FailureHandling.RetryDelay.class);
        _mappings.put(ExtensibilityQNames.FAILURE_HANDLING_FAULT_ON, FailureHandling.FaultOnFailure.class);

    }

    public static BpelObjectFactory getInstance() {
        return __instance;
    }

    public BpelObject createBpelObject(Element el, URI uri) {
        QName type = new QName(el.getNamespaceURI(), el.getLocalName());
        Class cls = _mappings.get(type);
        if (cls == null) {
            __log.warn("Unrecognized element in BPEL dom: " + type);
            return new BpelObject(el);
        }
        try {
            Constructor ctor = cls.getConstructor(__CTOR);
            BpelObject bo =(BpelObject) ctor.newInstance(new Object[]{el});
            bo.setURI(uri);
            return bo;
        } catch (Exception ex) {
            throw new RuntimeException("Internal compiler error", ex);
        }
    }

    public static class BOMSAXErrorHandler implements ErrorHandler {
        private static final Logger __log = LoggerFactory.getLogger(BOMSAXErrorHandler.class);
        
    	private boolean ok = true;
    	private boolean strict = false;
    	
    	public BOMSAXErrorHandler(boolean strict) {
    	    this.strict = strict;
    	}
    	
    	private String formatException(SAXParseException exception) {
    		return exception.getPublicId() + ":" + exception.getSystemId() + ":" + exception.getLineNumber() + ":" + exception.getColumnNumber() + ":" + exception.getMessage();
    	}
    	
    	public boolean wasOK() { return ok; }
		public void error(SAXParseException exception) throws SAXException {
			ok = false;
			if (strict) {
			    __log.error(formatException(exception));
			} else {
			    __log.warn(formatException(exception));
			}
		}

		public void fatalError(SAXParseException exception) throws SAXException {
			ok = false;
			if (strict) {
			    __log.error(formatException(exception));    
			} else {
			    __log.warn(formatException(exception));
			}
		}

		public void warning(SAXParseException exception) throws SAXException {
			__log.warn(formatException(exception));
		}
    }
    
    /**
     * Parse a BPEL process found at the input source.
     * @param isrc input source.
     * @return
     * @throws SAXException
     */
    public Process parse(InputSource isrc, URI systemURI) throws IOException, SAXException {
        XMLReader _xr = XMLParserUtils.getXMLReader();
        LocalEntityResolver resolver = new LocalEntityResolver();
        resolver.register(Bpel11QNames.NS_BPEL4WS_2003_03, getClass().getResource("/bpel4ws_1_1-fivesight.xsd"));
        resolver.register(Bpel20QNames.NS_WSBPEL2_0, getClass().getResource("/wsbpel_main-draft-Apr-29-2006.xsd"));
        resolver.register(Bpel20QNames.NS_WSBPEL2_0_FINAL_ABSTRACT, getClass().getResource("/ws-bpel_abstract_common_base.xsd"));
        resolver.register(Bpel20QNames.NS_WSBPEL2_0_FINAL_EXEC, getClass().getResource("/ws-bpel_executable.xsd"));
        resolver.register(Bpel20QNames.NS_WSBPEL2_0_FINAL_PLINK, getClass().getResource("/ws-bpel_plnktype.xsd"));
        resolver.register(Bpel20QNames.NS_WSBPEL2_0_FINAL_SERVREF, getClass().getResource("/ws-bpel_serviceref.xsd"));
        resolver.register(Bpel20QNames.NS_WSBPEL2_0_FINAL_VARPROP, getClass().getResource("/ws-bpel_varprop.xsd"));
        resolver.register(XML, getClass().getResource("/xml.xsd"));
        resolver.register(WSDL,getClass().getResource("/wsdl.xsd"));
        resolver.register(Bpel20QNames.NS_WSBPEL_PARTNERLINK_2004_03,
                getClass().getResource("/wsbpel_plinkType-draft-Apr-29-2006.xsd"));
        _xr.setEntityResolver(resolver);
        Document doc = DOMUtils.newDocument();
        _xr.setContentHandler(new DOMBuilderContentHandler(doc));
        _xr.setFeature("http://xml.org/sax/features/namespaces",true);
        _xr.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
        
        _xr.setFeature("http://xml.org/sax/features/validation", true);
		XMLParserUtils.addExternalSchemaURL(_xr, Bpel11QNames.NS_BPEL4WS_2003_03, Bpel11QNames.NS_BPEL4WS_2003_03);
		XMLParserUtils.addExternalSchemaURL(_xr, Bpel20QNames.NS_WSBPEL2_0, Bpel20QNames.NS_WSBPEL2_0);
		XMLParserUtils.addExternalSchemaURL(_xr, Bpel20QNames.NS_WSBPEL2_0_FINAL_EXEC, Bpel20QNames.NS_WSBPEL2_0_FINAL_EXEC);
		XMLParserUtils.addExternalSchemaURL(_xr, Bpel20QNames.NS_WSBPEL2_0_FINAL_ABSTRACT, Bpel20QNames.NS_WSBPEL2_0_FINAL_ABSTRACT);
        
		boolean strict = Boolean.parseBoolean(System.getProperty("org.apache.ode.compiler.failOnValidationErrors", "false")); 
		BOMSAXErrorHandler errorHandler = new BOMSAXErrorHandler(strict);
        _xr.setErrorHandler(errorHandler);
        _xr.parse(isrc);
        if (strict) {
	        if (!errorHandler.wasOK()) {
	        	throw new SAXException("Validation errors during parsing");
	        }
        } else {
        	if (!errorHandler.wasOK()) {
        		__log.warn("Validation errors during parsing, continuing due to -Dorg.apache.ode.compiler.failOnValidationErrors=false switch");
        	}
        }
        return (Process) createBpelObject(doc.getDocumentElement(), systemURI);
    }

}
