blob: fbfdd06038087fa3a139b92314e324c44c7383ab [file] [log] [blame]
/**
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed 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.axis2.deployment;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.deployment.util.PhasesInfo;
import org.apache.axis2.deployment.util.Utils;
import org.apache.axis2.description.*;
import org.apache.axis2.engine.MessageReceiver;
import org.apache.axis2.engine.ObjectSupplier;
import org.apache.axis2.engine.ServiceLifeCycle;
import org.apache.axis2.i18n.Messages;
import org.apache.axis2.util.Loader;
import org.apache.axis2.wsdl.WSDLConstants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ws.java2wsdl.Java2WSDLConstants;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.*;
/**
* Builds a service description from OM
*/
public class ServiceBuilder extends DescriptionBuilder {
private static final Log log = LogFactory.getLog(ServiceBuilder.class);
private AxisService service;
public ServiceBuilder(ConfigurationContext configCtx, AxisService service) {
this.service = service;
this.configCtx = configCtx;
this.axisConfig = this.configCtx.getAxisConfiguration();
}
public ServiceBuilder(InputStream serviceInputStream, ConfigurationContext configCtx,
AxisService service) {
super(serviceInputStream, configCtx);
this.service = service;
}
/**
* Populates service from corresponding OM.
*/
public AxisService populateService(OMElement service_element) throws DeploymentException {
try {
// Processing service level parameters
Iterator itr = service_element.getChildrenWithName(new QName(TAG_PARAMETER));
processParameters(itr, service, service.getParent());
// process service description
OMElement descriptionElement =
service_element.getFirstChildWithName(new QName(TAG_DESCRIPTION));
if (descriptionElement != null) {
OMElement descriptionValue = descriptionElement.getFirstElement();
if (descriptionValue != null) {
StringWriter writer = new StringWriter();
descriptionValue.build();
descriptionValue.serialize(writer);
writer.flush();
service.setServiceDescription(writer.toString());
} else {
service.setServiceDescription(descriptionElement.getText());
}
} else {
OMAttribute serviceNameatt = service_element.getAttribute(new QName(ATTRIBUTE_NAME));
if (serviceNameatt != null) {
if (!"".equals(serviceNameatt.getAttributeValue().trim())) {
service.setServiceDescription(serviceNameatt.getAttributeValue());
}
}
}
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())) {
service.setName(serviceNameatt.getAttributeValue());
// To be on the safe side
if (service.getServiceDescription() == null) {
service.setServiceDescription(serviceNameatt.getAttributeValue());
}
}
}
if (service.getParameter("ServiceClass") == null){
log.info("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();
service.setWSAddressingFlag(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 mappingIterator = schemaElement.getChildrenWithName(new QName(MAPPING));
if (mappingIterator != null) {
Map pkg2nsMap = new Hashtable();
while (mappingIterator.hasNext()) {
OMElement mappingElement = (OMElement) 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 mrs = processMessageReceivers(service.getClassLoader(), messageReceiver);
Iterator keys = mrs.keySet().iterator();
while (keys.hasNext()) {
String key = (String) keys.next();
service.addMessageReceiver(key, (MessageReceiver) mrs.get(key));
}
}
//Removing exclude operations
OMElement excludeOperations = service_element.getFirstChildWithName(
new QName(TAG_EXCLUDE_OPERATIONS));
ArrayList excludeops = null;
if (excludeOperations != null) {
excludeops = processExcludeOperations(excludeOperations);
}
if (excludeops == null) {
excludeops = new ArrayList();
}
excludeops.add("init");
excludeops.add("setOperationContext");
excludeops.add("startUp");
excludeops.add("destroy");
//<schema targetNamespace="http://x.y.z"/>
// setting the PolicyInclude
// processing <wsp:Policy> .. </..> elements
Iterator policyElements = service_element.getChildrenWithName(
new QName(POLICY_NS_URI, TAG_POLICY));
if (policyElements != null && policyElements.hasNext()) {
processPolicyElements(
PolicyInclude.AXIS_SERVICE_POLICY, policyElements,
service.getPolicyInclude());
}
// processing <wsp:PolicyReference> .. </..> elements
Iterator policyRefElements = service_element.getChildrenWithName(
new QName(POLICY_NS_URI, TAG_POLICY_REF));
if (policyRefElements != null && policyRefElements.hasNext()) {
processPolicyRefElements(PolicyInclude.AXIS_SERVICE_POLICY,
policyRefElements, service.getPolicyInclude());
}
//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 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 transport_itr = transports.getChildrenWithName(new QName(TAG_TRANSPORT));
ArrayList trs = new ArrayList();
while (transport_itr.hasNext()) {
OMElement trsEle = (OMElement) transport_itr.next();
trs.add(trsEle.getText());
}
service.setExposedTransports(trs);
}
// processing operations
Iterator 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);
}
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);
} else {
ArrayList nonRpcOperations = getNonPRCMethods(service);
for (int i = 0; i < excludeops.size(); i++) {
String opName = (String) excludeops.get(i);
nonRpcOperations.add(opName);
Utils.fillAxisService(service, axisConfig, nonRpcOperations);
}
}
} catch (Exception e) {
throw new DeploymentException(
Messages.getMessage("errorinschemagen", e.getMessage()), e);
}
}
}
for (int i = 0; i < excludeops.size(); i++) {
String opName = (String) excludeops.get(i);
service.removeOperation(new QName(opName));
}
// Set the default message receiver for the operations that were
// not listed in the services.xml
Iterator operations = service.getPublishedOperations().iterator();
while (operations.hasNext()) {
AxisOperation operation = (AxisOperation) operations.next();
if (operation.getMessageReceiver() == null) {
operation.setMessageReceiver(loadDefaultMessageReceiver(
operation.getMessageExchangePattern(), service));
}
}
Iterator moduleConfigs = service_element.getChildrenWithName(new QName(TAG_MODULE_CONFIG));
processServiceModuleConfig(moduleConfigs, service, service);
} catch (XMLStreamException e) {
throw new DeploymentException(e);
} catch (AxisFault axisFault) {
throw new DeploymentException(
Messages.getMessage(
DeploymentErrorMsgs.OPERATION_PROCESS_ERROR, axisFault.getMessage()), axisFault);
}
return service;
}
private void loadObjectSupplierClass(String objectSupplierValue) throws AxisFault {
try {
ClassLoader loader = service.getClassLoader();
Class objectSupplierImpl = Loader.loadClass(loader, objectSupplierValue.trim());
ObjectSupplier objectSupplier = (ObjectSupplier) objectSupplierImpl.newInstance();
service.setObjectSupplier(
objectSupplier);
} catch (Exception e) {
throw new AxisFault(e);
}
}
private void loadServiceLifeCycleClass(String className) throws DeploymentException {
if (className != null) {
try {
ClassLoader loader = service.getClassLoader();
Class serviceLifeCycleClassImpl = Loader.loadClass(loader, className);
ServiceLifeCycle serviceLifeCycle = (ServiceLifeCycle) serviceLifeCycleClassImpl.newInstance();
serviceLifeCycle.startUp(configCtx, service);
service.setServiceLifeCycle(
serviceLifeCycle);
} catch (Exception e) {
throw new DeploymentException(e.getMessage(), e);
}
}
}
private boolean generateWsdl(AxisService axisService) {
Iterator operatins = axisService.getOperations();
if (operatins.hasNext()) {
while (operatins.hasNext()) {
AxisOperation axisOperation = (AxisOperation) operatins
.next();
if (axisOperation.getMessageReceiver() == null) {
continue;
}
String messageReceiverClass = axisOperation
.getMessageReceiver().getClass().getName();
if (!("org.apache.axis2.rpc.receivers.RPCMessageReceiver"
.equals(messageReceiverClass)
|| "org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"
.equals(messageReceiverClass)
|| "org.apache.axis2.rpc.receivers.RPCInOutAsyncMessageReceiver"
.equals(messageReceiverClass))) {
return false;
}
}
}
return true;
}
/**
* To get the methods which dose not use RPC* Message Recievers
*
* @return ArrayList
*/
private ArrayList getNonPRCMethods(AxisService axisService) {
ArrayList excludeOperations = new ArrayList();
Iterator operatins = axisService.getOperations();
if (operatins.hasNext()) {
while (operatins.hasNext()) {
AxisOperation axisOperation = (AxisOperation) operatins
.next();
if (axisOperation.getMessageReceiver() == null) {
continue;
}
String messageReceiverClass = axisOperation
.getMessageReceiver().getClass().getName();
if (!("org.apache.axis2.rpc.receivers.RPCMessageReceiver"
.equals(messageReceiverClass)
|| "org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"
.equals(messageReceiverClass)
|| "org.apache.axis2.rpc.receivers.RPCInOutAsyncMessageReceiver"
.equals(messageReceiverClass))) {
excludeOperations.add(axisOperation.getName().getLocalPart());
}
}
}
return excludeOperations;
}
/**
* If there is <excludeOperations>
* <operation>foo</operation>
* </excludeOperations>
* <p/>
* Then the operation object will be removed from the AxisService , so that
* the operation wont be exposed
*
* @param exculeOperations
*/
private ArrayList processExcludeOperations(OMElement exculeOperations) {
ArrayList exOps = new ArrayList();
Iterator excludeOp_itr = exculeOperations.getChildrenWithName(new QName(TAG_OPERATION));
while (excludeOp_itr.hasNext()) {
OMElement opName = (OMElement) excludeOp_itr.next();
exOps.add(opName.getText().trim());
// service.removeOperation(new QName(opName.getText().trim()));
}
return exOps;
}
private void processMessages(Iterator messages, AxisOperation operation)
throws DeploymentException {
while (messages.hasNext()) {
OMElement messageElement = (OMElement) messages.next();
OMAttribute label = messageElement.getAttribute(new QName(TAG_LABEL));
if (label == null) {
throw new DeploymentException(Messages.getMessage("messagelabelcannotfound"));
}
AxisMessage message = operation.getMessage(label.getAttributeValue());
Iterator parameters = messageElement.getChildrenWithName(new QName(TAG_PARAMETER));
// processing <wsp:Policy> .. </..> elements
Iterator policyElements = messageElement.getChildrenWithName(new QName(POLICY_NS_URI, TAG_POLICY));
if (policyElements != null) {
processPolicyElements(PolicyInclude.AXIS_MESSAGE_POLICY, policyElements, message.getPolicyInclude());
}
// processing <wsp:PolicyReference> .. </..> elements
Iterator policyRefElements = messageElement.getChildrenWithName(new QName(POLICY_NS_URI, TAG_POLICY_REF));
if (policyRefElements != null) {
processPolicyRefElements(PolicyInclude.AXIS_MESSAGE_POLICY, policyRefElements, message.getPolicyInclude());
}
processParameters(parameters, message, operation);
}
}
/**
* Gets the list of modules that is required to be engaged globally.
*
* @param moduleRefs <code>java.util.Iterator</code>
* @throws DeploymentException <code>DeploymentException</code>
*/
protected void processModuleRefs(Iterator moduleRefs) throws DeploymentException {
try {
while (moduleRefs.hasNext()) {
OMElement moduleref = (OMElement) moduleRefs.next();
OMAttribute moduleRefAttribute = moduleref.getAttribute(new QName(TAG_REFERENCE));
if (moduleRefAttribute != null) {
String refName = moduleRefAttribute.getAttributeValue();
if (axisConfig.getModule(new QName(refName)) == null) {
throw new DeploymentException(
Messages.getMessage(DeploymentErrorMsgs.MODULE_NOT_FOUND, refName));
} else {
service.addModuleref(new QName(refName));
}
}
}
} catch (AxisFault axisFault) {
throw new DeploymentException(axisFault);
}
}
protected void processOperationModuleConfig(Iterator moduleConfigs, ParameterInclude parent,
AxisOperation operation)
throws DeploymentException {
while (moduleConfigs.hasNext()) {
OMElement moduleConfig = (OMElement) moduleConfigs.next();
OMAttribute moduleName_att = moduleConfig.getAttribute(new QName(ATTRIBUTE_NAME));
if (moduleName_att == null) {
throw new DeploymentException(
Messages.getMessage(DeploymentErrorMsgs.INVALID_MODULE_CONFIG));
} else {
String module = moduleName_att.getAttributeValue();
ModuleConfiguration moduleConfiguration =
new ModuleConfiguration(new QName(module), parent);
Iterator parameters = moduleConfig.getChildrenWithName(new QName(TAG_PARAMETER));
processParameters(parameters, moduleConfiguration, parent);
operation.addModuleConfig(moduleConfiguration);
}
}
}
private ArrayList processOperations(Iterator operationsIterator) throws AxisFault {
ArrayList operations = new ArrayList();
while (operationsIterator.hasNext()) {
OMElement operation = (OMElement) operationsIterator.next();
//getting operation name
OMAttribute op_name_att = operation.getAttribute(new QName(ATTRIBUTE_NAME));
if (op_name_att == null) {
throw new DeploymentException(
Messages.getMessage(
Messages.getMessage(
DeploymentErrorMsgs.INVALID_OP, "operation name missing")));
}
// setting the MEP of the operation
OMAttribute op_mep_att = operation.getAttribute(new QName(TAG_MEP));
String mepurl = null;
if (op_mep_att != null) {
mepurl = op_mep_att.getAttributeValue();
}
String opname = op_name_att.getAttributeValue();
AxisOperation op_descrip;
op_descrip = service.getOperation(new QName(opname));
if (op_descrip == null) {
if (mepurl == null) {
// assumed MEP is in-out
op_descrip = new InOutAxisOperation();
op_descrip.setParent(service);
} else {
op_descrip = AxisOperationFactory.getOperationDescription(mepurl);
}
op_descrip.setName(new QName(opname));
String MEP = op_descrip.getMessageExchangePattern();
if (WSDLConstants.WSDL20_2004Constants.MEP_URI_IN_ONLY.equals(MEP) ||
WSDLConstants.WSDL20_2004Constants.MEP_URI_IN_OPTIONAL_OUT.equals(MEP) ||
WSDLConstants.WSDL20_2004Constants.MEP_URI_OUT_OPTIONAL_IN.equals(MEP) ||
WSDLConstants.WSDL20_2004Constants.MEP_URI_ROBUST_OUT_ONLY.equals(MEP) ||
WSDLConstants.WSDL20_2004Constants.MEP_URI_ROBUST_IN_ONLY.equals(MEP) ||
WSDLConstants.WSDL20_2004Constants.MEP_URI_IN_OUT.equals(MEP)) {
AxisMessage inaxisMessage = op_descrip
.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
if (inaxisMessage != null) {
inaxisMessage.setName(opname + Java2WSDLConstants.MESSAGE_SUFFIX);
}
}
if (WSDLConstants.WSDL20_2004Constants.MEP_URI_OUT_ONLY.equals(MEP) ||
WSDLConstants.WSDL20_2004Constants.MEP_URI_OUT_OPTIONAL_IN.equals(MEP) ||
WSDLConstants.WSDL20_2004Constants.MEP_URI_IN_OPTIONAL_OUT.equals(MEP) ||
WSDLConstants.WSDL20_2004Constants.MEP_URI_ROBUST_OUT_ONLY.equals(MEP) ||
WSDLConstants.WSDL20_2004Constants.MEP_URI_IN_OUT.equals(MEP)) {
AxisMessage outAxisMessage = op_descrip
.getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
if (outAxisMessage != null) {
outAxisMessage.setName(opname + Java2WSDLConstants.RESPONSE);
}
}
}
// setting the PolicyInclude
// processing <wsp:Policy> .. </..> elements
Iterator policyElements = operation.getChildrenWithName(new QName(POLICY_NS_URI, TAG_POLICY));
if (policyElements != null && policyElements.hasNext()) {
processPolicyElements(PolicyInclude.AXIS_OPERATION_POLICY, policyElements, op_descrip.getPolicyInclude());
}
// processing <wsp:PolicyReference> .. </..> elements
Iterator policyRefElements = operation.getChildrenWithName(new QName(POLICY_NS_URI, TAG_POLICY_REF));
if (policyRefElements != null && policyRefElements.hasNext()) {
processPolicyRefElements(PolicyInclude.AXIS_OPERATION_POLICY, policyRefElements, op_descrip.getPolicyInclude());
}
// Operation Parameters
Iterator parameters = operation.getChildrenWithName(new QName(TAG_PARAMETER));
processParameters(parameters, op_descrip, service);
//To process wsamapping;
processActionMappings(operation, op_descrip);
// loading the message receivers
OMElement receiverElement = operation.getFirstChildWithName(new QName(TAG_MESSAGE_RECEIVER));
if (receiverElement != null) {
MessageReceiver messageReceiver = loadMessageReceiver(service.getClassLoader(),
receiverElement);
op_descrip.setMessageReceiver(messageReceiver);
} else {
// setting default message receiver
MessageReceiver msgReceiver = loadDefaultMessageReceiver(
op_descrip.getMessageExchangePattern()
, service);
op_descrip.setMessageReceiver(msgReceiver);
}
// Process Module Refs
Iterator modules = operation.getChildrenWithName(new QName(TAG_MODULE));
processOperationModuleRefs(modules, op_descrip);
// processing Messages
Iterator messages = operation.getChildrenWithName(new QName(TAG_MESSAGE));
processMessages(messages, op_descrip);
// setting Operation phase
if (axisConfig != null) {
PhasesInfo info = axisConfig.getPhasesInfo();
info.setOperationPhases(op_descrip);
}
Iterator moduleConfigs = operation.getChildrenWithName(new QName(TAG_MODULE_CONFIG));
processOperationModuleConfig(moduleConfigs, op_descrip, op_descrip);
// adding the operation
operations.add(op_descrip);
}
return operations;
}
protected void processServiceModuleConfig(Iterator moduleConfigs, ParameterInclude parent,
AxisService service)
throws DeploymentException {
while (moduleConfigs.hasNext()) {
OMElement moduleConfig = (OMElement) moduleConfigs.next();
OMAttribute moduleName_att = moduleConfig.getAttribute(new QName(ATTRIBUTE_NAME));
if (moduleName_att == null) {
throw new DeploymentException(
Messages.getMessage(DeploymentErrorMsgs.INVALID_MODULE_CONFIG));
} else {
String module = moduleName_att.getAttributeValue();
ModuleConfiguration moduleConfiguration =
new ModuleConfiguration(new QName(module), parent);
Iterator parameters = moduleConfig.getChildrenWithName(new QName(TAG_PARAMETER));
processParameters(parameters, moduleConfiguration, parent);
service.addModuleConfig(moduleConfiguration);
}
}
}
}