| /* |
| * 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.OMElement; |
| import org.apache.axis2.AxisFault; |
| import org.apache.axis2.Constants; |
| import org.apache.axis2.context.ConfigurationContext; |
| import org.apache.axis2.deployment.repository.util.ArchiveFileData; |
| import org.apache.axis2.deployment.repository.util.ArchiveReader; |
| import org.apache.axis2.deployment.repository.util.WSInfo; |
| import org.apache.axis2.deployment.scheduler.DeploymentIterator; |
| import org.apache.axis2.deployment.scheduler.Scheduler; |
| import org.apache.axis2.deployment.scheduler.SchedulerTask; |
| import org.apache.axis2.deployment.util.PhasesInfo; |
| import org.apache.axis2.deployment.util.Utils; |
| import org.apache.axis2.description.*; |
| import org.apache.axis2.engine.AxisConfiguration; |
| import org.apache.axis2.engine.MessageReceiver; |
| import org.apache.axis2.i18n.Messages; |
| import org.apache.axis2.wsdl.WSDLConstants; |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| |
| import javax.xml.namespace.QName; |
| import javax.xml.stream.XMLStreamException; |
| import java.io.*; |
| import java.net.MalformedURLException; |
| import java.net.URL; |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.zip.ZipEntry; |
| import java.util.zip.ZipInputStream; |
| |
| public class DeploymentEngine implements DeploymentConstants { |
| |
| private static final Log log = LogFactory.getLog(DeploymentEngine.class); |
| private boolean hotUpdate = true; // to do hot update or not |
| private boolean hotDeployment = true; // to do hot deployment or not |
| private boolean antiJARLocking = false; // to do hot deployment or not |
| /** |
| * Stores all the web Services to deploy. |
| */ |
| private List wsToDeploy = new ArrayList(); |
| |
| /** |
| * Stores all the web Services to undeploy. |
| */ |
| private List wsToUnDeploy = new ArrayList(); |
| |
| //to keep the web resource location if any |
| private String webLocationString = null; |
| |
| /** |
| * to keep a ref to engine register |
| * this ref will pass to engine when it call start() |
| * method |
| */ |
| protected AxisConfiguration axisConfig; |
| |
| protected ConfigurationContext configContext; |
| |
| private RepositoryListener repoListener; |
| |
| private String servicesPath = null; |
| private File servicesDir = null; |
| private String modulesPath = null; |
| private File modulesDir = null; |
| |
| public void loadServices() { |
| repoListener.checkServices(); |
| if (hotDeployment) { |
| startSearch(repoListener); |
| } |
| } |
| |
| public void loadRepository(String repoDir) throws DeploymentException { |
| File axisRepo = new File(repoDir); |
| if (!axisRepo.exists()) { |
| throw new DeploymentException( |
| Messages.getMessage("cannotfindrepo", repoDir)); |
| } |
| setDeploymentFeatures(); |
| prepareRepository(repoDir); |
| // setting the CLs |
| setClassLoaders(repoDir); |
| repoListener = new RepositoryListener(this, false); |
| org.apache.axis2.util.Utils.calculateDefaultModuleVersion(axisConfig.getModules(), axisConfig); |
| try { |
| try { |
| axisConfig.setRepository(axisRepo.toURL()); |
| } catch (MalformedURLException e) { |
| log.info(e.getMessage()); |
| } |
| validateSystemPredefinedPhases(); |
| } catch (AxisFault axisFault) { |
| throw new DeploymentException(axisFault); |
| } |
| } |
| |
| public void loadFromClassPath() throws DeploymentException { |
| //loading modules from the classpath |
| new RepositoryListener(this, true); |
| org.apache.axis2.util.Utils.calculateDefaultModuleVersion( |
| axisConfig.getModules(), axisConfig); |
| validateSystemPredefinedPhases(); |
| try { |
| engageModules(); |
| } catch (AxisFault axisFault) { |
| log.info(Messages.getMessage(DeploymentErrorMsgs.MODULE_VALIDATION_FAILED, |
| axisFault.getMessage())); |
| throw new DeploymentException(axisFault); |
| } |
| } |
| |
| public void loadServicesFromUrl(URL repoURL) { |
| try { |
| String path = servicesPath == null ? DeploymentConstants.SERVICE_PATH : servicesPath; |
| if (!path.endsWith("/")) { |
| path = path + "/"; |
| } |
| URL servicesDir = new URL(repoURL, path); |
| URL filelisturl = new URL(servicesDir, "services.list"); |
| ArrayList files = getFileList(filelisturl); |
| Iterator fileIterator = files.iterator(); |
| while (fileIterator.hasNext()) { |
| String fileUrl = (String) fileIterator.next(); |
| if (fileUrl.endsWith(".aar")) { |
| AxisServiceGroup serviceGroup = new AxisServiceGroup(); |
| URL servicesURL = new URL(servicesDir, fileUrl); |
| ArrayList servicelist = populateService(serviceGroup, |
| servicesURL, |
| fileUrl.substring(0, fileUrl.indexOf(".aar"))); |
| addServiceGroup(serviceGroup, servicelist, servicesURL, null); |
| } |
| } |
| } catch (MalformedURLException e) { |
| log.info(e.getMessage()); |
| } catch (IOException e) { |
| log.info(e.getMessage()); |
| } |
| } |
| |
| public void loadRepositoryFromURL(URL repoURL) throws DeploymentException { |
| try { |
| String path = modulesPath == null ? DeploymentConstants.MODULE_PATH : modulesPath; |
| if (!path.endsWith("/")) { |
| path = path + "/"; |
| } |
| URL moduleDir = new URL(repoURL, path); |
| URL filelisturl = new URL(moduleDir, "modules.list"); |
| ArrayList files = getFileList(filelisturl); |
| Iterator fileIterator = files.iterator(); |
| while (fileIterator.hasNext()) { |
| String fileUrl = (String) fileIterator.next(); |
| if (fileUrl.endsWith(".mar")) { |
| URL moduleurl = new URL(moduleDir, fileUrl); |
| DeploymentClassLoader deploymentClassLoader = |
| new DeploymentClassLoader( |
| new URL[]{moduleurl}, |
| axisConfig.getModuleClassLoader(), |
| antiJARLocking); |
| AxisModule module = new AxisModule(); |
| module.setModuleClassLoader(deploymentClassLoader); |
| module.setParent(axisConfig); |
| String moduleName = fileUrl.substring(0, fileUrl.indexOf(".mar")); |
| module.setName(new QName(moduleName)); |
| populateModule(module, moduleurl); |
| module.setFileName(moduleurl); |
| addNewModule(module); |
| } |
| } |
| org.apache.axis2.util.Utils.calculateDefaultModuleVersion( |
| axisConfig.getModules(), axisConfig); |
| validateSystemPredefinedPhases(); |
| } catch (MalformedURLException e) { |
| throw new DeploymentException(e); |
| } catch (IOException e) { |
| throw new DeploymentException(e); |
| } |
| } |
| |
| private void populateModule(AxisModule module, URL moduleUrl) throws DeploymentException { |
| try { |
| ClassLoader classLoadere = module.getModuleClassLoader(); |
| InputStream moduleStream = classLoadere.getResourceAsStream("META-INF/module.xml"); |
| if (moduleStream == null) { |
| moduleStream = classLoadere.getResourceAsStream("meta-inf/module.xml"); |
| } |
| if (moduleStream == null) { |
| throw new DeploymentException( |
| Messages.getMessage( |
| DeploymentErrorMsgs.MODULE_XML_MISSING, moduleUrl.toString())); |
| } |
| ModuleBuilder moduleBuilder = new ModuleBuilder(moduleStream, module, axisConfig); |
| moduleBuilder.populateModule(); |
| } catch (IOException e) { |
| throw new DeploymentException(e); |
| } |
| } |
| |
| private ArrayList populateService(AxisServiceGroup serviceGroup, |
| URL servicesURL, |
| String serviceName) throws DeploymentException { |
| try { |
| serviceGroup.setServiceGroupName(serviceName); |
| DeploymentClassLoader serviceClassLoader = new DeploymentClassLoader( |
| new URL[]{servicesURL}, axisConfig.getServiceClassLoader(), antiJARLocking); |
| String metainf = "meta-inf"; |
| serviceGroup.setServiceGroupClassLoader(serviceClassLoader); |
| InputStream servicexmlStream = serviceClassLoader.getResourceAsStream("META-INF/services.xml"); |
| if (servicexmlStream == null) { |
| servicexmlStream = serviceClassLoader.getResourceAsStream("meta-inf/services.xml"); |
| } else { |
| metainf = "META-INF"; |
| } |
| if (servicexmlStream == null) { |
| throw new DeploymentException( |
| Messages.getMessage(DeploymentErrorMsgs.SERVICE_XML_NOT_FOUND, servicesURL.toString())); |
| } |
| DescriptionBuilder builder = new DescriptionBuilder(servicexmlStream, configContext); |
| OMElement rootElement = builder.buildOM(); |
| String elementName = rootElement.getLocalName(); |
| |
| if (TAG_SERVICE.equals(elementName)) { |
| AxisService axisService = null; |
| InputStream wsdlStream = serviceClassLoader.getResourceAsStream(metainf + "/service.wsdl"); |
| if (wsdlStream == null) { |
| wsdlStream = serviceClassLoader.getResourceAsStream(metainf + "/" + serviceName + ".wsdl"); |
| } |
| if (wsdlStream != null) { |
| WSDL11ToAxisServiceBuilder wsdl2AxisServiceBuilder = |
| new WSDL11ToAxisServiceBuilder(wsdlStream, null, null); |
| axisService = wsdl2AxisServiceBuilder.populateService(); |
| axisService.setWsdlFound(true); |
| axisService.setName(serviceName); |
| } |
| if (axisService == null) { |
| axisService = new AxisService(serviceName); |
| } |
| |
| axisService.setParent(serviceGroup); |
| axisService.setClassLoader(serviceClassLoader); |
| |
| ServiceBuilder serviceBuilder = new ServiceBuilder(configContext, axisService); |
| AxisService service = serviceBuilder.populateService(rootElement); |
| |
| ArrayList serviceList = new ArrayList(); |
| serviceList.add(service); |
| return serviceList; |
| } else if (TAG_SERVICE_GROUP.equals(elementName)) { |
| ServiceGroupBuilder groupBuilder = new ServiceGroupBuilder(rootElement, new HashMap(), |
| configContext); |
| ArrayList servicList = groupBuilder.populateServiceGroup(serviceGroup); |
| Iterator serviceIterator = servicList.iterator(); |
| while (serviceIterator.hasNext()) { |
| AxisService axisService = (AxisService) serviceIterator.next(); |
| InputStream wsdlStream = serviceClassLoader.getResourceAsStream(metainf + "/service.wsdl"); |
| if (wsdlStream == null) { |
| wsdlStream = serviceClassLoader.getResourceAsStream(metainf + "/" + serviceName + ".wsdl"); |
| if (wsdlStream != null) { |
| WSDL11ToAxisServiceBuilder wsdl2AxisServiceBuilder = |
| new WSDL11ToAxisServiceBuilder(wsdlStream, axisService); |
| axisService = wsdl2AxisServiceBuilder.populateService(); |
| axisService.setWsdlFound(true); |
| // Set the default message receiver for the operations that were |
| // not listed in the services.xml |
| Iterator operations = axisService.getOperations(); |
| while (operations.hasNext()) { |
| AxisOperation operation = (AxisOperation) operations.next(); |
| if (operation.getMessageReceiver() == null) { |
| operation.setMessageReceiver(loadDefaultMessageReceiver( |
| operation.getMessageExchangePattern(), axisService)); |
| } |
| } |
| } |
| } |
| } |
| return servicList; |
| } |
| } catch (IOException e) { |
| throw new DeploymentException(e); |
| } catch (XMLStreamException e) { |
| throw new DeploymentException(e); |
| } |
| return null; |
| } |
| |
| protected MessageReceiver loadDefaultMessageReceiver(String mepURL, AxisService service) { |
| MessageReceiver messageReceiver; |
| if (mepURL == null) { |
| mepURL = WSDLConstants.WSDL20_2004Constants.MEP_URI_IN_OUT; |
| } |
| if (service != null) { |
| messageReceiver = service.getMessageReceiver(mepURL); |
| if (messageReceiver != null) { |
| return messageReceiver; |
| } |
| } |
| return axisConfig.getMessageReceiver(mepURL); |
| } |
| |
| private void addNewModule(AxisModule modulemetadata) throws AxisFault { |
| |
| Flow inflow = modulemetadata.getInFlow(); |
| ClassLoader moduleClassLoader = modulemetadata.getModuleClassLoader(); |
| |
| if (inflow != null) { |
| Utils.addFlowHandlers(inflow, moduleClassLoader); |
| } |
| |
| Flow outFlow = modulemetadata.getOutFlow(); |
| |
| if (outFlow != null) { |
| Utils.addFlowHandlers(outFlow, moduleClassLoader); |
| } |
| |
| Flow faultInFlow = modulemetadata.getFaultInFlow(); |
| |
| if (faultInFlow != null) { |
| Utils.addFlowHandlers(faultInFlow, moduleClassLoader); |
| } |
| |
| Flow faultOutFlow = modulemetadata.getFaultOutFlow(); |
| |
| if (faultOutFlow != null) { |
| Utils.addFlowHandlers(faultOutFlow, moduleClassLoader); |
| } |
| |
| axisConfig.addModule(modulemetadata); |
| log.debug(Messages.getMessage(DeploymentErrorMsgs.ADDING_NEW_MODULE)); |
| } |
| |
| private void addServiceGroup(AxisServiceGroup serviceGroup, |
| ArrayList serviceList, |
| URL serviceLocation, |
| ArchiveFileData currentArchiveFile) |
| throws AxisFault { |
| fillServiceGroup(serviceGroup, serviceList, serviceLocation, axisConfig); |
| axisConfig.addServiceGroup(serviceGroup); |
| if (currentArchiveFile != null) { |
| addAsWebResources(currentArchiveFile.getFile(), |
| serviceGroup.getServiceGroupName(), serviceGroup); |
| } |
| } |
| |
| private static void fillServiceGroup(AxisServiceGroup serviceGroup, |
| ArrayList serviceList, |
| URL serviceLocation, |
| AxisConfiguration axisConfig) throws AxisFault { |
| serviceGroup.setParent(axisConfig); |
| // module from services.xml at serviceGroup level |
| ArrayList groupModules = serviceGroup.getModuleRefs(); |
| |
| for (int i = 0; i < groupModules.size(); i++) { |
| QName moduleName = (QName) groupModules.get(i); |
| AxisModule module = axisConfig.getModule(moduleName); |
| |
| if (module != null) { |
| serviceGroup.engageModule(axisConfig.getModule(moduleName), axisConfig); |
| } else { |
| throw new DeploymentException( |
| Messages.getMessage( |
| DeploymentErrorMsgs.BAD_MODULE_FROM_SERVICE, |
| serviceGroup.getServiceGroupName(), moduleName.getLocalPart())); |
| } |
| } |
| |
| Iterator services = serviceList.iterator(); |
| |
| while (services.hasNext()) { |
| AxisService axisService = (AxisService) services.next(); |
| String scope = axisService.getScope(); |
| if (Constants.SCOPE_TRANSPORT_SESSION.equals(scope)) { |
| if (!axisConfig.isManageTransportSession()) { |
| throw new DeploymentException("You can not deploy the service " + |
| "in transport session , since transport session management" + |
| " disabled in axis2.xml change manageTransportSession parameter value to true"); |
| } |
| } |
| axisService.setUseDefaultChains(false); |
| |
| axisService.setFileName(serviceLocation); |
| serviceGroup.addService(axisService); |
| |
| // modules from <service> |
| ArrayList list = axisService.getModules(); |
| |
| for (int i = 0; i < list.size(); i++) { |
| AxisModule module = axisConfig.getModule((QName) list.get(i)); |
| |
| if (module == null) { |
| throw new DeploymentException( |
| Messages.getMessage( |
| DeploymentErrorMsgs.BAD_MODULE_FROM_SERVICE, axisService.getName(), |
| ((QName) list.get(i)).getLocalPart())); |
| } |
| |
| axisService.engageModule(module, axisConfig); |
| } |
| |
| for (Iterator iterator = axisService.getOperations(); iterator.hasNext();) { |
| AxisOperation opDesc = (AxisOperation) iterator.next(); |
| ArrayList modules = opDesc.getModuleRefs(); |
| |
| for (int i = 0; i < modules.size(); i++) { |
| QName moduleName = (QName) modules.get(i); |
| AxisModule module = axisConfig.getModule(moduleName); |
| |
| if (module != null) { |
| opDesc.engageModule(module, axisConfig); |
| } else { |
| throw new DeploymentException( |
| Messages.getMessage( |
| DeploymentErrorMsgs.BAD_MODULE_FROM_OPERATION, |
| opDesc.getName().getLocalPart(), moduleName.getLocalPart())); |
| } |
| } |
| } |
| } |
| } |
| |
| private void addAsWebResources(File in, String serviceFileName, AxisServiceGroup serviceGroup) { |
| try { |
| if (webLocationString == null) { |
| return; |
| } |
| if (in.isDirectory()) { |
| return; |
| } |
| File webLocation = new File(webLocationString); |
| File out = new File(webLocation, serviceFileName); |
| int BUFFER = 1024; |
| byte data[] = new byte[BUFFER]; |
| FileInputStream fin = new FileInputStream(in); |
| ZipInputStream zin = new ZipInputStream( |
| fin); |
| ZipEntry entry; |
| while ((entry = zin.getNextEntry()) != null) { |
| ZipEntry zip = new ZipEntry(entry); |
| if (zip.getName().toUpperCase().startsWith("WWW")) { |
| String fileName = zip.getName(); |
| fileName = fileName.substring("WWW/".length(), |
| fileName.length()); |
| if (zip.isDirectory()) { |
| new File(out, fileName).mkdirs(); |
| } else { |
| FileOutputStream tempOut = new FileOutputStream(new File(out, fileName)); |
| int count; |
| while ((count = zin.read(data, 0, BUFFER)) != -1) { |
| tempOut.write(data, 0, count); |
| } |
| tempOut.close(); |
| tempOut.flush(); |
| } |
| serviceGroup.setFoundWebResources(true); |
| } |
| } |
| zin.close(); |
| fin.close(); |
| } catch (IOException e) { |
| log.info(e.getMessage()); |
| } |
| } |
| |
| /** |
| * @param file |
| */ |
| public void addWSToDeploy(ArchiveFileData file) { |
| wsToDeploy.add(file); |
| } |
| |
| /** |
| * @param file |
| */ |
| public void addWSToUndeploy(WSInfo file) { |
| wsToUnDeploy.add(file); |
| } |
| |
| public void doDeploy() { |
| if (wsToDeploy.size() > 0) { |
| for (int i = 0; i < wsToDeploy.size(); i++) { |
| ArchiveFileData currentArchiveFile = (ArchiveFileData) wsToDeploy.get(i); |
| boolean explodedDir = currentArchiveFile.getFile().isDirectory(); |
| int type = currentArchiveFile.getType(); |
| try { |
| ArchiveReader archiveReader; |
| StringWriter errorWriter = new StringWriter(); |
| switch (type) { |
| case TYPE_SERVICE : |
| currentArchiveFile.setClassLoader(explodedDir, |
| axisConfig.getServiceClassLoader()); |
| archiveReader = new ArchiveReader(); |
| String serviceStatus = ""; |
| try { |
| HashMap wsdlservice = archiveReader.processWSDLs(currentArchiveFile); |
| if (wsdlservice != null && wsdlservice.size() > 0) { |
| Iterator services = wsdlservice.values().iterator(); |
| while (services.hasNext()) { |
| AxisService service = (AxisService) services.next(); |
| Iterator operations = service.getOperations(); |
| while (operations.hasNext()) { |
| AxisOperation axisOperation = (AxisOperation) operations.next(); |
| axisConfig.getPhasesInfo().setOperationPhases(axisOperation); |
| } |
| } |
| } |
| AxisServiceGroup sericeGroup = new AxisServiceGroup(axisConfig); |
| sericeGroup.setServiceGroupClassLoader( |
| currentArchiveFile.getClassLoader()); |
| ArrayList serviceList = archiveReader.processServiceGroup( |
| currentArchiveFile.getAbsolutePath(), currentArchiveFile, |
| sericeGroup, explodedDir, wsdlservice, |
| configContext); |
| addServiceGroup(sericeGroup, serviceList, currentArchiveFile.getFile().toURL(), currentArchiveFile); |
| log.info(Messages.getMessage(DeploymentErrorMsgs.DEPLOYING_WS, |
| currentArchiveFile.getName())); |
| } catch (DeploymentException de) { |
| de.printStackTrace(); |
| log.error(Messages.getMessage(DeploymentErrorMsgs.INVALID_SERVICE, |
| currentArchiveFile.getName(), |
| de.getMessage()), |
| de); |
| PrintWriter error_ptintWriter = new PrintWriter(errorWriter); |
| de.printStackTrace(error_ptintWriter); |
| serviceStatus = "Error:\n" + errorWriter.toString(); |
| } catch (AxisFault axisFault) { |
| log.error(Messages.getMessage(DeploymentErrorMsgs.INVALID_SERVICE, |
| currentArchiveFile.getName(), |
| axisFault.getMessage()), |
| axisFault); |
| PrintWriter error_ptintWriter = new PrintWriter(errorWriter); |
| axisFault.printStackTrace(error_ptintWriter); |
| serviceStatus = "Error:\n" + errorWriter.toString(); |
| } catch (Exception e) { |
| if (log.isInfoEnabled()) { |
| StringWriter sw = new StringWriter(); |
| PrintWriter pw = new PrintWriter(sw); |
| e.printStackTrace(pw); |
| log.info(Messages.getMessage( |
| DeploymentErrorMsgs.INVALID_SERVICE, |
| currentArchiveFile.getName(), |
| sw.getBuffer().toString())); |
| } |
| PrintWriter error_ptintWriter = new PrintWriter(errorWriter); |
| e.printStackTrace(error_ptintWriter); |
| serviceStatus = "Error:\n" + errorWriter.toString(); |
| } catch (Throwable t) { |
| if (log.isInfoEnabled()) { |
| StringWriter sw = new StringWriter(); |
| PrintWriter pw = new PrintWriter(sw); |
| t.printStackTrace(pw); |
| log.info(Messages.getMessage( |
| DeploymentErrorMsgs.INVALID_SERVICE, |
| currentArchiveFile.getName(), |
| sw.getBuffer().toString())); |
| } |
| PrintWriter error_ptintWriter = new PrintWriter(errorWriter); |
| t.printStackTrace(error_ptintWriter); |
| serviceStatus = "Error:\n" + errorWriter.toString(); |
| } finally { |
| if (serviceStatus.startsWith("Error:")) { |
| axisConfig.getFaultyServices().put(currentArchiveFile.getFile().getAbsolutePath(), |
| serviceStatus); |
| } |
| currentArchiveFile = null; |
| } |
| break; |
| case TYPE_MODULE : |
| currentArchiveFile.setClassLoader(explodedDir, |
| axisConfig.getModuleClassLoader()); |
| archiveReader = new ArchiveReader(); |
| String moduleStatus = ""; |
| try { |
| AxisModule metaData = new AxisModule(); |
| metaData.setModuleClassLoader(currentArchiveFile.getClassLoader()); |
| metaData.setParent(axisConfig); |
| archiveReader.readModuleArchive(currentArchiveFile, metaData, explodedDir, |
| axisConfig); |
| metaData.setFileName(currentArchiveFile.getFile().toURL()); |
| addNewModule(metaData); |
| log.info(Messages.getMessage(DeploymentErrorMsgs.DEPLOYING_MODULE, |
| metaData.getName().getLocalPart())); |
| } catch (DeploymentException e) { |
| log.error(Messages.getMessage(DeploymentErrorMsgs.INVALID_MODULE, |
| currentArchiveFile.getName(), |
| e.getMessage()), |
| e); |
| PrintWriter error_ptintWriter = new PrintWriter(errorWriter); |
| e.printStackTrace(error_ptintWriter); |
| moduleStatus = "Error:\n" + errorWriter.toString(); |
| } catch (AxisFault axisFault) { |
| log.error(Messages.getMessage(DeploymentErrorMsgs.INVALID_MODULE, |
| currentArchiveFile.getName(), |
| axisFault.getMessage()), |
| axisFault); |
| PrintWriter error_ptintWriter = new PrintWriter(errorWriter); |
| axisFault.printStackTrace(error_ptintWriter); |
| moduleStatus = "Error:\n" + errorWriter.toString(); |
| } catch (MalformedURLException e) { |
| log.error(Messages.getMessage(DeploymentErrorMsgs.INVALID_MODULE, |
| currentArchiveFile.getName(), |
| e.getMessage()), |
| e); |
| PrintWriter error_ptintWriter = new PrintWriter(errorWriter); |
| e.printStackTrace(error_ptintWriter); |
| moduleStatus = "Error:\n" + errorWriter.toString(); |
| } catch (Throwable t) { |
| if (log.isInfoEnabled()) { |
| StringWriter sw = new StringWriter(); |
| PrintWriter pw = new PrintWriter(sw); |
| t.printStackTrace(pw); |
| log.error(Messages.getMessage(DeploymentErrorMsgs.INVALID_MODULE, |
| currentArchiveFile.getName(), |
| t.getMessage()), |
| t); |
| } |
| PrintWriter error_ptintWriter = new PrintWriter(errorWriter); |
| t.printStackTrace(error_ptintWriter); |
| moduleStatus = "Error:\n" + errorWriter.toString(); |
| } finally { |
| if (moduleStatus.startsWith("Error:")) { |
| axisConfig.getFaultyModules().put( |
| getAxisServiceName(currentArchiveFile.getName()), moduleStatus); |
| } |
| currentArchiveFile = null; |
| } |
| break; |
| } |
| } catch (AxisFault axisFault) { |
| log.info(Messages.getMessage(DeploymentErrorMsgs.ERROR_SETTING_CLIENT_HOME, |
| axisFault.getMessage()), |
| axisFault); |
| } |
| } |
| } |
| |
| wsToDeploy.clear(); |
| } |
| |
| /** |
| * Checks if the modules, referred by server.xml, exist or that they are deployed. |
| */ |
| public void engageModules() throws AxisFault { |
| for (Iterator iterator = axisConfig.getGlobalModules().iterator(); iterator.hasNext();) { |
| QName name = (QName) iterator.next(); |
| axisConfig.engageModule(name); |
| } |
| } |
| |
| /** |
| * To get AxisConfiguration for a given inputStream this method can be used. |
| * The inputstream should be a valid axis2.xml , else you will be getting |
| * DeploymentExceptions. |
| * <p/> |
| * First creat a AxisConfiguration using given inputSream , and then it will |
| * try to find the repository location parameter from AxisConfiguration, so |
| * if user has add a parameter with the name "repository" , then the value |
| * specified by that parameter will be the repository and system will try to |
| * load modules and services from that repository location if it a valid |
| * location. hot deployment and hot update will work as usual in this case. |
| * <p/> |
| * You will be getting AxisConfiguration corresponding to given inputstream |
| * if it is valid , if something goes wrong you will be getting |
| * DeploymentExeption |
| * |
| * @param in |
| * @throws DeploymentException |
| */ |
| public AxisConfiguration populateAxisConfiguration(InputStream in) throws DeploymentException { |
| axisConfig = new AxisConfiguration(); |
| AxisConfigBuilder builder = new AxisConfigBuilder(in, axisConfig); |
| builder.populateConfig(); |
| try { |
| if (in != null) { |
| in.close(); |
| } |
| } catch (IOException e) { |
| log.info("error in closing input stream"); |
| } |
| return axisConfig; |
| } |
| |
| /** |
| * Starts the Deployment engine to perform Hot deployment and so on. |
| */ |
| private void startSearch(RepositoryListener listener) { |
| Scheduler scheduler = new Scheduler(); |
| |
| scheduler.schedule(new SchedulerTask(listener), new DeploymentIterator()); |
| } |
| |
| public void unDeploy() { |
| String fileName; |
| try { |
| if (wsToUnDeploy.size() > 0) { |
| for (int i = 0; i < wsToUnDeploy.size(); i++) { |
| WSInfo wsInfo = (WSInfo) wsToUnDeploy.get(i); |
| if (wsInfo.getType() == TYPE_SERVICE) { |
| if (isHotUpdate()) { |
| try { |
| fileName = getAxisServiceName(wsInfo.getFileName()); |
| axisConfig.removeServiceGroup(fileName); |
| log.info(Messages.getMessage(DeploymentErrorMsgs.SERVICE_REMOVED, |
| wsInfo.getFileName())); |
| } catch (AxisFault axisFault) { |
| //May be a faulty service |
| axisConfig.removeFaultyService(wsInfo.getFileName()); |
| } |
| } else { |
| axisConfig.removeFaultyService(wsInfo.getFileName()); |
| } |
| } |
| } |
| } |
| } catch (Exception e) { |
| log.info(e); |
| } |
| wsToUnDeploy.clear(); |
| } |
| |
| /** |
| * Checks whether some one has changed the system pre-defined phases |
| * for all the flows. If they have been changed,throws a DeploymentException. |
| * |
| * @throws DeploymentException |
| */ |
| private void validateSystemPredefinedPhases() throws DeploymentException { |
| PhasesInfo phasesInfo = axisConfig.getPhasesInfo(); |
| axisConfig.setInPhasesUptoAndIncludingPostDispatch(phasesInfo.getGlobalInflow()); |
| axisConfig.setInFaultPhases(phasesInfo.getGlobalInFaultPhases()); |
| axisConfig.setGlobalOutPhase(phasesInfo.getGlobalOutPhaseList()); |
| axisConfig.setOutFaultPhases(phasesInfo.getOUT_FaultPhases()); |
| } |
| |
| /** |
| * Gets AxisConfiguration. |
| * |
| * @return AxisConfiguration <code>AxisConfiguration</code> |
| */ |
| public AxisConfiguration getAxisConfig() { |
| return axisConfig; |
| } |
| |
| /** |
| * Retrieves service name from the archive file name. |
| * If the archive file name is service1.aar , then axis2 service name would be service1 |
| * |
| * @param fileName |
| * @return Returns String. |
| */ |
| private String getAxisServiceName(String fileName) { |
| char seperator = '.'; |
| String value; |
| int index = fileName.indexOf(seperator); |
| |
| if (index > 0) { |
| value = fileName.substring(0, index); |
| |
| return value; |
| } |
| |
| return fileName; |
| } |
| |
| public AxisModule getModule(QName moduleName) throws AxisFault { |
| return axisConfig.getModule(moduleName); |
| } |
| |
| public boolean isHotUpdate() { |
| return hotUpdate; |
| } |
| |
| public boolean isAntiJARLocking() { |
| return antiJARLocking; |
| } |
| |
| /** |
| * To set the all the classLoader hierarchy this method can be used , the top most parent is |
| * CCL then SCL(system Class Loader) |
| * CCL |
| * : |
| * SCL |
| * : : |
| * MCCL SCCL |
| * : : |
| * MCL SCL |
| * <p/> |
| * <p/> |
| * MCCL : module common class loader |
| * SCCL : Service common class loader |
| * MCL : module class loader |
| * SCL : Service class loader |
| * |
| * @param axis2repoURI : The repository folder of Axis2 |
| * @throws DeploymentException |
| */ |
| private void setClassLoaders(String axis2repoURI) throws DeploymentException { |
| ClassLoader sysClassLoader = |
| Utils.getClassLoader(Thread.currentThread().getContextClassLoader(), axis2repoURI); |
| |
| axisConfig.setSystemClassLoader(sysClassLoader); |
| if (servicesDir.exists()) { |
| axisConfig.setServiceClassLoader( |
| Utils.getClassLoader(axisConfig.getSystemClassLoader(), servicesDir)); |
| } else { |
| axisConfig.setServiceClassLoader(axisConfig.getSystemClassLoader()); |
| } |
| |
| if (modulesDir.exists()) { |
| axisConfig.setModuleClassLoader(Utils.getClassLoader(axisConfig.getSystemClassLoader(), |
| modulesDir)); |
| } else { |
| axisConfig.setModuleClassLoader(axisConfig.getSystemClassLoader()); |
| } |
| } |
| |
| /** |
| * Sets hotDeployment and hot update. |
| */ |
| private void setDeploymentFeatures() { |
| String value; |
| Parameter parahotdeployment = axisConfig.getParameter(TAG_HOT_DEPLOYMENT); |
| Parameter parahotupdate = axisConfig.getParameter(TAG_HOT_UPDATE); |
| // Parameter paraantiJARLocking = axisConfig.getParameter(TAG_ANTI_JAR_LOCKING); |
| |
| if (parahotdeployment != null) { |
| value = (String) parahotdeployment.getValue(); |
| |
| if ("false".equalsIgnoreCase(value)) { |
| hotDeployment = false; |
| } |
| } |
| |
| if (parahotupdate != null) { |
| value = (String) parahotupdate.getValue(); |
| |
| if ("false".equalsIgnoreCase(value)) { |
| hotUpdate = false; |
| } |
| } |
| |
| if (parahotupdate != null) { |
| value = (String) parahotupdate.getValue(); |
| |
| if ("true".equalsIgnoreCase(value)) { |
| antiJARLocking = true; |
| } |
| } |
| String serviceDirPara = (String) |
| axisConfig.getParameterValue(DeploymentConstants.SERVICE_DIR_PATH); |
| if (serviceDirPara != null) { |
| servicesPath = serviceDirPara; |
| } |
| |
| String moduleDirPara = (String) |
| axisConfig.getParameterValue(DeploymentConstants.MODULE_DRI_PATH); |
| if (moduleDirPara != null) { |
| modulesPath = moduleDirPara; |
| } |
| } |
| |
| /** |
| * Creates directories for modules/services, copies configuration xml from class loader if necessary |
| * |
| * @param repositoryName |
| */ |
| |
| private void prepareRepository(String repositoryName) { |
| File repository = new File(repositoryName); |
| if (servicesPath != null) { |
| servicesDir = new File(servicesPath); |
| if (!servicesDir.exists()) { |
| servicesDir = new File(repository, servicesPath); |
| } |
| } else { |
| servicesDir = new File(repository, DeploymentConstants.SERVICE_PATH); |
| } |
| if (!servicesDir.exists()) { |
| log.info(Messages.getMessage("noservicedirfound", getRepositoryPath(repository))); |
| } |
| if (modulesPath != null) { |
| modulesDir = new File(modulesPath); |
| if (!modulesDir.exists()) { |
| modulesDir = new File(repository, modulesPath); |
| } |
| } else { |
| modulesDir = new File(repository, DeploymentConstants.MODULE_PATH); |
| } |
| if (!modulesDir.exists()) { |
| log.info(Messages.getMessage("nomoduledirfound", getRepositoryPath(repository))); |
| } |
| } |
| |
| private String getRepositoryPath(File repository) { |
| try { |
| return repository.getCanonicalPath(); |
| } catch (IOException e) { |
| return repository.getAbsolutePath(); |
| } |
| } |
| |
| private ArrayList getFileList(URL fileListUrl) { |
| ArrayList fileList = new ArrayList(); |
| InputStream in; |
| try { |
| in = fileListUrl.openStream(); |
| } catch (IOException e) { |
| return fileList; |
| } |
| BufferedReader input = null; |
| try { |
| input = new BufferedReader(new InputStreamReader(in)); |
| String line; |
| while ((line = input.readLine()) != null) { |
| line = line.trim(); |
| if (line.length() > 0) { |
| fileList.add(line); |
| } |
| } |
| } catch (IOException ex) { |
| ex.printStackTrace(); |
| } finally { |
| try { |
| if (input != null) { |
| input.close(); |
| } |
| } |
| catch (IOException ex) { |
| ex.printStackTrace(); |
| } |
| } |
| return fileList; |
| } |
| |
| public String getWebLocationString() { |
| return webLocationString; |
| } |
| |
| public void setWebLocationString(String webLocationString) { |
| this.webLocationString = webLocationString; |
| } |
| |
| public void setConfigContext(ConfigurationContext configContext) { |
| this.configContext = configContext; |
| } |
| |
| /** |
| * Builds ModuleDescription for a given module archive file. This does not |
| * called the init method since there is no reference to configuration context |
| * so who ever create module using this has to called module.init if it is |
| * required |
| * |
| * @param modulearchive : Actual module archive file |
| * @param config : AxisConfiguration : for get classloaders etc.. |
| * @throws org.apache.axis2.deployment.DeploymentException |
| * |
| */ |
| public static AxisModule buildModule(File modulearchive, |
| AxisConfiguration config) |
| throws DeploymentException { |
| AxisModule axismodule; |
| try { |
| ArchiveFileData currentArchiveFile = new ArchiveFileData(modulearchive, |
| DeploymentConstants.TYPE_MODULE, false); |
| axismodule = new AxisModule(); |
| ArchiveReader archiveReader = new ArchiveReader(); |
| |
| currentArchiveFile.setClassLoader(false, config.getModuleClassLoader()); |
| axismodule.setModuleClassLoader(currentArchiveFile.getClassLoader()); |
| archiveReader.readModuleArchive(currentArchiveFile, axismodule, |
| false, config); |
| ClassLoader moduleClassLoader = axismodule.getModuleClassLoader(); |
| Flow inflow = axismodule.getInFlow(); |
| |
| if (inflow != null) { |
| Utils.addFlowHandlers(inflow, moduleClassLoader); |
| } |
| |
| Flow outFlow = axismodule.getOutFlow(); |
| |
| if (outFlow != null) { |
| Utils.addFlowHandlers(outFlow, moduleClassLoader); |
| } |
| |
| Flow faultInFlow = axismodule.getFaultInFlow(); |
| |
| if (faultInFlow != null) { |
| Utils.addFlowHandlers(faultInFlow, moduleClassLoader); |
| } |
| |
| Flow faultOutFlow = axismodule.getFaultOutFlow(); |
| |
| if (faultOutFlow != null) { |
| Utils.addFlowHandlers(faultOutFlow, moduleClassLoader); |
| } |
| } catch (AxisFault axisFault) { |
| throw new DeploymentException(axisFault); |
| } |
| return axismodule; |
| } |
| |
| /** |
| * Fills an axisservice object using services.xml. First creates |
| * an axisservice object using WSDL and then fills it using the given services.xml. |
| * Loads all the required class and builds the chains, finally adds the |
| * servicecontext to EngineContext and axisservice into EngineConfiguration. |
| * |
| * @param serviceInputStream |
| * @param classLoader |
| * @return Returns AxisService. |
| * @throws DeploymentException |
| */ |
| public static AxisService buildService(InputStream serviceInputStream, |
| ClassLoader classLoader, |
| ConfigurationContext configCtx) |
| throws DeploymentException { |
| AxisService axisService = new AxisService(); |
| try { |
| |
| AxisConfiguration axisConfig = configCtx.getAxisConfiguration(); |
| Parameter parahotupdate = axisConfig.getParameter(TAG_HOT_UPDATE); |
| boolean antiJARLocking = true; |
| if (parahotupdate != null) { |
| String value = (String) parahotupdate.getValue(); |
| |
| if ("false".equalsIgnoreCase(value)) { |
| antiJARLocking = false; |
| } |
| } |
| ArchiveFileData currentArchiveFile = new ArchiveFileData( |
| DeploymentConstants.TYPE_SERVICE, "", antiJARLocking); |
| currentArchiveFile.setClassLoader(classLoader); |
| |
| ServiceBuilder builder = new ServiceBuilder(serviceInputStream, configCtx, |
| axisService); |
| |
| builder.populateService(builder.buildOM()); |
| } catch (AxisFault axisFault) { |
| throw new DeploymentException(axisFault); |
| } catch (XMLStreamException e) { |
| throw new DeploymentException(e); |
| } |
| |
| return axisService; |
| } |
| |
| /** |
| * To build a AxisServiceGroup for a given services.xml |
| * You have to add the created group into AxisConfig |
| * |
| * @param servicesxml : inpupstream create using services.xml |
| * @param classLoader : corresponding class loader to load the class |
| * @param serviceGroupName : name of the service group |
| * @throws AxisFault |
| */ |
| public static AxisServiceGroup buildServiceGroup(InputStream servicesxml, |
| ClassLoader classLoader, |
| String serviceGroupName, |
| ConfigurationContext configCtx, |
| ArchiveReader archiveReader, |
| HashMap wsdlServices) throws AxisFault { |
| ArchiveFileData currentArchiveFile = new ArchiveFileData( |
| DeploymentConstants.TYPE_SERVICE, "", false); |
| currentArchiveFile.setClassLoader(classLoader); |
| AxisServiceGroup serviceGroup = new AxisServiceGroup(); |
| serviceGroup.setServiceGroupClassLoader(classLoader); |
| serviceGroup.setServiceGroupName(serviceGroupName); |
| AxisConfiguration axisConfig = configCtx.getAxisConfiguration(); |
| try { |
| ArrayList serviceList = archiveReader.buildServiceGroup(servicesxml, |
| currentArchiveFile, serviceGroup, |
| wsdlServices, configCtx); |
| fillServiceGroup(serviceGroup, serviceList, null, axisConfig); |
| return serviceGroup; |
| } catch (XMLStreamException e) { |
| throw new AxisFault(e); |
| } |
| } |
| |
| public File getServicesDir() { |
| return servicesDir; |
| } |
| |
| public File getModulesDir() { |
| return modulesDir; |
| } |
| } |