/* * 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.axis2.engine; import java.io.File; import java.net.URL; import java.security.PrivilegedAction; import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArraySet; import javax.xml.namespace.QName; import org.apache.axis2.AxisFault; import org.apache.axis2.Constants; import org.apache.axis2.transaction.TransactionConfiguration; import org.apache.axis2.builder.Builder; import org.apache.axis2.builder.unknowncontent.UnknownContentBuilder; import org.apache.axis2.clustering.ClusteringAgent; import org.apache.axis2.context.MessageContext; import org.apache.axis2.dataretrieval.AxisDataLocator; import org.apache.axis2.deployment.DeploymentException; import org.apache.axis2.deployment.ModuleDeployer; import org.apache.axis2.deployment.repository.util.DeploymentFileData; import org.apache.axis2.deployment.util.PhasesInfo; import org.apache.axis2.description.AxisDescription; import org.apache.axis2.description.AxisEndpoint; import org.apache.axis2.description.AxisModule; import org.apache.axis2.description.AxisOperation; import org.apache.axis2.description.AxisService; import org.apache.axis2.description.AxisServiceGroup; import org.apache.axis2.description.ModuleConfiguration; import org.apache.axis2.description.Parameter; import org.apache.axis2.description.TransportInDescription; import org.apache.axis2.description.TransportOutDescription; import org.apache.axis2.description.Version; import org.apache.axis2.description.java2wsdl.Java2WSDLConstants; import org.apache.axis2.i18n.Messages; import org.apache.axis2.phaseresolver.PhaseMetadata; import org.apache.axis2.phaseresolver.PhaseResolver; import org.apache.axis2.transport.MessageFormatter; import org.apache.axis2.util.TargetResolver; import org.apache.axis2.util.Utils; import org.apache.axis2.util.FaultyServiceData; import org.apache.axis2.util.JavaUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Class AxisConfiguration */ public class AxisConfiguration extends AxisDescription { private static final Log log = LogFactory.getLog(AxisConfiguration.class); /* * To store configured data locators */ private HashMap<String, AxisDataLocator> dataLocators = new HashMap<String, AxisDataLocator>(); private HashMap<String, String> dataLocatorClassNames = new HashMap<String, String>(); /** * Map of all available modules. The key is the archive name as defined by * {@link AxisModule#getArchiveName()}. */ private final HashMap<String, AxisModule> allModules = new HashMap<String, AxisModule>(); // To store mapping between default version and module name private final HashMap<String, String> nameToversionMap = new HashMap<String, String>(); // private final HashMap serviceGroups = new HashMap(); private final HashMap<String, TransportInDescription> transportsIn = new HashMap<String, TransportInDescription>(); private final HashMap<String, TransportOutDescription> transportsOut = new HashMap<String, TransportOutDescription>(); private final HashMap<String, List<AxisModule>> policySupportedModules = new HashMap<String, List<AxisModule>>(); /** * Stores the QNames of local policy assertions */ private final ArrayList<QName> localPolicyAssertions = new ArrayList<QName>(); // to store AxisObserver Objects private Set<AxisObserver> observerSet = null; private URL axis2Repository = null; private Map<String, AxisService> allServices = new ConcurrentHashMap<String, AxisService>(); private Map<String, AxisService> allEndpoints = new ConcurrentHashMap<String, AxisService>(); /** * Stores the module specified in the server.xml at the document parsing time. */ private List<String> globalModuleList; private Hashtable<String, String> faultyModules; /** * To store faulty services */ private Hashtable<String, String> faultyServices; /** * To store services which have become faulty due to modules. Here key is the module name and * the corresponding value is an another map which holds the a Map of faulty services due a * single module (keyed by service name). */ private final Map<String, Map<String, FaultyServiceData>> faultyServicesDueToModules = new HashMap<String, Map<String, FaultyServiceData>>(); private List<Phase> inFaultPhases; private List<Phase> inPhasesUptoAndIncludingPostDispatch; private HashMap<String, MessageReceiver> messageReceivers; private HashMap<String, Builder> messageBuilders; private HashMap<String, MessageFormatter> messageFormatters; private ClassLoader moduleClassLoader; private HashMap<String, ModuleConfiguration> moduleConfigmap; private List<Phase> outFaultPhases; private List<Phase> outPhases; protected PhasesInfo phasesinfo; private ClassLoader serviceClassLoader; private ClassLoader systemClassLoader; //To keep track of whether the system has started or not private boolean start; private ArrayList<TargetResolver> targetResolvers; private ClusteringAgent clusteringAgent; private AxisConfigurator configurator; private TransactionConfiguration transactionConfiguration; /** * Constructor AxisConfiguration. */ public AxisConfiguration() { moduleConfigmap = new HashMap<String, ModuleConfiguration>(); globalModuleList = new ArrayList<String>(); messageReceivers = new HashMap<String, MessageReceiver>(); messageBuilders = new HashMap<String, Builder>(); messageFormatters = new HashMap<String, MessageFormatter>(); outPhases = new ArrayList<Phase>(); inFaultPhases = new ArrayList<Phase>(); outFaultPhases = new ArrayList<Phase>(); faultyServices = new Hashtable<String, String>(); faultyModules = new Hashtable<String, String>(); observerSet = new CopyOnWriteArraySet<AxisObserver>(); inPhasesUptoAndIncludingPostDispatch = new ArrayList<Phase>(); systemClassLoader = org.apache.axis2.java.security.AccessController .doPrivileged(new PrivilegedAction<ClassLoader>() { public ClassLoader run() { return Thread.currentThread().getContextClassLoader(); } }); serviceClassLoader = systemClassLoader; moduleClassLoader = systemClassLoader; this.phasesinfo = new PhasesInfo(); targetResolvers = new ArrayList<TargetResolver>(); } public void addMessageReceiver(String mepURL, MessageReceiver messageReceiver) { messageReceivers.put(mepURL, messageReceiver); } /** * Register a messageBuilder implementation against a content type. * This is used by Axis2 to support different message formats. * * @param contentType the relevant content-type (i.e. "text/xml") * @param messageBuilder a Builder implementation */ public void addMessageBuilder(String contentType, Builder messageBuilder) { messageBuilders.put(contentType, messageBuilder); } /** * Register a messageFormatter implementation against a content type. * This is used by Axis2 to support serialization of messages to different * message formats. (Eg: JSON) * * @param contentType the relevant content-type (i.e. "text/xml") * @param messageFormatter a MessageFormatter implementation */ public void addMessageFormatter(String contentType, MessageFormatter messageFormatter) { messageFormatters.put(contentType, messageFormatter); } /** * Add an available Module to this configuration * * @param module an AxisModule * @throws AxisFault in case of error */ public void addModule(AxisModule module) throws AxisFault { module.setParent(this); // check whether the module version paramter is there , if so set the module version as that Parameter versionParameter = module.getParameter(org.apache.axis2.Constants.MODULE_VERSION); if (versionParameter !=null ) { String version = (String) versionParameter.getValue(); try { module.setVersion(new Version(version)); } catch (ParseException ex) { throw new AxisFault("The version number '" + version + "' specified by the " + org.apache.axis2.Constants.MODULE_VERSION + " parameter is invalid"); } } allModules.put(module.getArchiveName(), module); notifyObservers(new AxisEvent(AxisEvent.MODULE_DEPLOY,null), module); // Registering the policy namespaces that the module understand registerModulePolicySupport(module); // Registering the policy assertions that are local to the system registerLocalPolicyAssertions(module); } public void deployModule(String moduleFileName) throws DeploymentException { File moduleFile = new File(moduleFileName); if (!moduleFile.exists()) { throw new DeploymentException("Module archive '" + moduleFileName + "' doesn't exist"); } DeploymentFileData dfd = new DeploymentFileData(moduleFile, new ModuleDeployer(this)); dfd.deploy(); } /** * Remove a module with moduleName & moduleVersion * * @param moduleName the name of the module to remove * @param moduleVersion the version of the module to remove */ public void removeModule(String moduleName, String moduleVersion) { allModules.remove(Utils.getModuleName(moduleName, moduleVersion)); // TODO disengage has to be done here } /** * Remove a module with moduleName & moduleVersion * * @param moduleName the name of the module to remove * @param moduleVersion the version of the module to remove */ public void removeModule(String moduleName, Version moduleVersion) { String version = null; if (moduleVersion != null) { version = moduleVersion.toString(); } removeModule(moduleName, version); } /** * Adds module configuration, if there is a moduleConfig tag in service. * * @param moduleConfiguration a ModuleConfiguration to remember */ public void addModuleConfig(ModuleConfiguration moduleConfiguration) { moduleConfigmap.put(moduleConfiguration.getModuleName(), moduleConfiguration); } /** * Register given AxisObserver object to the {@link AxisConfiguration}. * * @param axisObserver the axis observer */ public void addObservers(AxisObserver axisObserver) { observerSet.add(axisObserver); } /** * Unregister the given AxisObserver object if it is registered with * the {@link AxisConfiguration}. * * @param axisObserver the axis observer */ public void removeObserver(AxisObserver axisObserver) { observerSet.remove(axisObserver); } /** * Add an AxisService to our global configuration. Since services must * be in ServiceGroups, we construct an anonymous AxisServiceGroup around * the passed AxisService and then call addServiceGroup(). * * @param service an AxisService to deploy. * @throws AxisFault if something goes wrong (invalid service, service is * already deployed, etc...) */ public synchronized void addService(AxisService service) throws AxisFault { AxisServiceGroup axisServiceGroup = new AxisServiceGroup(); axisServiceGroup.setServiceGroupName(service.getName()); axisServiceGroup.setParent(this); axisServiceGroup.addService(service); addServiceGroup(axisServiceGroup); // processEndpoints(service, service.getAxisConfiguration()); } public synchronized void addServiceGroup(AxisServiceGroup axisServiceGroup) throws AxisFault { axisServiceGroup.setParent(this); notifyObservers(new AxisEvent(AxisEvent.SERVICE_DEPLOY, axisServiceGroup), axisServiceGroup); AxisService axisService; Iterator<AxisService> services = axisServiceGroup.getServices(); while (services.hasNext()) { axisService = services.next(); if (axisService.getSchemaTargetNamespace() == null) { axisService.setSchemaTargetNamespace(Java2WSDLConstants.AXIS2_XSD); } } services = axisServiceGroup.getServices(); while (services.hasNext()) { axisService = services.next(); if (axisService.isUseDefaultChains()) { Iterator<AxisOperation> operations = axisService.getOperations(); while (operations.hasNext()) { AxisOperation operation = operations.next(); phasesinfo.setOperationPhases(operation); } } } Iterator<AxisModule> enModule = getEngagedModules().iterator(); while (enModule.hasNext()) { axisServiceGroup.engageModule(enModule.next()); } services = axisServiceGroup.getServices(); ArrayList<AxisService> servicesIAdded = new ArrayList<AxisService>(); while (services.hasNext()) { axisService = services.next(); processEndpoints(axisService, axisService.getAxisConfiguration()); Map<String, AxisEndpoint> endpoints = axisService.getEndpoints(); String serviceName = axisService.getName(); try { addToAllServicesMap(axisService); } catch (AxisFault axisFault) { // Whoops, must have been a duplicate! If we had a problem here, we have to // remove all the ones we added... for (AxisService service : servicesIAdded) { allServices.remove(service.getName()); } // And toss this in case anyone wants it? throw axisFault; } servicesIAdded.add(axisService); if (endpoints != null) { Iterator<String> endpointNameIter = endpoints.keySet().iterator(); while (endpointNameIter.hasNext()) { String endpointName = endpointNameIter.next(); if (log.isDebugEnabled()) { log.debug("Adding service to allEndpoints map: (" + serviceName + "," + endpointName + ") "); } allEndpoints.put(serviceName + "." + endpointName, axisService); } if (log.isDebugEnabled()) { log.debug("After adding to allEndpoints map, size is " + allEndpoints.size()); } } if (!axisService.isClientSide()) { notifyObservers(new AxisEvent(AxisEvent.SERVICE_DEPLOY ,axisService ), axisService); } } // serviceGroups.put(axisServiceGroup.getServiceGroupName(), // axisServiceGroup); addChild(axisServiceGroup); } /** * This method is used to add a service to an existing active service group in the axis configuration * * @param axisService service to be added to the existing service group provided * @param serviceGroupName name of the service group which should be existing in the axis configuration * @throws AxisFault in case of an error in adding the service to the group specified or if the group is not existing */ public void addServiceToExistingServiceGroup(AxisService axisService, String serviceGroupName) throws AxisFault { AxisServiceGroup serviceGroup = getServiceGroup(serviceGroupName); if (serviceGroup == null) { String message = "A ServiceGroup with the provided name " + serviceGroupName + " is not existing"; log.error(message); throw new AxisFault(message); } if (axisService.getSchemaTargetNamespace() == null) { axisService.setSchemaTargetNamespace(Java2WSDLConstants.AXIS2_XSD); } if (axisService.isUseDefaultChains()) { Iterator<AxisOperation> operations = axisService.getOperations(); while (operations.hasNext()) { AxisOperation operation = operations.next(); phasesinfo.setOperationPhases(operation); } } Map<String, AxisEndpoint> endpoints = axisService.getEndpoints(); if (endpoints == null || endpoints.size() == 0) { org.apache.axis2.deployment.util.Utils.addEndpointsToService( axisService, axisService.getAxisConfiguration()); endpoints = axisService.getEndpoints(); } String serviceName = axisService.getName(); addToAllServicesMap(axisService); if (endpoints != null) { Iterator<String> endpointNameIter = endpoints.keySet().iterator(); while (endpointNameIter.hasNext()) { String endpointName = endpointNameIter.next(); if (log.isDebugEnabled()) { log.debug("Adding service to allEndpoints map: (" + serviceName + "," + endpointName + ") "); } allEndpoints.put(serviceName + "." + endpointName, axisService); } if (log.isDebugEnabled()) { log.debug("After adding to allEndpoints map, size is " + allEndpoints.size()); } } serviceGroup.addService(axisService); if (!axisService.isClientSide()) { notifyObservers(new AxisEvent(AxisEvent.SERVICE_DEPLOY, axisService), axisService); } } public void addToAllServicesMap(AxisService axisService) throws AxisFault { String serviceName = axisService.getName(); AxisService oldService = allServices.get(serviceName); if (oldService == null) { if (log.isDebugEnabled()) { log.debug("Adding service to allServices map: [" + serviceName + "] "); } allServices.put(serviceName, axisService); if (log.isTraceEnabled()) { //noinspection ThrowableInstanceNeverThrown log.trace("After adding to allServices map, size is " + allServices.size() + " call stack is " + JavaUtils.stackToString(new Exception())); } } else { // If we were already there, that's fine. If not, fault! if (oldService != axisService) { throw new AxisFault(Messages.getMessage("twoservicecannothavesamename", axisService.getName() + " [" + axisService.getFileName() + "]")); } } } public AxisServiceGroup removeServiceGroup(String serviceGroupName) throws AxisFault { AxisServiceGroup axisServiceGroup = (AxisServiceGroup) getChild(serviceGroupName); if (axisServiceGroup == null) { throw new AxisFault(Messages.getMessage("invalidservicegroupname", serviceGroupName)); } Iterator<AxisService> services = axisServiceGroup.getServices(); boolean isClientSide = false; while (services.hasNext()) { AxisService axisService = services.next(); isClientSide = axisService.isClientSide()? true : false; //removes the endpoints to this service removeServiceReferences(axisService.getName()); } removeChild(serviceGroupName); if (!isClientSide) { notifyObservers(new AxisEvent(AxisEvent.SERVICE_REMOVE, axisServiceGroup), axisServiceGroup); } return axisServiceGroup; } /** * Add an incoming transport description (i.e. receiver) to our configuration. * * @param transport TransportInDescription to add. * @throws AxisFault */ public void addTransportIn(TransportInDescription transport) throws AxisFault { if (transport.getReceiver() == null) { throw new AxisFault( "Transport Receiver can not be null for the transport " + transport.getName()); } transportsIn.put(transport.getName(), transport); } /** * Add an outgoing transport description (i.e. sender) to our configuration. * * @param transport TransportOutDescription to add. * @throws AxisFault */ public void addTransportOut(TransportOutDescription transport) throws AxisFault { if (transport.getSender() == null) { throw new AxisFault( "Transport sender can not be null for the transport " + transport.getName()); } transportsOut.put(transport.getName(), transport); } /** * Engages the default module version corresponding to given module name , * or if the module name contains version number in it then it will engage * the correct module. Both of the below two cases are valid 1. * engageModule("addressing"); 2. engageModule("addressing-1.23"); * * @param moduleref name of module to engage * @throws AxisFault */ public void engageModule(String moduleref) throws AxisFault { AxisModule module = getModule(moduleref); if (module != null) { engageModule(module); } else { throw new AxisFault(Messages.getMessage("modulenotavailble", moduleref)); } } /** * Engages a module using given name and its version ID. * * @param moduleName name of module to engage * @param versionID version of module to engage * @throws AxisFault */ public void engageModule(String moduleName, String versionID) throws AxisFault { String actualName = Utils.getModuleName(moduleName, versionID); AxisModule module = getModule(actualName); if (module != null) { engageModule(module); } else { // TODO : Should this be an NPE or InvalidArgumentException? throw new AxisFault(Messages.getMessage("refertoinvalidmodule")); } } public void onEngage(AxisModule module, AxisDescription engager) throws AxisFault { Iterator<AxisServiceGroup> servicegroups = getServiceGroups(); while (servicegroups.hasNext()) { AxisServiceGroup serviceGroup = servicegroups.next(); serviceGroup.engageModule(module, engager); } } /** * To dis-engage a module from the system. This will remove all the handlers * belonging to this module from all the handler chains. * * @param module module to disengage */ public void onDisengage(AxisModule module) throws AxisFault { PhaseResolver phaseResolver = new PhaseResolver(this); phaseResolver.disengageModuleFromGlobalChains(module); Iterator<AxisServiceGroup> serviceGroups = getServiceGroups(); while (serviceGroups.hasNext()) { AxisServiceGroup axisServiceGroup = serviceGroups.next(); axisServiceGroup.disengageModule(module); } } public void notifyObservers(AxisEvent event, AxisService service) { if (service.isClientSide()) return; for (AxisObserver observer : observerSet) { try { observer.serviceUpdate(event, service); } catch (Throwable e) { // No need to stop the system due to this, so log an error and ignore log.error("Error occured while notifying observer", e); } } } public void notifyObservers(AxisEvent event, AxisModule moule) { for (AxisObserver anObserversList : observerSet) { try { anObserversList.moduleUpdate(event, moule); } catch (Throwable e) { // No need to stop the system due to this, so log an error and ignore log.error("Error occured while notifying observer", e); } } } public void notifyObservers(AxisEvent event, AxisServiceGroup serviceGroup) { for (AxisObserver anObserversList : observerSet) { try { anObserversList.serviceGroupUpdate(event, serviceGroup); } catch (Throwable e) { // No need to stop the system due to this, so log an error and ignore log.error("Error occured while notifying observer", e); } } } /** * Remove a service. * * @param name name of service to remove * @throws AxisFault */ public synchronized void removeService(String name) throws AxisFault { AxisService service = removeServiceReferences(name); if (service != null) { AxisServiceGroup serviceGroup = service.getAxisServiceGroup(); serviceGroup.removeService(name); log.debug(Messages.getMessage("serviceremoved", name)); } } /** * Add an AxisModule to the list of globally deployed modules. * <p/> * TODO: should this check for duplicate names? * * @param moduleName name of AxisModule to add to list. */ public void addGlobalModuleRef(String moduleName) { globalModuleList.add(moduleName); } /** * Engage all the previously added global modules. * * @throws AxisFault if an individual engageModule() fails */ public void engageGlobalModules() throws AxisFault { for (String aGlobalModuleList : globalModuleList) { engageModule(aGlobalModuleList); } } public Hashtable<String, String> getFaultyModules() { return faultyModules; } public Hashtable<String, String> getFaultyServices() { return faultyServices; } /** * Updates the map that keeps track of faulty services due to modules * @param moduleName This service has become faulty due this module. * @param faultyServiceData Data that are required when recovering the faulty service. */ public void addFaultyServiceDuetoModule(String moduleName, FaultyServiceData faultyServiceData) { Map<String, FaultyServiceData> faultyServicesMap; synchronized (faultyServicesDueToModules) { if (faultyServicesDueToModules.containsKey(moduleName)) { faultyServicesMap = faultyServicesDueToModules.get(moduleName); faultyServicesMap.put(faultyServiceData.getServiceGroupName(), faultyServiceData); } else { faultyServicesMap = new HashMap<String, FaultyServiceData>(); faultyServicesMap.put(faultyServiceData.getServiceGroupName(), faultyServiceData); faultyServicesDueToModules.put(moduleName, faultyServicesMap); } //Adding the faulty service to default service map String serviceStatus = "Error:\n" + "Engaged module not found :" + moduleName; String serviceLocation = null; if(faultyServiceData.getCurrentDeploymentFile() != null){ serviceLocation = faultyServiceData.getCurrentDeploymentFile().getFile().getAbsolutePath(); } if(serviceLocation == null){ serviceLocation = faultyServiceData.getServiceGroupName(); } faultyServices.put(serviceLocation, serviceStatus); } } /** * Returns a map which contains the faulty services due a particular module. * * @param moduleName name of the module about which to inquire * @return a Map<String, FaultyServiceData> mapping service name to data */ public Map<String, FaultyServiceData> getFaultyServicesDuetoModule(String moduleName) { if (faultyServicesDueToModules.containsKey(moduleName)) { return faultyServicesDueToModules.get(moduleName); } return new HashMap<String, FaultyServiceData>(1); } /** * Returns the map which keeps track of faulty services due to modules. * @return a Map keyed by module name, containing Maps keyed by service name containing * FaultyServiceData for each faulty service. */ public Map<String, Map<String, FaultyServiceData>> getFaultyServicesDuetoModules(){ return faultyServicesDueToModules; } /** * Removes a faulty service for a given module from the internal map. * * TODO: Doesn't this actually remove a faulty service *group*? And should this even be public? * * @param moduleName name of the module to look up * @param serviceGroupName name of the service group to remove */ public void removeFaultyServiceDuetoModule(String moduleName, String serviceGroupName) { synchronized (faultyServicesDueToModules) { Map<String, FaultyServiceData> faultyServicesDueToModule = faultyServicesDueToModules.get(moduleName); FaultyServiceData faultyServiceData = faultyServicesDueToModule.get(serviceGroupName); if (faultyServicesDueToModule != null) { faultyServicesDueToModule.remove(serviceGroupName); //Removing from the default faulty services map. String serviceLocation = null; if (faultyServiceData.getCurrentDeploymentFile() != null) { serviceLocation = faultyServiceData.getCurrentDeploymentFile().getFile().getAbsolutePath(); } if (serviceLocation == null) { serviceLocation = faultyServiceData.getServiceGroupName(); } faultyServices.remove(serviceLocation); if (faultyServicesDueToModule.isEmpty()) { faultyServicesDueToModules.remove(moduleName); } } } } public void removeFaultyService(String key) { Iterator<String> itr = faultyServices.keySet().iterator(); while (itr.hasNext()) { String fullFileName = itr.next(); if (fullFileName.indexOf(key) >= 0) { faultyServices.remove(fullFileName); return; } } } // to get the out flow correpodning to the global out flow; public List<Phase> getOutFlowPhases() { return this.outPhases; } /** * @return Returns ArrayList. */ public List<Phase> getInFaultFlowPhases() { return inFaultPhases; } public List<Phase> getInFlowPhases() { return inPhasesUptoAndIncludingPostDispatch; } public MessageReceiver getMessageReceiver(String mepURL) { return messageReceivers.get(mepURL); } /** * Get a Builder for a particular content type. * * @param contentType the desired content type * @return the configured message builder implementation class name against * the given content type. */ public Builder getMessageBuilder(String contentType) { Builder builder = null; if (messageBuilders.isEmpty()) { return null; } if (contentType != null) { builder = messageBuilders.get(contentType); if (builder == null) { builder = messageBuilders.get(contentType.toLowerCase()); } if (builder == null) { Iterator<Entry<String, Builder>> iterator = messageBuilders.entrySet().iterator(); while (iterator.hasNext() && builder == null) { Entry<String, Builder> entry = iterator.next(); String key = entry.getKey(); if (contentType.matches(key)) { builder = entry.getValue(); } } } } return builder; } public Builder getMessageBuilder(String contentType, boolean defaultBuilder) { Builder builder = getMessageBuilder(contentType); if (builder == null && defaultBuilder){ builder = new UnknownContentBuilder(); } return builder; } /** * Get a MessageFormatter for the specified content type. * * @param contentType content type to look up * @return a MessageFormatter corresponding to the given content type, or null. */ public MessageFormatter getMessageFormatter(String contentType) { return messageFormatters.get(contentType); } // /** // * // * @deprecate Please use String version instead // * @param qname // * @return // */ // public AxisModule getModule(QName qname) { // return getModule(qname.getLocalPart()); // } /** * Get an AxisModule by name. * * If the exact name passed (which might contain a version) is present, we'll return that, * otherwise we'll look for the default version *if* there is no version in the passed * name. * * @param name module name to look up * @return an AxisModule if found, or null */ public AxisModule getModule(String name) { AxisModule module = allModules.get(name); if (module != null) { return module; } // checks whether the version string seperator is not there in the // module name String defaultModuleVersion = getDefaultModuleVersion(name); if (defaultModuleVersion != null) { module = allModules.get(Utils.getModuleName(name, defaultModuleVersion)); if (module != null) { return module; } } return null; } /** * Return the module having name=moduleName & version=moduleVersion * * @param moduleName The module name * @param moduleVersion The version of the module * @return The AxisModule having name=moduleName & version=moduleVersion */ public AxisModule getModule(String moduleName, String moduleVersion) { if (moduleVersion == null || moduleVersion.trim().length() == 0) { moduleVersion = getDefaultModuleVersion(moduleName); } return allModules.get(Utils.getModuleName(moduleName, moduleVersion)); } /** * Get the class loader that becomes the parent of all the modules * * @return a ClassLoader */ public ClassLoader getModuleClassLoader() { return this.moduleClassLoader; } public ModuleConfiguration getModuleConfig(String moduleName) { return moduleConfigmap.get(moduleName); } /** * @return Returns HashMap. */ public HashMap<String, AxisModule> getModules() { return allModules; } /** * @return Returns ArrayList. */ public List<Phase> getOutFaultFlowPhases() { return outFaultPhases; } public PhasesInfo getPhasesInfo() { return phasesinfo; } public URL getRepository() { return axis2Repository; } /** * Method getService. * * @param name the name of the service to look up * @return an AxisService if found, or null */ public AxisService getService(String name) throws AxisFault { AxisService axisService = allServices.get(name); if (axisService != null) { if (axisService.isActive()) { return axisService; } else { throw new AxisFault(Messages .getMessage("serviceinactive", name)); } } else { axisService = allEndpoints.get(name); if (axisService != null) { if (axisService.isActive()) { return axisService; } else { throw new AxisFault(Messages .getMessage("serviceinactive", name)); } } } return null; } /** * Service can start and stop, once stopped it cannot be accessed, so we * need a way to get the service even if service is not active. * * @param serviceName name to look up * @return AxisService */ public AxisService getServiceForActivation(String serviceName) { AxisService axisService; axisService = allServices.get(serviceName); if (axisService != null) { return axisService; } else { axisService = allEndpoints.get(serviceName); return axisService; } } // The class loader that becomes the parent of all the services public ClassLoader getServiceClassLoader() { return this.serviceClassLoader; } public AxisServiceGroup getServiceGroup(String serviceNameAndGroupString) { // return (AxisServiceGroup) // serviceGroups.get(serviceNameAndGroupString); return (AxisServiceGroup) getChild(serviceNameAndGroupString); } public Iterator<AxisServiceGroup> getServiceGroups() { // return serviceGroups.values().iterator(); return (Iterator<AxisServiceGroup>) getChildren(); } // To get all the services in the system public HashMap<String, AxisService> getServices() { HashMap<String, AxisService> hashMap = new HashMap<String, AxisService>(this.allServices.size()); String key; for (String s : this.allServices.keySet()) { key = s; hashMap.put(key, this.allServices.get(key)); } return hashMap; } // The class loader which become the top most parent of all the modules and // services public ClassLoader getSystemClassLoader() { return this.systemClassLoader; } public TransportInDescription getTransportIn(String name) { return transportsIn.get(name); } public TransportOutDescription getTransportOut(String name) { return transportsOut.get(name); } public HashMap<String, TransportInDescription> getTransportsIn() { return transportsIn; } public HashMap<String, TransportOutDescription> getTransportsOut() { return transportsOut; } public boolean isEngaged(String moduleId) { AxisModule module = getModule(moduleId); if (module == null) { return false; } boolean isEngaged = super.isEngaged(module); if (!isEngaged) { AxisModule defaultModule = getDefaultModule(moduleId); isEngaged = engagedModules != null && engagedModules.values().contains(defaultModule); } return isEngaged; } public boolean isEngaged(AxisModule axisModule) { boolean isEngaged = super.isEngaged(axisModule); if (!isEngaged) { isEngaged = engagedModules != null && engagedModules.values().contains(axisModule); } return isEngaged; } public void setGlobalOutPhase(List<Phase> outPhases) { this.outPhases = outPhases; } /** * Set the inbound fault phases * * TODO: Passing mutable lists like this and using them directly is bad practice. * * @param list a List of Phases which will become our inbound fault flow */ public void setInFaultPhases(List<Phase> list) { inFaultPhases = list; } public void setInPhasesUptoAndIncludingPostDispatch( List<Phase> inPhasesUptoAndIncludingPostDispatch) { this.inPhasesUptoAndIncludingPostDispatch = inPhasesUptoAndIncludingPostDispatch; } public void setModuleClassLoader(ClassLoader classLoader) { this.moduleClassLoader = classLoader; } /** * Set the outbound fault phases * * TODO: Passing mutable lists like this and using them directly is bad practice. * * @param list a List of Phases which will become our outbound fault flow */ public void setOutFaultPhases(List<Phase> list) { outFaultPhases = list; } public void setPhasesInfo(PhasesInfo phasesInfo) { this.phasesinfo = phasesInfo; } public void setRepository(URL axis2Repository) { this.axis2Repository = axis2Repository; } public void setServiceClassLoader(ClassLoader classLoader) { this.serviceClassLoader = classLoader; } public void setSystemClassLoader(ClassLoader classLoader) { this.systemClassLoader = classLoader; } /** * Adds a default module version, which can be done either programmatically * or by using axis2.xml. The default module version is important if user * asks to engage a module without given version ID, in which case, * the default version is engaged. * * TODO: This currently does NOTHING if a default has already been set. Should either overwrite or throw. * * @param moduleName the name of the module for which we're setting the default version * @param moduleVersion the default version */ public void addDefaultModuleVersion(String moduleName, String moduleVersion) { if (nameToversionMap.get(moduleName) == null) { nameToversionMap.put(moduleName, moduleVersion); } } public String getDefaultModuleVersion(String moduleName) { return nameToversionMap.get(moduleName); } public AxisModule getDefaultModule(String moduleName) { String defaultModuleVersion = getDefaultModuleVersion(moduleName); if (defaultModuleVersion == null) { return allModules.get(moduleName); } else { return allModules.get(moduleName + "-" + defaultModuleVersion); } } public ClusteringAgent getClusteringAgent() { return clusteringAgent; } public void setClusteringAgent(ClusteringAgent clusteringAgent) { this.clusteringAgent = clusteringAgent; } public TransactionConfiguration getTransactionConfiguration() { return transactionConfiguration; } public void setTransactionConfig(TransactionConfiguration transactionConfiguration) { this.transactionConfiguration = transactionConfiguration; } public Object getKey() { return toString(); } public void stopService(String serviceName) throws AxisFault { AxisService service = allServices.get(serviceName); if (service == null) { throw new AxisFault(Messages.getMessage("servicenamenotvalid", serviceName)); } service.setActive(false); notifyObservers(new AxisEvent(AxisEvent.SERVICE_STOP , service), service); } public void startService(String serviceName) throws AxisFault { AxisService service = allServices.get(serviceName); if (service == null) { throw new AxisFault(Messages.getMessage("servicenamenotvalid", serviceName)); } service.setActive(true); notifyObservers(new AxisEvent(AxisEvent.SERVICE_START , service), service); } public List<AxisModule> getModulesForPolicyNamesapce(String namesapce) { return policySupportedModules.get(namesapce); } public void registerModulePolicySupport(AxisModule axisModule) { String[] namespaces = axisModule.getSupportedPolicyNamespaces(); if (namespaces == null) { return; } List<AxisModule> modulesList; for (String namespace : namespaces) { modulesList = policySupportedModules.get(namespace); if (modulesList != null) { modulesList.add(axisModule); } else { modulesList = new ArrayList<AxisModule>(); modulesList.add(axisModule); policySupportedModules.put(namespace, modulesList); } } } public void registerLocalPolicyAssertions(AxisModule axisModule) { QName[] localPolicyAssertions = axisModule.getLocalPolicyAssertions(); if (localPolicyAssertions == null) { return; } for (QName localPolicyAssertion : localPolicyAssertions) { addLocalPolicyAssertion(localPolicyAssertion); } } /** * This method returns read-only list of AxisObservers registered with this * {@link AxisConfiguration}. * * @return ArrayList<AxisObserver> */ public ArrayList<AxisObserver> getObserversList() { AxisObserver[] array = observerSet.toArray(new AxisObserver[observerSet.size()]); ArrayList<AxisObserver> observers = new ArrayList<AxisObserver>(array.length); observers.addAll(Arrays.asList(array)); return observers; } public boolean isStart() { return start; } public void setStart(boolean start) { this.start = start; } /** * getTargetResolverChain returns an instance of * TargetResolver which iterates over the registered * TargetResolvers, calling each one in turn when * resolveTarget is called. * * @return a TargetResolver which iterates over all registered TargetResolvers. */ public TargetResolver getTargetResolverChain() { if (targetResolvers.isEmpty()) { return null; } return new TargetResolver() { public void resolveTarget(MessageContext messageContext) { Iterator<TargetResolver> iter = targetResolvers.iterator(); while (iter.hasNext()) { TargetResolver tr = iter.next(); tr.resolveTarget(messageContext); } } }; } public void addTargetResolver(TargetResolver tr) { targetResolvers.add(tr); } public void addLocalPolicyAssertion(QName name) { this.localPolicyAssertions.add(name); } public List<QName> getLocalPolicyAssertions() { return this.localPolicyAssertions; } public void removeLocalPolicyAssertion(QName name) { this.localPolicyAssertions.remove(name); } public boolean isAssertionLocal(QName name) { return this.localPolicyAssertions.contains(name); } /** * Allows to define/configure Data Locator for specified dialect at Axis 2 Configuration. * * @param dialect- an absolute URI represents the format and version of data * @param classname - class name of the Data Locator configured to support retrieval * for the specified dialect. */ public void addDataLocatorClassNames(String dialect, String classname) { dataLocatorClassNames.put(dialect, classname); } /** * For internal used only! To store instance of DataLocator when it is first loaded. This allows to * reuse of the DataLocator after it is initially loaded. * * @param dialect- an absolute URI represents the format and version of data * @param dataLocator - specified an DataLocator instance to support retrieval * of the specified dialect. */ public void addDataLocator(String dialect, AxisDataLocator dataLocator) { dataLocators.put(dialect, dataLocator); } /** * Return DataLocator instance for specified dialect. * @param dialect the dialect to look up * @return an AxisDataLocator, or null */ public AxisDataLocator getDataLocator(String dialect) { return dataLocators.get(dialect); } /** * Return classname of DataLocator configured for specified dialect. * @param dialect the dialect to look up * @return a String containing a class name, or null */ public String getDataLocatorClassName(String dialect) { return dataLocatorClassNames.get(dialect); } /** * Checks whether the system pre-defined phases * for all the flows, have been changed. If they have been changed, throws a DeploymentException. * * @throws org.apache.axis2.deployment.DeploymentException * */ public void validateSystemPredefinedPhases() throws DeploymentException { PhasesInfo phasesInfo = getPhasesInfo(); setInPhasesUptoAndIncludingPostDispatch(phasesInfo.getGlobalInflow()); setInFaultPhases(phasesInfo.getGlobalInFaultPhases()); setGlobalOutPhase(phasesInfo.getGlobalOutPhaseList()); setOutFaultPhases(phasesInfo.getOUT_FaultPhases()); } public AxisConfigurator getConfigurator() { return configurator; } public void setConfigurator(AxisConfigurator configurator) { this.configurator = configurator; } public void cleanup() { if (configurator != null) { configurator.cleanup(); } if (clusteringAgent != null) { clusteringAgent.finalize(); } this.policySupportedModules.clear(); this.moduleConfigmap.clear(); this.allEndpoints.clear(); this.allModules.clear(); this.allServices.clear(); this.outPhases.clear(); this.messageReceivers.clear(); this.targetResolvers.clear(); if (this.engagedModules != null) { this.engagedModules.clear(); } this.configurator = null; } /** * This method can be used to insert a phase at the runtime for a given location * And the relative location can be specified by beforePhase and afterPhase. Parameters * Either or both of them can be null , if both the parameters are null then the phase * will be added some where in the global phase. If one of them are null then the phase * will be added * - If the beforePhase is null then the phase will be added after the afterPhase * - If the after phase is null then the phase will be added before the beforePhase * Type of the flow will be specified by the parameter flow. * 1 - Inflow * 2 - out flow * 3 - fault in flow * 4 - fault out flow * * @param d the Deployable representing the Phase to deploy * @param flow the type of the flow * @throws org.apache.axis2.AxisFault : If something went wrong */ public void insertPhase(Deployable d, int flow) throws AxisFault { switch (flow) { case PhaseMetadata.IN_FLOW : { List<Phase> phaseList = phasesinfo.getINPhases(); phaseList = findAndInsertPhase(d, phaseList); if (phaseList != null) { phasesinfo.setINPhases(phaseList); } break; } case PhaseMetadata.OUT_FLOW : { List<Phase> phaseList = phasesinfo.getOUTPhases(); phaseList = findAndInsertPhase(d, phaseList); if (phaseList != null) { phasesinfo.setOUTPhases(phaseList); } break; } case PhaseMetadata.FAULT_OUT_FLOW : { List<Phase> phaseList = phasesinfo.getOutFaultPhaseList(); phaseList = findAndInsertPhase(d, phaseList); if (phaseList != null) { phasesinfo.setOUT_FaultPhases(phaseList); } break; } case PhaseMetadata.FAULT_IN_FLOW : { List<Phase> phaseList = phasesinfo.getIN_FaultPhases(); phaseList = findAndInsertPhase(d, phaseList); if (phaseList != null) { phasesinfo.setIN_FaultPhases(phaseList); } break; } } } /** * Insert a Phase into a list of Phases * * @param d a Deployable containing the Phase to insert * @param phaseList a list of Phases * @return a new List of Phases with the new one correctly deployed. * @throws AxisFault */ private List<Phase> findAndInsertPhase(Deployable d, List<Phase> phaseList) throws AxisFault { DeployableChain<Phase> ec = new DeployableChain<Phase>(); String last = null; for (Phase phase : phaseList) { String name = phase.getName(); Deployable existing = new Deployable(name); existing.setTarget(phase); if (last != null) { // Set up explicit chain relationship for preexisting phases, for now. ec.addRelationship(last, name); } last = name; try { ec.deploy(existing); } catch (Exception e) { // This should never happen when building a simple list like the above throw AxisFault.makeFault(e); } } try { ec.deploy(d); if (d.getTarget() == null) { Phase phase = new Phase(); phase.setName(d.getName()); d.setTarget(phase); } ec.rebuild(); } catch (Exception e) { throw AxisFault.makeFault(e); } phaseList = ec.getChain(); return phaseList; } private void processEndpoints(AxisService axisService, AxisConfiguration axisConfiguration) throws AxisFault { Map<String, AxisEndpoint> enspoints = axisService.getEndpoints(); if (enspoints == null || enspoints.size() == 0) { org.apache.axis2.deployment.util.Utils.addEndpointsToService( axisService, axisConfiguration); } } public boolean isChildFirstClassLoading(){ boolean childFirstClassLoading = false; Parameter isChildFirstClassLoading = this.getParameter(Constants.Configuration.ENABLE_CHILD_FIRST_CLASS_LOADING); if (isChildFirstClassLoading != null){ childFirstClassLoading = JavaUtils.isTrueExplicitly(isChildFirstClassLoading.getValue()); } return childFirstClassLoading; } private AxisService removeServiceReferences(String serviceName) { AxisService axisService = allServices.remove(serviceName); if (axisService != null) { if (!axisService.isClientSide()) { notifyObservers(new AxisEvent(AxisEvent.SERVICE_REMOVE, axisService), axisService); } // removes the endpoints to this service for (Iterator<String> iter = axisService.getEndpoints().keySet() .iterator(); iter.hasNext();) { String key = serviceName + "." + iter.next(); this.allEndpoints.remove(key); } } return axisService; } public boolean isGlobalModulesRegistered(String moduleName) { if (globalModuleList.contains(moduleName)) { return true; } return false; } }