Search in sources :

Example 1 with PolicyInfo

use of org.apache.synapse.util.PolicyInfo in project wso2-synapse by wso2.

the class ProxyServiceSerializer method serializeProxy.

public static OMElement serializeProxy(OMElement parent, ProxyService service) {
    OMElement proxy = fac.createOMElement("proxy", synNS);
    if (service.getName() != null) {
        proxy.addAttribute(fac.createOMAttribute("name", nullNS, service.getName()));
    } else {
        handleException("Invalid proxy service. Service name is required");
    }
    String descriptionStr = service.getDescription();
    if (descriptionStr != null) {
        OMElement description = fac.createOMElement("description", synNS);
        description.addChild(fac.createOMText(descriptionStr));
        proxy.addChild(description);
    }
    ArrayList transports = service.getTransports();
    if (transports != null && !transports.isEmpty()) {
        String transportStr = "" + transports.get(0);
        for (int i = 1; i < transports.size(); i++) {
            transportStr = transportStr.concat(" " + transports.get(i));
        }
        proxy.addAttribute(fac.createOMAttribute("transports", nullNS, transportStr));
    }
    if (service.getServiceGroup() != null) {
        proxy.addAttribute(fac.createOMAttribute("serviceGroup", nullNS, service.getServiceGroup()));
    }
    List pinnedServers = service.getPinnedServers();
    if (pinnedServers != null && !pinnedServers.isEmpty()) {
        String pinnedServersStr = "" + pinnedServers.get(0);
        for (int i = 1; i < pinnedServers.size(); i++) {
            pinnedServersStr = pinnedServersStr.concat(" " + pinnedServers.get(i));
        }
        proxy.addAttribute(fac.createOMAttribute("pinnedServers", nullNS, pinnedServersStr));
    }
    if (service.isStartOnLoad()) {
        proxy.addAttribute(fac.createOMAttribute("startOnLoad", nullNS, "true"));
    } else {
        proxy.addAttribute(fac.createOMAttribute("startOnLoad", nullNS, "false"));
    }
    String endpoint = service.getTargetEndpoint();
    OMElement target = fac.createOMElement("target", synNS);
    Endpoint inLineEndpoint = service.getTargetInLineEndpoint();
    if (endpoint != null) {
        target.addAttribute(fac.createOMAttribute("endpoint", nullNS, endpoint));
        proxy.addChild(target);
    } else if (inLineEndpoint != null) {
        OMElement epElement = EndpointSerializer.getElementFromEndpoint(inLineEndpoint);
        target.addChild(epElement);
        proxy.addChild(target);
    }
    String inSeq = service.getTargetInSequence();
    String outSeq = service.getTargetOutSequence();
    String faultSeq = service.getTargetFaultSequence();
    SequenceMediatorSerializer serializer = new SequenceMediatorSerializer();
    if (inSeq != null) {
        target.addAttribute(fac.createOMAttribute("inSequence", nullNS, inSeq));
        proxy.addChild(target);
    } else {
        SequenceMediator inLineInSeq = service.getTargetInLineInSequence();
        if (inLineInSeq != null) {
            OMElement inSeqElement = serializer.serializeAnonymousSequence(null, inLineInSeq);
            inSeqElement.setLocalName("inSequence");
            target.addChild(inSeqElement);
            proxy.addChild(target);
        }
    }
    if (outSeq != null) {
        target.addAttribute(fac.createOMAttribute("outSequence", nullNS, outSeq));
        proxy.addChild(target);
    } else {
        SequenceMediator inLineOutSeq = service.getTargetInLineOutSequence();
        if (inLineOutSeq != null) {
            OMElement outSeqElement = serializer.serializeAnonymousSequence(null, inLineOutSeq);
            outSeqElement.setLocalName("outSequence");
            target.addChild(outSeqElement);
            proxy.addChild(target);
        }
    }
    if (faultSeq != null) {
        target.addAttribute(fac.createOMAttribute("faultSequence", nullNS, faultSeq));
        proxy.addChild(target);
    } else {
        SequenceMediator inLineFaultSeq = service.getTargetInLineFaultSequence();
        if (inLineFaultSeq != null) {
            OMElement faultSeqElement = serializer.serializeAnonymousSequence(null, inLineFaultSeq);
            faultSeqElement.setLocalName("faultSequence");
            target.addChild(faultSeqElement);
            proxy.addChild(target);
        }
    }
    String wsdlKey = service.getWSDLKey();
    String wsdlEndpoint = service.getPublishWSDLEndpoint();
    String preservePolicy = service.getPreservePolicy();
    URI wsdlUri = service.getWsdlURI();
    Object inLineWSDL = service.getInLineWSDL();
    if (wsdlKey != null || wsdlUri != null || inLineWSDL != null || wsdlEndpoint != null) {
        OMElement wsdl = fac.createOMElement("publishWSDL", synNS);
        if (wsdlEndpoint != null) {
            wsdl.addAttribute(fac.createOMAttribute("endpoint", nullNS, wsdlEndpoint));
        } else if (wsdlKey != null) {
            wsdl.addAttribute(fac.createOMAttribute("key", nullNS, wsdlKey));
        } else if (inLineWSDL != null) {
            wsdl.addChild((OMNode) inLineWSDL);
        } else if (wsdlUri != null) {
            wsdl.addAttribute(fac.createOMAttribute("uri", nullNS, wsdlUri.toString()));
        }
        if (preservePolicy != null) {
            wsdl.addAttribute(fac.createOMAttribute("preservePolicy", nullNS, preservePolicy));
        }
        ResourceMapSerializer.serializeResourceMap(wsdl, service.getResourceMap());
        proxy.addChild(wsdl);
    }
    for (PolicyInfo pi : service.getPolicies()) {
        OMElement policy = fac.createOMElement("policy", synNS);
        if (pi.getPolicyKey() != null) {
            policy.addAttribute(fac.createOMAttribute("key", nullNS, pi.getPolicyKey()));
        } else {
            handleException("Policy without a key has been found");
        }
        if (pi.getOperation() != null) {
            policy.addAttribute(fac.createOMAttribute("operationName", nullNS, pi.getOperation().getLocalPart()));
            if (pi.getOperation().getNamespaceURI() != null) {
                policy.addAttribute(fac.createOMAttribute("operationNamespace", nullNS, pi.getOperation().getNamespaceURI()));
            }
        }
        if (pi.getType() != 0) {
            policy.addAttribute(fac.createOMAttribute("type", nullNS, pi.getMessageLable().toLowerCase()));
        }
        proxy.addChild(policy);
    }
    for (String propertyName : service.getParameterMap().keySet()) {
        OMElement property = fac.createOMElement("parameter", synNS);
        property.addAttribute(fac.createOMAttribute("name", nullNS, propertyName));
        Object value = service.getParameterMap().get(propertyName);
        if (value != null) {
            if (value instanceof String) {
                property.setText(((String) value).trim());
                proxy.addChild(property);
            } else if (value instanceof OMNode) {
                property.addChild((OMNode) value);
                proxy.addChild(property);
            }
        }
    }
    if (service.isWsAddrEnabled()) {
        proxy.addChild(fac.createOMElement("enableAddressing", synNS));
    }
    if (service.isWsSecEnabled()) {
        proxy.addChild(fac.createOMElement("enableSec", synNS));
    }
    StatisticsConfigurable statisticsConfigurable = service.getAspectConfiguration();
    if (statisticsConfigurable != null && statisticsConfigurable.isStatisticsEnable()) {
        proxy.addAttribute(fac.createOMAttribute(XMLConfigConstants.STATISTICS_ATTRIB_NAME, nullNS, XMLConfigConstants.STATISTICS_ENABLE));
    }
    if (statisticsConfigurable != null && statisticsConfigurable.isTracingEnabled()) {
        proxy.addAttribute(fac.createOMAttribute(XMLConfigConstants.TRACE_ATTRIB_NAME, nullNS, XMLConfigConstants.TRACE_ENABLE));
    }
    if (parent != null) {
        parent.addChild(proxy);
    }
    return proxy;
}
Also used : ArrayList(java.util.ArrayList) PolicyInfo(org.apache.synapse.util.PolicyInfo) URI(java.net.URI) Endpoint(org.apache.synapse.endpoints.Endpoint) Endpoint(org.apache.synapse.endpoints.Endpoint) ArrayList(java.util.ArrayList) List(java.util.List) SequenceMediator(org.apache.synapse.mediators.base.SequenceMediator) StatisticsConfigurable(org.apache.synapse.aspects.statistics.StatisticsConfigurable)

