public AxisService populateService()

in modules/kernel/src/org/apache/axis2/deployment/ServiceBuilder.java [84:448]


    public AxisService populateService(OMElement service_element)
            throws DeploymentException {
        try {
            // Determine whether service should be activated.
            String serviceActivate = service_element
                    .getAttributeValue(new QName(ATTRIBUTE_ACTIVATE));
            if (serviceActivate != null) {
                if ("true".equals(serviceActivate)) {
                    service.setActive(true);
                } else if ("false".equals(serviceActivate)) {
                    service.setActive(false);
                }
            }

            // Processing service level parameters
            OMAttribute serviceNameatt = service_element
                    .getAttribute(new QName(ATTRIBUTE_NAME));

            // If the service name is explicitly specified in the services.xml
            // then use that as the service name
            if (serviceNameatt != null) {
                if (!"".equals(serviceNameatt.getAttributeValue().trim())) {
                    AxisService wsdlService = wsdlServiceMap
                            .get(serviceNameatt.getAttributeValue());
                    if (wsdlService != null) {
                        wsdlService.setClassLoader(service.getClassLoader());
                        wsdlService.setParent(service.getAxisServiceGroup());
                        service = wsdlService;
                        service.setWsdlFound(true);
                        service.setCustomWsdl(true);
                    }
                    service.setName(serviceNameatt.getAttributeValue());
                    // To be on the safe side
                    if (service.getDocumentation() == null) {
                        service.setDocumentation(serviceNameatt
                                .getAttributeValue());
                    }
                }
            }

            Iterator<OMElement> itr = service_element.getChildrenWithName(new QName(
                    TAG_PARAMETER));
            processParameters(itr, service, service.getParent());

            Parameter childFirstClassLoading =
                    service.getParameter(Constants.Configuration.ENABLE_CHILD_FIRST_CLASS_LOADING);
            if (childFirstClassLoading != null) {
                ClassLoader cl = service.getClassLoader();
                if (cl instanceof DeploymentClassLoader) {
                    DeploymentClassLoader deploymentClassLoader = (DeploymentClassLoader) cl;
                    if (JavaUtils.isTrueExplicitly(childFirstClassLoading.getValue())){
                        deploymentClassLoader.setChildFirstClassLoading(true);
                    } else if (JavaUtils.isFalseExplicitly(childFirstClassLoading.getValue())){
                        deploymentClassLoader.setChildFirstClassLoading(false);
                    }
                }
            }

            // If multiple services in one service group have different values
            // for the PARENT_FIRST
            // parameter then the final value become the value specified by the
            // last service in the group
            // Parameter parameter =
            // service.getParameter(DeploymentClassLoader.PARENT_FIRST);
            // if (parameter !=null && "false".equals(parameter.getValue())) {
            // ClassLoader serviceClassLoader = service.getClassLoader();
            // ((DeploymentClassLoader)serviceClassLoader).setParentFirst(false);
            // }
            // process service description
            OMElement descriptionElement = service_element
                    .getFirstChildWithName(new QName(TAG_DESCRIPTION));
            if (descriptionElement == null) {
                descriptionElement = service_element.getFirstChildWithName(new QName(TAG_DESCRIPTION_ALT));
            }
            if (descriptionElement != null) {
                OMElement descriptionValue = descriptionElement
                        .getFirstElement();
                if (descriptionValue != null) {
                    service.setDocumentation(descriptionValue);
                } else {
                    service.setDocumentation(descriptionElement.getText());
                }
            } else {
                serviceNameatt = service_element.getAttribute(new QName(
                        ATTRIBUTE_NAME));

                if (serviceNameatt != null) {
                    if (!"".equals(serviceNameatt.getAttributeValue().trim())
                            && service.getDocumentation() == null) {
                        service.setDocumentation(serviceNameatt
                                .getAttributeValue());
                    }
                }
            }

            if (service.getParameter("ServiceClass") == null) {
                log.debug("The Service " + service.getName()
                        + " does not specify a Service Class");
            }

            // Process WS-Addressing flag attribute
            OMAttribute addressingRequiredatt = service_element
                    .getAttribute(new QName(ATTRIBUTE_WSADDRESSING));
            if (addressingRequiredatt != null) {
                String addressingRequiredString = addressingRequiredatt
                        .getAttributeValue();
                AddressingHelper.setAddressingRequirementParemeterValue(
                        service, addressingRequiredString);
            }

            // Setting service target namespace if any
            OMAttribute targetNameSpace = service_element
                    .getAttribute(new QName(TARGET_NAME_SPACE));

            if (targetNameSpace != null) {
                String nameSpeceVale = targetNameSpace.getAttributeValue();
                if (nameSpeceVale != null && !"".equals(nameSpeceVale)) {
                    service.setTargetNamespace(nameSpeceVale);
                }
            } else {
                if (service.getTargetNamespace() == null
                        || "".equals(service.getTargetNamespace())) {
                    service
                            .setTargetNamespace(Java2WSDLConstants.DEFAULT_TARGET_NAMESPACE);
                }
            }

            // Processing service lifecycle attribute
            OMAttribute serviceLifeCycleClass = service_element
                    .getAttribute(new QName(TAG_CLASS_NAME));
            if (serviceLifeCycleClass != null) {
                String className = serviceLifeCycleClass.getAttributeValue();
                loadServiceLifeCycleClass(className);
            }
            // Setting schema namespece if any
            OMElement schemaElement = service_element
                    .getFirstChildWithName(new QName(SCHEMA));
            if (schemaElement != null) {
                OMAttribute schemaNameSpace = schemaElement
                        .getAttribute(new QName(SCHEMA_NAME_SPACE));
                if (schemaNameSpace != null) {
                    String nameSpeceVale = schemaNameSpace.getAttributeValue();
                    if (nameSpeceVale != null && !"".equals(nameSpeceVale)) {
                        service.setSchemaTargetNamespace(nameSpeceVale);
                    }
                }
                OMAttribute elementFormDefault = schemaElement
                        .getAttribute(new QName(SCHEMA_ELEMENT_QUALIFIED));
                if (elementFormDefault != null) {
                    String value = elementFormDefault.getAttributeValue();
                    if ("true".equals(value)) {
                        service.setElementFormDefault(true);
                    } else if ("false".equals(value)) {
                        service.setElementFormDefault(false);
                    }
                }

                // package to namespace mapping. This will be an element that
                // maps pkg names to a namespace
                // when this is doing AxisService.getSchemaTargetNamespace will
                // be overridden
                // This will be <mapping/> with @namespace and @package
                Iterator<OMElement> mappingIterator = schemaElement
                        .getChildrenWithName(new QName(MAPPING));
                if (mappingIterator != null) {
                    Map<String,String> pkg2nsMap = new Hashtable<String,String>();
                    while (mappingIterator.hasNext()) {
                        OMElement mappingElement = mappingIterator.next();
                        OMAttribute namespaceAttribute = mappingElement
                                .getAttribute(new QName(ATTRIBUTE_NAMESPACE));
                        OMAttribute packageAttribute = mappingElement
                                .getAttribute(new QName(ATTRIBUTE_PACKAGE));
                        if (namespaceAttribute != null
                                && packageAttribute != null) {
                            String namespaceAttributeValue = namespaceAttribute
                                    .getAttributeValue();
                            String packageAttributeValue = packageAttribute
                                    .getAttributeValue();
                            if (namespaceAttributeValue != null
                                    && packageAttributeValue != null) {
                                pkg2nsMap.put(packageAttributeValue.trim(),
                                        namespaceAttributeValue.trim());
                            } else {
                                log
                                        .warn("Either value of @namespce or @packagename not available. Thus, generated will be selected.");
                            }
                        } else {
                            log
                                    .warn("Either @namespce or @packagename not available. Thus, generated will be selected.");
                        }
                    }
                    service.setP2nMap(pkg2nsMap);

                }

            }

            // processing Default Message receivers
            OMElement messageReceiver = service_element
                    .getFirstChildWithName(new QName(TAG_MESSAGE_RECEIVERS));
            if (messageReceiver != null) {
                HashMap<String,MessageReceiver> mrs = processMessageReceivers(service.getClassLoader(),
                        messageReceiver);
                for (Map.Entry<String,MessageReceiver> entry : mrs.entrySet()) {
                    service.addMessageReceiver(entry.getKey(), entry.getValue());
                }
            }

            // Removing exclude operations
            OMElement excludeOperations = service_element
                    .getFirstChildWithName(new QName(TAG_EXCLUDE_OPERATIONS));
            ArrayList<String> excludeops = null;
            if (excludeOperations != null) {
                excludeops = processExcludeOperations(excludeOperations);
            }
            if (excludeops == null) {
                excludeops = new ArrayList<String>();
            }
            Utils.addExcludeMethods(excludeops);

            // <schema targetNamespace="http://x.y.z"/>
            // setting the PolicyInclude
            // processing <wsp:Policy> .. </..> elements
            Iterator policyElements = PolicyUtil.getPolicyChildren(service_element);

            if (policyElements != null && policyElements.hasNext()) {
                processPolicyElements(policyElements, service.getPolicySubject());
            }

            // processing <wsp:PolicyReference> .. </..> elements
            Iterator policyRefElements = PolicyUtil.getPolicyRefChildren(service_element);

            if (policyRefElements != null && policyRefElements.hasNext()) {
                processPolicyRefElements(policyRefElements, service.getPolicySubject());
            }

            // processing service scope
            String sessionScope = service_element.getAttributeValue(new QName(
                    ATTRIBUTE_SCOPE));
            if (sessionScope != null) {
                service.setScope(sessionScope);
            }

            // processing service-wide modules which required to engage globally
            Iterator<OMElement> moduleRefs = service_element
                    .getChildrenWithName(new QName(TAG_MODULE));

            processModuleRefs(moduleRefs);

            // processing transports
            OMElement transports = service_element
                    .getFirstChildWithName(new QName(TAG_TRANSPORTS));
            if (transports != null) {
                Iterator<OMElement> transport_itr = transports
                        .getChildrenWithName(new QName(TAG_TRANSPORT));
                ArrayList<String> trs = new ArrayList<String>();
                while (transport_itr.hasNext()) {
                    OMElement trsEle = transport_itr.next();
                    String transportName = trsEle.getText().trim();
                    if (axisConfig.getTransportIn(transportName) == null) {
                        log.warn("Service [ " + service.getName()
                                + "] is trying to expose in a transport : "
                                + transportName
                                + " and which is not available in Axis2");
                    } else {
                        trs.add(transportName);
                    }
                }

                if(trs.isEmpty()){
                    throw new AxisFault("Service [" + service.getName()
                        + "] is trying expose in tranpsorts: "
                        + transports
                        + " and which is/are not available in Axis2");
                }
                service.setExposedTransports(trs);
            }
            // processing operations
            Iterator<OMElement> operationsIterator = service_element
                    .getChildrenWithName(new QName(TAG_OPERATION));
            ArrayList ops = processOperations(operationsIterator);

            for (int i = 0; i < ops.size(); i++) {
                AxisOperation operationDesc = (AxisOperation) ops.get(i);
                ArrayList wsamappings = operationDesc.getWSAMappingList();
                if (wsamappings == null) {
                    continue;
                }
                if (service.getOperation(operationDesc.getName()) == null) {
                    service.addOperation(operationDesc);
                }
                for (int j = 0; j < wsamappings.size(); j++) {
                    String mapping = (String) wsamappings.get(j);
                    if (mapping.length() > 0) {
                        service.mapActionToOperation(mapping, operationDesc);
                    }
                }
            }
            String objectSupplierValue = (String) service
                    .getParameterValue(TAG_OBJECT_SUPPLIER);
            if (objectSupplierValue != null) {
                loadObjectSupplierClass(objectSupplierValue);
            }
            // Set the default message receiver for the operations that were
            // not listed in the services.xml
            setDefaultMessageReceivers();
            Utils.processBeanPropertyExclude(service);
            if (!service.isUseUserWSDL()) {
                // Generating schema for the service if the impl class is Java
                if (!service.isWsdlFound()) {
                    // trying to generate WSDL for the service using JAM and
                    // Java reflection
                    try {
                        if (generateWsdl(service)) {
                            Utils.fillAxisService(service, axisConfig,
                                    excludeops, null);
                        } else {
                            ArrayList nonRpcOperations = getNonRPCMethods(service);
                            Utils.fillAxisService(service, axisConfig,
                                    excludeops, nonRpcOperations);
                        }
                    } catch (Exception e) {
                        throw new DeploymentException(Messages.getMessage(
                                "errorinschemagen", e.getMessage()), e);
                    }
                }
            }
            if (service.isCustomWsdl()) {
                OMElement mappingElement = service_element
                        .getFirstChildWithName(new QName(TAG_PACKAGE2QNAME));
                if (mappingElement != null) {
                    processTypeMappings(mappingElement);
                }
            }

            for (String opName : excludeops) {
                service.removeOperation(new QName(opName));
                service.addExcludeOperationName(opName);
            }

            // Need to call the same logic towice
            setDefaultMessageReceivers();
            Iterator<OMElement> moduleConfigs = service_element
                    .getChildrenWithName(new QName(TAG_MODULE_CONFIG));
            processServiceModuleConfig(moduleConfigs, service, service);

            // Loading Data Locator(s) configured
            OMElement dataLocatorElement = service_element
                    .getFirstChildWithName(new QName(
                            DRConstants.DATA_LOCATOR_ELEMENT));
            if (dataLocatorElement != null) {
                processDataLocatorConfig(dataLocatorElement, service);
            }

            processEndpoints(service);
            processPolicyAttachments(service_element, service);
            

        } catch (AxisFault axisFault) {
            throw new DeploymentException(axisFault);
        }

        startupServiceLifecycle();
        return service;
    }