You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by us...@apache.org on 2012/01/30 08:48:17 UTC
svn commit: r1237557 [2/2] - in /synapse/trunk/java: modules/core/
modules/core/src/main/java/org/apache/synapse/
modules/core/src/main/java/org/apache/synapse/config/
modules/core/src/main/java/org/apache/synapse/config/xml/
modules/core/src/main/java...
Added: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/libraries/util/LibDeployerUtils.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/libraries/util/LibDeployerUtils.java?rev=1237557&view=auto
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/libraries/util/LibDeployerUtils.java (added)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/libraries/util/LibDeployerUtils.java Mon Jan 30 07:48:16 2012
@@ -0,0 +1,460 @@
+/*
+* Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+*
+* WSO2 Inc. 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.synapse.libraries.util;
+
+import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.impl.builder.StAXOMBuilder;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.SynapseException;
+import org.apache.synapse.deployers.SynapseArtifactDeploymentException;
+import org.apache.synapse.libraries.imports.SynapseImport;
+import org.apache.synapse.libraries.model.Library;
+import org.apache.synapse.libraries.model.LibraryArtifact;
+import org.apache.synapse.libraries.model.SynapseLibrary;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import java.io.*;
+import java.util.*;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+public class LibDeployerUtils {
+
+ public static final String APP_UNZIP_DIR;
+
+ static {
+ String javaTempDir = System.getProperty("java.io.tmpdir");
+ APP_UNZIP_DIR = javaTempDir.endsWith(File.separator) ?
+ javaTempDir + LibDeployerConstants.SYNAPSE_LIBS :
+ javaTempDir + File.separator + LibDeployerConstants.SYNAPSE_LIBS;
+ createDir(APP_UNZIP_DIR);
+ }
+
+ private static final Log log = LogFactory.getLog(LibDeployerUtils.class);
+
+
+
+ public static Library createSynapseLibrary(String libPath) {
+ String libFilePath = LibDeployerUtils.formatPath(libPath);
+ //extract
+ String extractPath = LibDeployerUtils.extractSynapseLib(libFilePath);
+ //create synapse lib metadata
+ SynapseLibrary synapseLib = LibDeployerUtils.populateDependencies(extractPath + LibDeployerConstants.ARTIFACTS_XML);
+ //resolve synapse lib artifacts
+ LibDeployerUtils.searchAndResolveDependencies(extractPath, synapseLib);
+ return synapseLib;
+ }
+
+ /**
+ * populate Dependencies using main root artifacts.xml.. Schema for artifacts.xml is follwing
+ *
+ *<artifacts>
+ <artifact name="SampleLib" package="synapse.sample" >
+ <dependency artifact="templates1" /> +
+ <description>sample synapse library</description> ?
+ </artifact>
+ </artifacts>
+ *
+ * @param libXmlPath
+ * @return
+ */
+ private static SynapseLibrary populateDependencies(String libXmlPath) {
+ File f = new File(libXmlPath);
+ if (!f.exists()) {
+ throw new SynapseException("artifacts.xml file not found at : " + libXmlPath);
+ }
+ InputStream xmlInputStream = null;
+ try {
+ xmlInputStream = new FileInputStream(f);
+ OMElement documentElement = new StAXOMBuilder(xmlInputStream).getDocumentElement();
+ if (documentElement == null) {
+ throw new SynapseArtifactDeploymentException("Document element for artifacts.xml is " +
+ "null. Can't build " +
+ "the synapse library configuration");
+ }
+ Iterator artifactItr = documentElement.getChildrenWithLocalName(LibDeployerConstants.ARTIFACT);
+ SynapseLibrary mainSynLibArtifact = null;
+ mainSynLibArtifact = createSynapseLibraryWithDeps(((OMElement) artifactItr.next()));
+ if (mainSynLibArtifact == null) {
+ throw new SynapseArtifactDeploymentException("artifacts.xml is invalid. <artifact> element" +
+ " Not Found ");
+ }
+ return mainSynLibArtifact;
+ } catch (FileNotFoundException e) {
+ throw new SynapseArtifactDeploymentException("artifacts.xml File cannot be loaded from " + libXmlPath, e);
+
+ } catch (XMLStreamException e) {
+ throw new SynapseArtifactDeploymentException("Error while parsing the artifacts.xml file ", e);
+ } finally {
+ if (xmlInputStream != null) {
+ try {
+ xmlInputStream.close();
+ } catch (IOException e) {
+ log.error("Error while closing input stream.", e);
+ }
+ }
+ }
+ }
+
+ /**
+ * Builds the Artifact object when an artifact element is given
+ *
+ * @param artifactEle - artifact OMElement
+ * @return created Artifact object
+ */
+ private static SynapseLibrary createSynapseLibraryWithDeps(OMElement artifactEle) {
+ if (artifactEle == null) {
+ return null;
+ }
+ SynapseLibrary synLib = new SynapseLibrary(readAttribute(artifactEle, LibDeployerConstants.NAME),
+ readAttribute(artifactEle, LibDeployerConstants.PACKAGE_ATTR));
+ synLib.setDescription(readChildText(artifactEle,LibDeployerConstants.DESCRIPTION_ELEMENT));
+ // read the dependencies
+ Iterator itr = artifactEle.getChildrenWithLocalName(LibDeployerConstants.DEPENDENCY);
+ while (itr.hasNext()) {
+ OMElement depElement = (OMElement) itr.next();
+ // create a synLib for each dependency and add to the root synLib
+ LibraryArtifact.Dependency dep = new LibraryArtifact.Dependency(readAttribute(depElement,
+ LibDeployerConstants.ARTIFACT));
+ synLib.addDependency(dep);
+ }
+
+ return synLib;
+ }
+
+
+ /**
+ * Deploys all artifacts under a root artifact..
+ *
+ * @param rootDirPath - root dir of the extracted artifact
+ * @param library - lib instance
+ */
+ private static void searchAndResolveDependencies(String rootDirPath,
+ SynapseLibrary library) {
+ List<LibraryArtifact> libraryArtifacts = new ArrayList<LibraryArtifact>();
+ File extractedDir = new File(rootDirPath);
+ File[] allFiles = extractedDir.listFiles();
+ if (allFiles == null) {
+ return;
+ }
+
+
+ // search for all directories under the extracted path
+ for (File artifactDirectory : allFiles) {
+ if (!artifactDirectory.isDirectory()) {
+ continue;
+ }
+
+ String directoryPath = formatPath(artifactDirectory.getAbsolutePath());
+ String artifactXmlPath = directoryPath + File.separator + LibDeployerConstants.ARTIFACT_XML;
+
+ File f = new File(artifactXmlPath);
+ // if the artifact.xml not found, ignore this dir
+ if (!f.exists()) {
+ continue;
+ }
+
+ LibraryArtifact artifact = null;
+ InputStream xmlInputStream = null;
+ try {
+ xmlInputStream = new FileInputStream(f);
+ artifact = buildArtifact(library, xmlInputStream, directoryPath);
+ } catch (FileNotFoundException e) {
+ log.warn("Error while resolving synapse lib dir :"
+ + artifactDirectory.getName() +
+ " artifacts.xml File cannot be loaded " +
+ "from " + artifactXmlPath, e);
+ } catch (Exception e) {
+ log.warn("Error ocurred while resolving synapse lib dir :"
+ + artifactDirectory.getName() +
+ " for artifacts.xml path" + artifactXmlPath, e);
+ } finally {
+ if (xmlInputStream != null) {
+ try {
+ xmlInputStream.close();
+ } catch (IOException e) {
+ log.error("Error while closing input stream.", e);
+ }
+ }
+ }
+
+ if (artifact == null) {
+ log.warn("Could not build lib artifact for path : " + directoryPath + " Synapse Library :" +
+ library.getQName() + ". Continue searching for other lib artifacts");
+ continue;
+
+ }
+ libraryArtifacts.add(artifact);
+ }
+ boolean isDepsResolved = library.resolveDependencies(libraryArtifacts);
+ if (!isDepsResolved) {
+ throw new SynapseArtifactDeploymentException("Error when resolving Dependencies for lib : " + library.toString());
+ }
+ }
+
+ /**
+ * Builds the artifact from the given input steam and adds it as a dependency in the provided
+ * parent Synapse library artifact
+ *
+ * @param library
+ * @param artifactXmlStream - xml input stream of the artifact.xml
+ * @param directoryPath
+ * @return - Artifact instance if successfull. otherwise null..
+ */
+ private static LibraryArtifact buildArtifact(SynapseLibrary library, InputStream artifactXmlStream, String directoryPath) {
+ LibraryArtifact artifact = null;
+ try {
+ OMElement artElement = new StAXOMBuilder(artifactXmlStream).getDocumentElement();
+
+ if (LibDeployerConstants.ARTIFACT.equals(artElement.getLocalName())) {
+ artifact = populateLibraryArtifact(artElement, directoryPath, null, library);
+ } else {
+ log.error("artifact.xml is invalid. Error occurred while resolving Synapse Library : "
+ + library.getQName());
+ return null;
+ }
+ } catch (XMLStreamException e) {
+ throw new SynapseArtifactDeploymentException("Error parsing artifact.xml for path : " +
+ directoryPath ,e);
+ }
+
+ if (artifact == null || artifact.getName() == null) {
+ log.error("Invalid artifact found in Synapse Library : "
+ + library.getQName() );
+ return null;
+ }
+ return artifact;
+ }
+
+
+ /**
+ * Builds the Artifact object when an root artifact element is given . Schema for artifact.xml
+ * is as follows
+ * <artifact name="templates1" type="synapse/template" >
+
+ <subArtifacts>
+ <artifact name="greet_func1" >
+ <file>templ1_ns1.xml</file>
+ <description>sample synapse library artifact Description</description> ?
+ </artifact> *
+ </subArtifacts> *
+
+ <description>sample synapse library artifact Description</description> ?
+ </artifact>
+ *
+ * @param artifactEle - artifact OMElement
+ * @return created Artifact object
+ */
+ private static LibraryArtifact populateLibraryArtifact(OMElement artifactEle, String artifactPath,
+ LibraryArtifact parent , SynapseLibrary library) {
+ if (artifactEle == null || artifactPath == null ) {
+ return null;
+ }
+
+ LibraryArtifact artifact = new LibraryArtifact(readAttribute(artifactEle, LibDeployerConstants.NAME));
+ artifact.setParent(parent);
+ artifact.setType(readAttribute(artifactEle, LibDeployerConstants.TYPE));
+ artifact.setPath(artifactPath);
+
+ artifact.setDescription(readChildText(artifactEle,LibDeployerConstants.DESCRIPTION_ELEMENT));
+ //add a description of this artifact(if availalbe) to Synapse Library
+ library.addArtifactDescription(artifact);
+ // read the subArtifacts
+ OMElement subArtifactsElement = artifactEle
+ .getFirstChildWithName(new QName(LibDeployerConstants.SUB_ARTIFACTS));
+ if (subArtifactsElement != null) {
+ Iterator subArtItr = subArtifactsElement.getChildrenWithLocalName(LibDeployerConstants.ARTIFACT);
+ while (subArtItr.hasNext()) {
+ // as this is also an artifact, use recursion
+ LibraryArtifact subArtifact = populateLibraryArtifact((OMElement) subArtItr.next(), artifactPath, artifact, library);
+ artifact.addSubArtifact(subArtifact);
+ }
+ }
+
+ // read and check for files
+ Iterator fileItr = artifactEle.getChildrenWithLocalName(LibDeployerConstants.FILE);
+ while (fileItr.hasNext()) {
+ OMElement fileElement = (OMElement) fileItr.next();
+ artifact.setupFile(fileElement.getText());
+ }
+ return artifact;
+ }
+
+ public static void loadLibArtifacts(SynapseImport synImport, Library library) {
+ if (synImport.getLibName().equals(library.getQName().getLocalPart()) &&
+ synImport.getLibPackage().equals(library.getPackage())) {
+ library.loadLibrary();
+ }
+ }
+
+ public static <T> T getLibArtifact(Map<String, Library> librarySet, String key, Class<T> type) {
+ for (Library synapseLibrary : librarySet.values()) {
+ try {
+ T artifact = (T) synapseLibrary.getArtifact(key);
+ if (artifact != null) {
+ return artifact;
+ }
+ } catch (Exception e) {
+ //ignore
+ }
+ }
+ return null;
+ }
+
+ public static String getQualifiedName(SynapseImport synImport){
+ return new QName(synImport.getLibPackage(),synImport.getLibName()).toString();
+ }
+
+
+ ///////////////////////
+ ////////////////// Start Common Utility Methods
+ /**
+ * Reads an attribute in the given element and returns the value of that attribute
+ *
+ * @param element - Element to search
+ * @param attName - attribute name
+ * @return if the attribute found, return value. else null.
+ */
+ public static String readAttribute(OMElement element, String attName) {
+ if (element == null) {
+ return null;
+ }
+ OMAttribute temp = element.getAttribute(new QName(attName));
+ if (temp != null) {
+ return temp.getAttributeValue();
+ }
+ return null;
+ }
+
+ public static String readChildText(OMElement element, String ln) {
+ return readChildText(element, ln, null);
+ }
+
+ /**
+ * Reads a text node which is in a child element of the given element and returns the text
+ * value.
+ *
+ * @param element - Element to search
+ * @param ln - Child element name
+ * @param ns - Child element namespace
+ * @return if the child text element found, return text value. else null.
+ */
+ public static String readChildText(OMElement element, String ln, String ns) {
+ if (element == null) {
+ return null;
+ }
+ OMElement temp = element.getFirstChildWithName(new QName(ns, ln));
+ if (temp != null) {
+ return temp.getText();
+ }
+ return null;
+ }
+
+
+ /**
+ * Extract the Synapse Library at the provided path to the java temp dir. Return the
+ * extracted location
+ *
+ * @param libPath - Absolute path of the Synapse Lib archive file
+ * @return - extracted location
+ * @throws SynapseException - error on extraction
+ */
+ public static String extractSynapseLib(String libPath) throws SynapseException {
+ libPath = formatPath(libPath);
+ String fileName = libPath.substring(libPath.lastIndexOf('/') + 1);
+ String dest = APP_UNZIP_DIR + File.separator + System.currentTimeMillis() +
+ fileName + File.separator;
+ createDir(dest);
+
+ try {
+ extract(libPath, dest);
+ } catch (IOException e) {
+ throw new SynapseException("Error while extracting Synapse Library : " + fileName, e);
+ }
+ return dest;
+ }
+
+ /**
+ * Format the string paths to match any platform.. windows, linux etc..
+ *
+ * @param path - input file path
+ * @return formatted file path
+ */
+ public static String formatPath(String path) {
+ // removing white spaces
+ path = path.replaceAll("\\b\\s+\\b", "%20");
+ // replacing all "\" with "/"
+ return path.replace('\\', '/');
+ }
+
+ private static void extract(String sourcePath, String destPath) throws IOException {
+ Enumeration entries;
+ ZipFile zipFile;
+
+ zipFile = new ZipFile(sourcePath);
+ entries = zipFile.entries();
+
+ while (entries.hasMoreElements()) {
+ ZipEntry entry = (ZipEntry) entries.nextElement();
+ // we don't need to copy the META-INF dir
+ if (entry.getName().startsWith("META-INF/")) {
+ continue;
+ }
+ // if the entry is a directory, create a new dir
+ if (entry.isDirectory()) {
+ createDir(destPath + entry.getName());
+ continue;
+ }
+ // if the entry is a file, write the file
+ copyInputStream(zipFile.getInputStream(entry),
+ new BufferedOutputStream(new FileOutputStream(destPath + entry.getName())));
+ }
+ zipFile.close();
+ }
+
+
+ public static void createDir(String path) {
+ File temp = new File(path);
+ if (!temp.exists() && !temp.mkdir()) {
+ log.error("Error while creating directory : " + path);
+ }
+ }
+
+ private static void copyInputStream(InputStream in, OutputStream out)
+ throws IOException {
+ byte[] buffer = new byte[40960];
+ int len;
+
+ while ((len = in.read(buffer)) >= 0) {
+ out.write(buffer, 0, len);
+ }
+
+ in.close();
+ out.close();
+ }
+
+ /////////////////// End Of Common Utility Methods
+
+
+ public static void main(String[] args) {
+ new SynapseLibrary(null, null).resolveDependencies(null);
+ }
+}
Modified: synapse/trunk/java/repository/conf/axis2.xml
URL: http://svn.apache.org/viewvc/synapse/trunk/java/repository/conf/axis2.xml?rev=1237557&r1=1237556&r2=1237557&view=diff
==============================================================================
--- synapse/trunk/java/repository/conf/axis2.xml (original)
+++ synapse/trunk/java/repository/conf/axis2.xml Mon Jan 30 07:48:16 2012
@@ -93,6 +93,8 @@
<deployer extension="xml" directory="conf/synapse-config/message-stores" class="org.apache.synapse.deployers.MessageStoreDeployer"/>
<deployer extension="xml" directory="conf/synapse-config/message-processors" class="org.apache.synapse.deployers.MessageProcessorDeployer"/>
<deployer extension="xml" directory="conf/synapse-config/api" class="org.apache.synapse.deployers.APIDeployer"/>
+ <deployer extension="xml" directory="conf/synapse-config/imports" class="org.apache.synapse.deployers.ImportDeployer"/>
+ <deployer extension="zip" directory="conf/synapse-libs" class="org.apache.synapse.deployers.LibraryArtifactDeployer"/>
<!-- Following parameter will set the host name for the epr-->
<!--<parameter name="hostname" locked="true">myhost.com</parameter>-->