Example 2 with PolicyInfo

use of org.apache.synapse.util.PolicyInfo in project wso2-synapse by wso2.

the class ProxyService method buildAxisService.

/**
 * Build the underlying Axis2 service from the Proxy service definition
 *
 * @param synCfg  the Synapse configuration
 * @param axisCfg the Axis2 configuration
 * @return the Axis2 service for the Proxy
 */
public AxisService buildAxisService(SynapseConfiguration synCfg, AxisConfiguration axisCfg) {
    auditInfo("Building Axis service for Proxy service : " + name);
    if (pinnedServers != null && !pinnedServers.isEmpty()) {
        Parameter param = axisCfg.getParameter(SynapseConstants.SYNAPSE_ENV);
        if (param != null && param.getValue() instanceof SynapseEnvironment) {
            SynapseEnvironment synEnv = (SynapseEnvironment) param.getValue();
            String serverName = synEnv != null ? synEnv.getServerContextInformation().getServerConfigurationInformation().getServerName() : "localhost";
            if (!pinnedServers.contains(serverName)) {
                log.info("Server name " + serverName + " not in pinned servers list. " + "Not deploying Proxy service : " + name);
                return null;
            }
        }
    }
    // get the wsdlElement as an OMElement
    if (trace()) {
        trace.info("Loading the WSDL : " + (publishWSDLEndpoint != null ? " endpoint = " + publishWSDLEndpoint : (wsdlKey != null ? " key = " + wsdlKey : (wsdlURI != null ? " URI = " + wsdlURI : " <Inlined>"))));
    }
    InputStream wsdlInputStream = null;
    OMElement wsdlElement = null;
    boolean wsdlFound = false;
    String publishWSDL = null;
    SynapseEnvironment synEnv = SynapseConfigUtils.getSynapseEnvironment(axisCfg);
    String synapseHome = synEnv != null ? synEnv.getServerContextInformation().getServerConfigurationInformation().getSynapseHome() : "";
    if (wsdlKey != null) {
        synCfg.getEntryDefinition(wsdlKey);
        Object keyObject = synCfg.getEntry(wsdlKey);
        // start of fix for ESBJAVA-2641
        if (keyObject == null) {
            synCfg.removeEntry(wsdlKey);
        }
        // end of fix for ESBJAVA-2641
        if (keyObject instanceof OMElement) {
            wsdlElement = (OMElement) keyObject;
        }
        wsdlFound = true;
    } else if (inLineWSDL != null) {
        wsdlElement = (OMElement) inLineWSDL;
        wsdlFound = true;
    } else if (wsdlURI != null) {
        try {
            URL url = wsdlURI.toURL();
            publishWSDL = url.toString();
            OMNode node = SynapseConfigUtils.getOMElementFromURL(publishWSDL, synapseHome);
            if (node instanceof OMElement) {
                wsdlElement = (OMElement) node;
            }
            wsdlFound = true;
        } catch (MalformedURLException e) {
            handleException("Malformed URI for wsdl", e);
        } catch (IOException e) {
            // handleException("Error reading from wsdl URI", e);
            boolean enablePublishWSDLSafeMode = false;
            Map proxyParameters = this.getParameterMap();
            if (!proxyParameters.isEmpty()) {
                if (proxyParameters.containsKey("enablePublishWSDLSafeMode")) {
                    enablePublishWSDLSafeMode = Boolean.parseBoolean(proxyParameters.get("enablePublishWSDLSafeMode").toString().toLowerCase());
                } else {
                    if (trace()) {
                        trace.info("WSDL was unable to load for: " + publishWSDL);
                        trace.info("Please add <syn:parameter name=\"enableURISafeMode\">true" + "</syn:parameter> to proxy service.");
                    }
                    handleException("Error reading from wsdl URI", e);
                }
            }
            if (enablePublishWSDLSafeMode) {
                // !!!Need to add a reload function... And display that the wsdl/service is offline!!!
                if (trace()) {
                    trace.info("WSDL was unable to load for: " + publishWSDL);
                    trace.info("enableURISafeMode: true");
                }
                log.warn("Unable to load the WSDL for : " + name, e);
                return null;
            } else {
                if (trace()) {
                    trace.info("WSDL was unable to load for: " + publishWSDL);
                    trace.info("enableURISafeMode: false");
                }
                handleException("Error reading from wsdl URI", e);
            }
        }
    } else if (publishWSDLEndpoint != null) {
        try {
            URL url = null;
            Endpoint ep = synCfg.getEndpoint(publishWSDLEndpoint);
            if (ep == null) {
                handleException("Unable to resolve WSDL url. " + publishWSDLEndpoint + " is null");
            }
            if (ep instanceof AddressEndpoint) {
                url = new URL(((AddressEndpoint) (ep)).getDefinition().getAddress() + "?wsdl");
            } else if (ep instanceof WSDLEndpoint) {
                url = new URL(((WSDLEndpoint) (ep)).getWsdlURI());
            } else {
                handleException("Unable to resolve WSDL url. " + publishWSDLEndpoint + " is not a AddressEndpoint or WSDLEndpoint");
            }
            publishWSDL = url.toString();
            OMNode node = SynapseConfigUtils.getOMElementFromURL(publishWSDL, synapseHome);
            if (node instanceof OMElement) {
                wsdlElement = (OMElement) node;
            }
            wsdlFound = true;
        } catch (MalformedURLException e) {
            handleException("Malformed URI for wsdl", e);
        } catch (IOException e) {
            // handleException("Error reading from wsdl URI", e);
            boolean enablePublishWSDLSafeMode = false;
            Map proxyParameters = this.getParameterMap();
            if (!proxyParameters.isEmpty()) {
                if (proxyParameters.containsKey("enablePublishWSDLSafeMode")) {
                    enablePublishWSDLSafeMode = Boolean.parseBoolean(proxyParameters.get("enablePublishWSDLSafeMode").toString().toLowerCase());
                } else {
                    if (trace()) {
                        trace.info("WSDL was unable to load for: " + publishWSDL);
                        trace.info("Please add <syn:parameter name=\"enableURISafeMode\">true" + "</syn:parameter> to proxy service.");
                    }
                    handleException("Error reading from wsdl URI " + publishWSDL, e);
                }
            }
            if (enablePublishWSDLSafeMode) {
                // !!!Need to add a reload function... And display that the wsdl/service is offline!!!
                if (trace()) {
                    trace.info("WSDL was unable to load for: " + publishWSDL);
                    trace.info("enableURISafeMode: true");
                }
                log.warn("Unable to load the WSDL for : " + name, e);
                return null;
            } else {
                if (trace()) {
                    trace.info("WSDL was unable to load for: " + publishWSDL);
                    trace.info("enableURISafeMode: false");
                }
                handleException("Error reading from wsdl URI " + publishWSDL, e);
            }
        }
    } else {
        // our SynapseDispatcher will properly dispatch to
        if (trace())
            trace.info("Did not find a WSDL. Assuming a POX or Legacy service");
        axisService = new AxisService();
        AxisOperation mediateOperation = new InOutAxisOperation(SynapseConstants.SYNAPSE_OPERATION_NAME);
        // Set the names of the two messages so that Axis2 is able to produce a WSDL (see SYNAPSE-366):
        mediateOperation.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE).setName("in");
        mediateOperation.getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE).setName("out");
        axisService.addOperation(mediateOperation);
    }
    // if a WSDL was found
    if (wsdlElement != null) {
        OMNamespace wsdlNamespace = wsdlElement.getNamespace();
        // if preservePolicy is set to 'false', remove the security policy content of publish wsdl
        if (preservePolicy != null && preservePolicy.equals("false")) {
            if (org.apache.axis2.namespace.Constants.NS_URI_WSDL11.equals(wsdlNamespace.getNamespaceURI())) {
                removePolicyOfWSDL(wsdlElement);
            }
        }
        // serialize and create an input stream to read WSDL
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            if (trace())
                trace.info("Serializing wsdlElement found to build an Axis2 service");
            wsdlElement.serialize(baos);
            wsdlInputStream = new ByteArrayInputStream(baos.toByteArray());
        } catch (XMLStreamException e) {
            handleException("Error converting to a StreamSource", e);
        }
        if (wsdlInputStream != null) {
            try {
                // detect version of the WSDL 1.1 or 2.0
                if (trace())
                    trace.info("WSDL Namespace is : " + wsdlNamespace.getNamespaceURI());
                if (wsdlNamespace != null) {
                    WSDLToAxisServiceBuilder wsdlToAxisServiceBuilder = null;
                    if (WSDL2Constants.WSDL_NAMESPACE.equals(wsdlNamespace.getNamespaceURI())) {
                        wsdlToAxisServiceBuilder = new WSDL20ToAxisServiceBuilder(wsdlInputStream, null, null);
                    } else if (org.apache.axis2.namespace.Constants.NS_URI_WSDL11.equals(wsdlNamespace.getNamespaceURI())) {
                        wsdlToAxisServiceBuilder = new WSDL11ToAxisServiceBuilder(wsdlInputStream);
                    } else {
                        handleException("Unknown WSDL format.. not WSDL 1.1 or WSDL 2.0");
                    }
                    if (wsdlToAxisServiceBuilder == null) {
                        throw new SynapseException("Could not get the WSDL to Axis Service Builder");
                    }
                    wsdlToAxisServiceBuilder.setBaseUri(wsdlURI != null ? wsdlURI.toString() : synapseHome);
                    if (trace()) {
                        trace.info("Setting up custom resolvers");
                    }
                    // load the UserDefined WSDLResolver and SchemaURIResolver implementations
                    if (synCfg.getProperty(SynapseConstants.SYNAPSE_WSDL_RESOLVER) != null && synCfg.getProperty(SynapseConstants.SYNAPSE_SCHEMA_RESOLVER) != null) {
                        setUserDefinedResourceResolvers(synCfg, wsdlInputStream, wsdlToAxisServiceBuilder);
                    } else {
                        if (resourceMap != null) {
                            // if the resource map is available use it
                            wsdlToAxisServiceBuilder.setCustomResolver(new CustomXmlSchemaURIResolver(resourceMap, synCfg));
                            // Axis 2 also needs a WSDLLocator for WSDL 1.1 documents
                            if (wsdlToAxisServiceBuilder instanceof WSDL11ToAxisServiceBuilder) {
                                ((WSDL11ToAxisServiceBuilder) wsdlToAxisServiceBuilder).setCustomWSDLResolver(new CustomWSDLLocator(new InputSource(wsdlInputStream), wsdlURI != null ? wsdlURI.toString() : "", resourceMap, synCfg));
                            }
                        } else {
                            // if the resource map isn't available ,
                            // then each import URIs will be resolved using base URI
                            wsdlToAxisServiceBuilder.setCustomResolver(new CustomXmlSchemaURIResolver());
                            // Axis 2 also needs a WSDLLocator for WSDL 1.1 documents
                            if (wsdlToAxisServiceBuilder instanceof WSDL11ToAxisServiceBuilder) {
                                ((WSDL11ToAxisServiceBuilder) wsdlToAxisServiceBuilder).setCustomWSDLResolver(new CustomWSDLLocator(new InputSource(wsdlInputStream), wsdlURI != null ? wsdlURI.toString() : ""));
                            }
                        }
                    }
                    if (trace()) {
                        trace.info("Populating Axis2 service using WSDL");
                        if (trace.isTraceEnabled()) {
                            trace.trace("WSDL : " + wsdlElement.toString());
                        }
                    }
                    axisService = wsdlToAxisServiceBuilder.populateService();
                    // this is to clear the bindings and ports already in the WSDL so that the
                    // service will generate the bindings on calling the printWSDL otherwise
                    // the WSDL which will be shown is same as the original WSDL except for the
                    // service name
                    axisService.getEndpoints().clear();
                } else {
                    handleException("Unknown WSDL format.. not WSDL 1.1 or WSDL 2.0");
                }
            } catch (AxisFault af) {
                handleException("Error building service from WSDL", af);
            } catch (IOException ioe) {
                handleException("Error reading WSDL", ioe);
            }
        }
    } else if (wsdlFound) {
        handleException("Couldn't build the proxy service : " + name + ". Unable to locate the specified WSDL to build the service");
    }
    // default Service destination
    if (axisService == null) {
        throw new SynapseException("Could not create a proxy service");
    }
    axisService.setName(name);
    if (description != null) {
        axisService.setDocumentation(description);
    }
    // Setting file path for axis2 service
    if (filePath != null) {
        axisService.setFileName(filePath);
    }
    // destination
    if (transports == null || transports.size() == 0) {
    // default to all transports using service name as destination
    } else {
        if (trace())
            trace.info("Exposing transports : " + transports);
        axisService.setExposedTransports(transports);
    }
    // process parameters
    if (trace() && parameters.size() > 0) {
        trace.info("Setting service parameters : " + parameters);
    }
    for (Object o : parameters.keySet()) {
        String name = (String) o;
        Object value = parameters.get(name);
        Parameter p = new Parameter();
        p.setName(name);
        p.setValue(value);
        try {
            axisService.addParameter(p);
        } catch (AxisFault af) {
            handleException("Error setting parameter : " + name + "" + "to proxy service as a Parameter", af);
        }
    }
    if (JavaUtils.isTrueExplicitly(axisService.getParameterValue(ABSOLUTE_SCHEMA_URL_PARAM))) {
        axisService.setCustomSchemaNamePrefix("");
    }
    if (JavaUtils.isTrueExplicitly(axisService.getParameterValue(ABSOLUTE_PROXY_SCHEMA_URL_PARAM))) {
        axisService.setCustomSchemaNamePrefix("fullschemaurl");
    }
    if (JavaUtils.isTrueExplicitly(axisService.getParameterValue("disableOperationValidation"))) {
        try {
            AxisOperation defaultOp = processOperationValidation(axisService);
        // proxyServiceGroup.setParent(axisCfg);
        } catch (AxisFault axisFault) {
        // ignore
        }
    }
    boolean isNoSecPolicy = false;
    if (!policies.isEmpty()) {
        for (PolicyInfo pi : policies) {
            Policy policy = getPolicyFromKey(pi.getPolicyKey(), synCfg);
            if (policy == null) {
                handleException("Cannot find Policy from the key");
            }
            if (NO_SECURITY_POLICY.equals(policy.getId())) {
                isNoSecPolicy = true;
                log.info("NoSecurity Policy found, skipping policy attachment");
                continue;
            }
            if (pi.isServicePolicy()) {
                axisService.getPolicySubject().attachPolicy(policy);
            } else if (pi.isOperationPolicy()) {
                AxisOperation op = axisService.getOperation(pi.getOperation());
                if (op != null) {
                    op.getPolicySubject().attachPolicy(policy);
                } else {
                    handleException("Couldn't find the operation specified " + "by the QName : " + pi.getOperation());
                }
            } else if (pi.isMessagePolicy()) {
                if (pi.getOperation() != null) {
                    AxisOperation op = axisService.getOperation(pi.getOperation());
                    if (op != null) {
                        op.getMessage(pi.getMessageLable()).getPolicySubject().attachPolicy(policy);
                    } else {
                        handleException("Couldn't find the operation " + "specified by the QName : " + pi.getOperation());
                    }
                } else {
                    // operation is not specified and hence apply to all the applicable messages
                    for (Iterator itr = axisService.getOperations(); itr.hasNext(); ) {
                        Object obj = itr.next();
                        if (obj instanceof AxisOperation) {
                            // check whether the policy is applicable
                            if (!((obj instanceof OutOnlyAxisOperation && pi.getType() == PolicyInfo.MESSAGE_TYPE_IN) || (obj instanceof InOnlyAxisOperation && pi.getType() == PolicyInfo.MESSAGE_TYPE_OUT))) {
                                AxisMessage message = ((AxisOperation) obj).getMessage(pi.getMessageLable());
                                message.getPolicySubject().attachPolicy(policy);
                            }
                        }
                    }
                }
            } else {
                handleException("Undefined Policy type");
            }
        }
    }
    // create a custom message receiver for this proxy service
    ProxyServiceMessageReceiver msgRcvr = new ProxyServiceMessageReceiver();
    msgRcvr.setName(name);
    msgRcvr.setProxy(this);
    Iterator iter = axisService.getOperations();
    while (iter.hasNext()) {
        AxisOperation op = (AxisOperation) iter.next();
        op.setMessageReceiver(msgRcvr);
    }
    try {
        axisService.addParameter(SynapseConstants.SERVICE_TYPE_PARAM_NAME, SynapseConstants.PROXY_SERVICE_TYPE);
        if (serviceGroup == null) {
            auditInfo("Adding service " + name + " to the Axis2 configuration");
            axisCfg.addService(axisService);
        } else {
            auditInfo("Adding service " + name + " to the service group " + serviceGroup);
            if (axisCfg.getServiceGroup(serviceGroup) == null) {
                // If the specified group does not exist we should create it
                AxisServiceGroup proxyServiceGroup = new AxisServiceGroup();
                proxyServiceGroup.setServiceGroupName(serviceGroup);
                proxyServiceGroup.setParent(axisCfg);
                // Add  the service to the new group and add the group the AxisConfiguration
                proxyServiceGroup.addService(axisService);
                axisCfg.addServiceGroup(proxyServiceGroup);
            } else {
                // Simply add the service to the existing group
                axisService.setParent(axisCfg.getServiceGroup(serviceGroup));
                axisCfg.addServiceToExistingServiceGroup(axisService, serviceGroup);
            }
        }
        this.setRunning(true);
    } catch (AxisFault axisFault) {
        try {
            if (axisCfg.getService(axisService.getName()) != null) {
                if (trace())
                    trace.info("Removing service " + name + " due to error : " + axisFault.getMessage());
                axisCfg.removeService(axisService.getName());
            }
        } catch (AxisFault ignore) {
        }
        handleException("Error adding Proxy service to the Axis2 engine", axisFault);
    }
    // should Addressing be engaged on this service?
    if (wsAddrEnabled) {
        auditInfo("WS-Addressing is enabled for service : " + name);
        try {
            axisService.engageModule(axisCfg.getModule(SynapseConstants.ADDRESSING_MODULE_NAME), axisCfg);
        } catch (AxisFault axisFault) {
            handleException("Error loading WS Addressing module on proxy service : " + name, axisFault);
        }
    }
    // should Security be engaged on this service?
    boolean secModuleEngaged = false;
    if (wsSecEnabled && !isNoSecPolicy) {
        auditInfo("WS-Security is enabled for service : " + name);
        try {
            axisService.engageModule(axisCfg.getModule(SynapseConstants.SECURITY_MODULE_NAME), axisCfg);
            secModuleEngaged = true;
        } catch (AxisFault axisFault) {
            handleException("Error loading WS Sec module on proxy service : " + name, axisFault);
        }
    } else if (isNoSecPolicy) {
        log.info("NoSecurity Policy found, skipping rampart engagement");
    }
    moduleEngaged = secModuleEngaged || wsAddrEnabled;
    wsdlPublished = wsdlFound;
    // Engaging Axis2 modules
    Object engaged_modules = parameters.get(ENGAGED_MODULES);
    if (engaged_modules != null) {
        String[] moduleNames = getModuleNames((String) engaged_modules);
        if (moduleNames != null) {
            for (String moduleName : moduleNames) {
                try {
                    AxisModule axisModule = axisCfg.getModule(moduleName);
                    if (axisModule != null) {
                        axisService.engageModule(axisModule, axisCfg);
                        moduleEngaged = true;
                    }
                } catch (AxisFault axisFault) {
                    handleException("Error loading " + moduleName + " module on proxy service : " + name, axisFault);
                }
            }
        }
    }
    auditInfo("Successfully created the Axis2 service for Proxy service : " + name);
    return axisService;
}
Also used : AxisFault(org.apache.axis2.AxisFault) Policy(org.apache.neethi.Policy) MalformedURLException(java.net.MalformedURLException) InputSource(org.xml.sax.InputSource) SynapseException(org.apache.synapse.SynapseException) SynapseEnvironment(org.apache.synapse.core.SynapseEnvironment) OMElement(org.apache.axiom.om.OMElement) URL(java.net.URL) Endpoint(org.apache.synapse.endpoints.Endpoint) WSDLEndpoint(org.apache.synapse.endpoints.WSDLEndpoint) AddressEndpoint(org.apache.synapse.endpoints.AddressEndpoint) WSDLEndpoint(org.apache.synapse.endpoints.WSDLEndpoint) CustomXmlSchemaURIResolver(org.apache.synapse.util.resolver.CustomXmlSchemaURIResolver) OMNamespace(org.apache.axiom.om.OMNamespace) ByteArrayInputStream(java.io.ByteArrayInputStream) InputStream(java.io.InputStream) PolicyInfo(org.apache.synapse.util.PolicyInfo) IOException(java.io.IOException) ByteArrayOutputStream(java.io.ByteArrayOutputStream) OMNode(org.apache.axiom.om.OMNode) AddressEndpoint(org.apache.synapse.endpoints.AddressEndpoint) XMLStreamException(javax.xml.stream.XMLStreamException) ByteArrayInputStream(java.io.ByteArrayInputStream) CustomWSDLLocator(org.apache.synapse.util.resolver.CustomWSDLLocator) ResourceMap(org.apache.synapse.util.resolver.ResourceMap)

