/*
 * 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.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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 Log __log = LogFactory.getLog(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 Log __log = LogFactory.getLog(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.fatal(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);
    }

}
