| /* |
| * 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.rmi.deploy; |
| |
| import org.apache.axiom.om.util.StAXUtils; |
| import org.apache.axis2.AxisFault; |
| import org.apache.axis2.Constants; |
| import org.apache.axis2.context.ConfigurationContext; |
| import org.apache.axis2.deployment.Deployer; |
| import org.apache.axis2.deployment.DeploymentException; |
| import org.apache.axis2.deployment.repository.util.DeploymentFileData; |
| import org.apache.axis2.engine.AxisConfiguration; |
| import org.apache.axis2.rmi.Configurator; |
| import org.apache.axis2.rmi.databind.SimpleTypeHandler; |
| import org.apache.axis2.rmi.databind.XmlStreamParser; |
| import org.apache.axis2.rmi.deploy.config.ClassInfo; |
| import org.apache.axis2.rmi.deploy.config.Config; |
| import org.apache.axis2.rmi.deploy.config.CustomClassInfo; |
| import org.apache.axis2.rmi.deploy.config.FieldInfo; |
| import org.apache.axis2.rmi.deploy.config.PackageToNamespaceMap; |
| import org.apache.axis2.rmi.deploy.config.Service; |
| import org.apache.axis2.rmi.exception.ConfigFileReadingException; |
| import org.apache.axis2.rmi.exception.MetaDataPopulateException; |
| import org.apache.axis2.rmi.exception.SchemaGenerationException; |
| import org.apache.axis2.rmi.exception.XmlParsingException; |
| import org.apache.axis2.rmi.metadata.Parameter; |
| import org.apache.axis2.util.Loader; |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| |
| import javax.xml.stream.XMLStreamException; |
| import javax.xml.stream.XMLStreamReader; |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.zip.ZipEntry; |
| import java.util.zip.ZipInputStream; |
| |
| |
| public class RMIServiceDeployer implements Deployer { |
| |
| private static Log log = LogFactory.getLog(RMIServiceDeployer.class); |
| private ConfigurationContext configurationContext; |
| private AxisConfiguration axisConfiguration; |
| |
| public void init(ConfigurationContext configCtx) { |
| this.configurationContext = configCtx; |
| this.axisConfiguration = this.configurationContext.getAxisConfiguration(); |
| |
| } |
| |
| public void deploy(DeploymentFileData deploymentFileData) throws DeploymentException { |
| boolean isDirectory = deploymentFileData.getFile().isDirectory(); |
| try { |
| deploymentFileData.setClassLoader(isDirectory, |
| this.axisConfiguration.getServiceClassLoader(), |
| (File)this.axisConfiguration.getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR)); |
| |
| ClassLoader deploymentClassLoader = deploymentFileData.getClassLoader(); |
| String absolutePath = deploymentFileData.getFile().getAbsolutePath(); |
| |
| // gettting the file reader for zipinput stream |
| Config configObject = getConfig(absolutePath); |
| |
| Configurator configurator = getConfigurator(configObject, deploymentClassLoader); |
| |
| Service[] services = configObject.getServices().getService(); |
| ClassDeployer classDeployer = |
| new ClassDeployer(configurationContext, deploymentClassLoader, configurator); |
| Class serviceClass; |
| |
| for (int i = 0; i < services.length; i++) { |
| serviceClass = Loader.loadClass(deploymentClassLoader, services[i].getServiceClass()); |
| classDeployer.deployClass(serviceClass); |
| } |
| log.info("Deployed RMI Services with deployment file " + deploymentFileData.getName()); |
| |
| } catch (ClassNotFoundException e) { |
| throw new DeploymentException("Service class not found", e); |
| } catch (AxisFault axisFault) { |
| throw new DeploymentException("axis fault", axisFault); |
| } catch (IOException e) { |
| throw new DeploymentException("zip file not found", e); |
| } catch (ConfigFileReadingException e) { |
| throw new DeploymentException("config file reading problem", e); |
| } |
| } |
| |
| private Configurator getConfigurator(Config configObject, ClassLoader deploymentClassLoader) |
| throws ClassNotFoundException, DeploymentException { |
| Configurator configurator = new Configurator(); |
| |
| if (configObject.getExtensionClasses() != null) { |
| String[] extensionClasses = configObject.getExtensionClasses().getExtensionClass(); |
| if (extensionClasses != null) { |
| Class extensionClass; |
| for (int i = 0; i < extensionClasses.length; i++) { |
| extensionClass = Loader.loadClass(deploymentClassLoader, extensionClasses[i]); |
| configurator.addExtension(extensionClass); |
| } |
| } |
| } |
| |
| if (configObject.getPackageToNamespaceMapings() != null) { |
| PackageToNamespaceMap[] packageToNamespaceMapings = |
| configObject.getPackageToNamespaceMapings().getPackageToNamespaceMap(); |
| if (packageToNamespaceMapings != null) { |
| for (int i = 0; i < packageToNamespaceMapings.length; i++) { |
| configurator.addPackageToNamespaceMaping(packageToNamespaceMapings[i].getPackageName(), |
| packageToNamespaceMapings[i].getNamespace()); |
| } |
| } |
| } |
| |
| // set the simple type data handler if it is set |
| if ((configObject.getSimpleDataHandlerClass() != null) |
| && (configObject.getSimpleDataHandlerClass().trim().length() > 0)){ |
| Class simpleTypeHandlerClass = |
| Loader.loadClass(deploymentClassLoader,configObject.getSimpleDataHandlerClass()); |
| try { |
| SimpleTypeHandler simpleTypeHandler = (SimpleTypeHandler) simpleTypeHandlerClass.newInstance(); |
| configurator.setSimpleTypeHandler(simpleTypeHandler); |
| } catch (InstantiationException e) { |
| throw new DeploymentException("Can not instantiate simple type handler",e); |
| } catch (IllegalAccessException e) { |
| throw new DeploymentException("Can not instantiate simple type handler",e); |
| } |
| } |
| |
| // setting the custom class info |
| ClassInfo[] classInfos = null; |
| FieldInfo[] filsInfos = null; |
| org.apache.axis2.rmi.config.ClassInfo classInfo; |
| Class customClass = null; |
| if (configObject.getCustomClassInfo() != null) { |
| CustomClassInfo customClassInfo = configObject.getCustomClassInfo(); |
| if ((customClassInfo.getClassInfo() != null) && (customClassInfo.getClassInfo().length > 0)) { |
| classInfos = customClassInfo.getClassInfo(); |
| for (int i = 0; i < classInfos.length; i++) { |
| |
| if ((classInfos[i].getFieldInfo() != null) && |
| (classInfos[i].getFieldInfo().length > 0)){ |
| customClass = Loader.loadClass(deploymentClassLoader,classInfos[i].getClassName()); |
| classInfo = new org.apache.axis2.rmi.config.ClassInfo(customClass); |
| filsInfos = classInfos[i].getFieldInfo(); |
| for (int j = 0; j < filsInfos.length; j++) { |
| classInfo.addFieldInfo( |
| new org.apache.axis2.rmi.config.FieldInfo( |
| filsInfos[j].getJavaName(), |
| filsInfos[j].getXmlName(), |
| filsInfos[j].isElement())); |
| } |
| configurator.addClassInfo(classInfo); |
| } |
| } |
| } |
| } |
| return configurator; |
| } |
| |
| private Config getConfig(String zipFilePath) throws ConfigFileReadingException { |
| try { |
| InputStream configFileInputStream = getConfigFileInputStream(zipFilePath); |
| XMLStreamReader xmlReader = StAXUtils.createXMLStreamReader(configFileInputStream); |
| |
| Configurator configurator = new Configurator(); |
| configurator.addPackageToNamespaceMaping("org.apache.axis2.rmi.deploy.config", |
| "http://ws.apache.org/axis2/rmi"); |
| |
| // add configurator details to handle custom class info |
| org.apache.axis2.rmi.config.ClassInfo classInfo = new org.apache.axis2.rmi.config.ClassInfo(FieldInfo.class); |
| classInfo.addFieldInfo(new org.apache.axis2.rmi.config.FieldInfo("javaName", null, false)); |
| classInfo.addFieldInfo(new org.apache.axis2.rmi.config.FieldInfo("xmlName", null, false)); |
| classInfo.addFieldInfo(new org.apache.axis2.rmi.config.FieldInfo("element", "isElement", false)); |
| configurator.addClassInfo(classInfo); |
| |
| classInfo = new org.apache.axis2.rmi.config.ClassInfo(ClassInfo.class); |
| classInfo.addFieldInfo(new org.apache.axis2.rmi.config.FieldInfo("className", null, false)); |
| configurator.addClassInfo(classInfo); |
| |
| |
| Map processedTypeMap = new HashMap(); |
| Map processedSchemaMap = new HashMap(); |
| Parameter parameter = new Parameter(Config.class, "config"); |
| parameter.setNamespace("http://ws.apache.org/axis2/rmi"); |
| parameter.populateMetaData(configurator, processedTypeMap); |
| parameter.generateSchema(configurator, processedSchemaMap); |
| |
| XmlStreamParser xmlStreamParser = new XmlStreamParser(processedTypeMap, configurator, processedSchemaMap); |
| return (Config) xmlStreamParser.getObjectForParameter(xmlReader, parameter); |
| } catch (IOException e) { |
| throw new ConfigFileReadingException("Can not read configuration file", e); |
| } catch (XMLStreamException e) { |
| throw new ConfigFileReadingException("xml stream exception with configuration file", e); |
| } catch (MetaDataPopulateException e) { |
| throw new ConfigFileReadingException("metadata population problem with configuration file", e); |
| } catch (XmlParsingException e) { |
| throw new ConfigFileReadingException("xml stream reading problem with configuration file", e); |
| } catch (SchemaGenerationException e) { |
| throw new ConfigFileReadingException("problem in generating schema", e); |
| } |
| } |
| |
| private InputStream getConfigFileInputStream(String zipFilePath) throws IOException { |
| |
| ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipFilePath)); |
| ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); |
| ZipEntry zipEntry; |
| byte[] buffer = new byte[1024]; |
| int read; |
| while ((zipEntry = zipInputStream.getNextEntry()) != null) { |
| if (zipEntry.getName().equals("META-INF" + File.separator + "config.xml")) { |
| while ((read = zipInputStream.read(buffer)) > 0) { |
| byteArrayOutputStream.write(buffer, 0, read); |
| } |
| } |
| |
| } |
| return new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); |
| } |
| |
| public void setDirectory(String directory) { |
| |
| } |
| |
| public void setExtension(String extension) { |
| |
| } |
| |
| public void unDeploy(String fileName) throws DeploymentException { |
| //TODO: implement undeploy |
| } |
| } |