Example 3 with PolicyInfo

use of org.apache.synapse.util.PolicyInfo in project wso2-synapse by wso2.

the class ProxyServiceFactory method createProxy.

public static ProxyService createProxy(OMElement elem, Properties properties) {
    ProxyService proxy = null;
    OMAttribute name = elem.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "name"));
    if (name == null) {
        handleException("The 'name' attribute is required for a Proxy service definition");
    } else {
        proxy = new ProxyService(name.getAttributeValue());
    }
    OMAttribute trans = elem.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "transports"));
    if (trans != null) {
        String transports = trans.getAttributeValue();
        if (transports == null || ProxyService.ALL_TRANSPORTS.equals(transports)) {
        // default to all transports using service name as destination
        } else {
            StringTokenizer st = new StringTokenizer(transports, " ,");
            ArrayList<String> transportList = new ArrayList<String>();
            while (st.hasMoreTokens()) {
                String token = st.nextToken();
                if (token.length() != 0) {
                    transportList.add(token);
                }
            }
            proxy.setTransports(transportList);
        }
    }
    OMAttribute pinnedServers = elem.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "pinnedServers"));
    if (pinnedServers != null) {
        String pinnedServersValue = pinnedServers.getAttributeValue();
        if (pinnedServersValue == null) {
        // default to all servers
        } else {
            StringTokenizer st = new StringTokenizer(pinnedServersValue, " ,");
            List<String> pinnedServersList = new ArrayList<String>();
            while (st.hasMoreTokens()) {
                String token = st.nextToken();
                if (token.length() != 0) {
                    pinnedServersList.add(token);
                }
            }
            proxy.setPinnedServers(pinnedServersList);
        }
    }
    OMAttribute startOnLoad = elem.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "startOnLoad"));
    if (startOnLoad != null) {
        proxy.setStartOnLoad(Boolean.valueOf(startOnLoad.getAttributeValue()));
    } else {
        proxy.setStartOnLoad(true);
    }
    OMAttribute serviceGroup = elem.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "serviceGroup"));
    if (serviceGroup != null) {
        proxy.setServiceGroup(serviceGroup.getAttributeValue());
    }
    // setting the description of the proxy service
    OMElement descriptionElement = elem.getFirstChildWithName(new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "description"));
    if (descriptionElement != null) {
        proxy.setDescription(descriptionElement.getText().trim());
    }
    // read definition of the target of this proxy service. The target could be an 'endpoint'
    // or a named sequence. If none of these are specified, the messages would be mediated
    // by the Synapse main mediator
    OMElement target = elem.getFirstChildWithName(new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "target"));
    if (target != null) {
        boolean isTargetOk = false;
        SequenceMediatorFactory mediatorFactory = new SequenceMediatorFactory();
        OMAttribute inSequence = target.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "inSequence"));
        if (inSequence != null) {
            proxy.setTargetInSequence(inSequence.getAttributeValue());
            isTargetOk = true;
        } else {
            OMElement inSequenceElement = target.getFirstChildWithName(new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "inSequence"));
            if (inSequenceElement != null) {
                SequenceMediator inSequenceMediator = mediatorFactory.createAnonymousSequence(inSequenceElement, properties);
                inSequenceMediator.setSequenceType(SequenceType.PROXY_INSEQ);
                proxy.setTargetInLineInSequence(inSequenceMediator);
                isTargetOk = true;
            }
        }
        OMAttribute outSequence = target.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "outSequence"));
        if (outSequence != null) {
            proxy.setTargetOutSequence(outSequence.getAttributeValue());
        } else {
            OMElement outSequenceElement = target.getFirstChildWithName(new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "outSequence"));
            if (outSequenceElement != null) {
                SequenceMediator outSequenceMediator = mediatorFactory.createAnonymousSequence(outSequenceElement, properties);
                outSequenceMediator.setSequenceType(SequenceType.PROXY_OUTSEQ);
                proxy.setTargetInLineOutSequence(outSequenceMediator);
            }
        }
        OMAttribute faultSequence = target.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "faultSequence"));
        if (faultSequence != null) {
            proxy.setTargetFaultSequence(faultSequence.getAttributeValue());
        } else {
            OMElement faultSequenceElement = target.getFirstChildWithName(new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "faultSequence"));
            if (faultSequenceElement != null) {
                SequenceMediator faultSequenceMediator = mediatorFactory.createAnonymousSequence(faultSequenceElement, properties);
                faultSequenceMediator.setSequenceType(SequenceType.PROXY_FAULTSEQ);
                proxy.setTargetInLineFaultSequence(faultSequenceMediator);
            }
        }
        OMAttribute tgtEndpt = target.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "endpoint"));
        if (tgtEndpt != null) {
            proxy.setTargetEndpoint(tgtEndpt.getAttributeValue());
            isTargetOk = true;
        } else {
            OMElement endpointElement = target.getFirstChildWithName(new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "endpoint"));
            if (endpointElement != null) {
                proxy.setTargetInLineEndpoint(EndpointFactory.getEndpointFromElement(endpointElement, true, properties));
                isTargetOk = true;
            }
        }
        if (!isTargetOk) {
            handleException("Target of the proxy service must declare " + "either an inSequence or endpoint or both");
        }
    } else {
        handleException("Target is required for a Proxy service definition");
    }
    // read the WSDL, Schemas and Policies and set to the proxy service
    OMElement wsdl = elem.getFirstChildWithName(new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "publishWSDL"));
    if (wsdl != null) {
        OMAttribute wsdlEndpoint = wsdl.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "endpoint"));
        OMAttribute wsdlKey = wsdl.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "key"));
        OMAttribute preservePolicy = wsdl.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "preservePolicy"));
        if (preservePolicy != null) {
            proxy.setPreservePolicy(preservePolicy.getAttributeValue());
        }
        if (wsdlEndpoint != null) {
            proxy.setPublishWSDLEndpoint(wsdlEndpoint.getAttributeValue());
        } else if (wsdlKey != null) {
            proxy.setWSDLKey(wsdlKey.getAttributeValue());
        } else {
            OMAttribute wsdlURI = wsdl.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "uri"));
            if (wsdlURI != null) {
                try {
                    proxy.setWsdlURI(new URI(wsdlURI.getAttributeValue()));
                } catch (URISyntaxException e) {
                    String msg = "Error creating uri for proxy service wsdl";
                    log.error(msg);
                    handleException(msg, e);
                }
            } else {
                OMElement wsdl11 = wsdl.getFirstChildWithName(new QName(WSDLConstants.WSDL1_1_NAMESPACE, "definitions"));
                if (wsdl11 != null) {
                    proxy.setInLineWSDL(wsdl11);
                } else {
                    OMElement wsdl20 = wsdl.getFirstChildWithName(new QName(WSDL2Constants.WSDL_NAMESPACE, "description"));
                    if (wsdl20 != null) {
                        proxy.setInLineWSDL(wsdl20);
                    }
                }
            }
        }
        proxy.setResourceMap(ResourceMapFactory.createResourceMap(wsdl));
    }
    Iterator policies = elem.getChildrenWithName(new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "policy"));
    while (policies.hasNext()) {
        Object o = policies.next();
        if (o instanceof OMElement) {
            OMElement policy = (OMElement) o;
            OMAttribute key = policy.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "key"));
            OMAttribute type = policy.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "type"));
            OMAttribute operationName = policy.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "operationName"));
            OMAttribute operationNS = policy.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "operationNamespace"));
            if (key != null) {
                PolicyInfo pi = new PolicyInfo(key.getAttributeValue());
                if (type != null && type.getAttributeValue() != null) {
                    if ("in".equals(type.getAttributeValue())) {
                        pi.setType(PolicyInfo.MESSAGE_TYPE_IN);
                    } else if ("out".equals(type.getAttributeValue())) {
                        pi.setType(PolicyInfo.MESSAGE_TYPE_OUT);
                    } else {
                        handleException("Undefined policy type for the policy with key : " + key.getAttributeValue());
                    }
                }
                if (operationName != null && operationName.getAttributeValue() != null) {
                    if (operationNS != null && operationNS.getAttributeValue() != null) {
                        pi.setOperation(new QName(operationNS.getAttributeValue(), operationName.getAttributeValue()));
                    } else {
                        pi.setOperation(new QName(operationName.getAttributeValue()));
                    }
                }
                proxy.addPolicyInfo(pi);
            } else {
                handleException("Policy element does not specify the policy key");
            }
        } else {
            handleException("Invalid 'policy' element found under element 'policies'");
        }
    }
    String nameString = proxy.getName();
    if (nameString == null || "".equals(nameString)) {
        nameString = SynapseConstants.ANONYMOUS_PROXYSERVICE;
    }
    AspectConfiguration aspectConfiguration = new AspectConfiguration(nameString);
    proxy.configure(aspectConfiguration);
    OMAttribute statistics = elem.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, XMLConfigConstants.STATISTICS_ATTRIB_NAME));
    if (statistics != null) {
        String statisticsValue = statistics.getAttributeValue();
        if (statisticsValue != null) {
            if (XMLConfigConstants.STATISTICS_ENABLE.equals(statisticsValue)) {
                aspectConfiguration.enableStatistics();
            }
        }
    }
    OMAttribute tracing = elem.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, XMLConfigConstants.TRACE_ATTRIB_NAME));
    if (tracing != null) {
        String tracingValue = tracing.getAttributeValue();
        if (tracingValue != null) {
            if (XMLConfigConstants.TRACE_ENABLE.equals(tracingValue)) {
                aspectConfiguration.enableTracing();
            }
        }
    }
    Iterator props = elem.getChildrenWithName(new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "parameter"));
    while (props.hasNext()) {
        Object o = props.next();
        if (o instanceof OMElement) {
            OMElement prop = (OMElement) o;
            OMAttribute pname = prop.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "name"));
            OMElement propertyValue = prop.getFirstElement();
            if (pname != null) {
                if (propertyValue != null) {
                    proxy.addParameter(pname.getAttributeValue(), propertyValue);
                } else {
                    proxy.addParameter(pname.getAttributeValue(), prop.getText().trim());
                }
            } else {
                handleException("Invalid property specified for proxy service : " + name);
            }
        } else {
            handleException("Invalid property specified for proxy service : " + name);
        }
    }
    if (elem.getFirstChildWithName(new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "enableAddressing")) != null) {
        proxy.setWsAddrEnabled(true);
    }
    if (elem.getFirstChildWithName(new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "enableSec")) != null) {
        proxy.setWsSecEnabled(true);
    }
    return proxy;
}
Also used : QName(javax.xml.namespace.QName) ArrayList(java.util.ArrayList) PolicyInfo(org.apache.synapse.util.PolicyInfo) OMElement(org.apache.axiom.om.OMElement) URISyntaxException(java.net.URISyntaxException) AspectConfiguration(org.apache.synapse.aspects.AspectConfiguration) URI(java.net.URI) StringTokenizer(java.util.StringTokenizer) ProxyService(org.apache.synapse.core.axis2.ProxyService) Iterator(java.util.Iterator) SequenceMediator(org.apache.synapse.mediators.base.SequenceMediator) OMAttribute(org.apache.axiom.om.OMAttribute)

Aggregations

PolicyInfo (org.apache.synapse.util.PolicyInfo)3 URI (java.net.URI)2 ArrayList (java.util.ArrayList)2 OMElement (org.apache.axiom.om.OMElement)2 Endpoint (org.apache.synapse.endpoints.Endpoint)2 SequenceMediator (org.apache.synapse.mediators.base.SequenceMediator)2 ByteArrayInputStream (java.io.ByteArrayInputStream)1 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 MalformedURLException (java.net.MalformedURLException)1 URISyntaxException (java.net.URISyntaxException)1 URL (java.net.URL)1 Iterator (java.util.Iterator)1 List (java.util.List)1 StringTokenizer (java.util.StringTokenizer)1 QName (javax.xml.namespace.QName)1 XMLStreamException (javax.xml.stream.XMLStreamException)1 OMAttribute (org.apache.axiom.om.OMAttribute)1 OMNamespace (org.apache.axiom.om.OMNamespace)1