You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by pd...@apache.org on 2006/09/13 20:19:23 UTC

svn commit: r443058 - in /incubator/servicemix/trunk/tooling/jbi-maven-plugin/src/main/java/org/apache/servicemix/maven/plugin/jbi: GenerateServiceUnitDescriptorMojo.java JbiServiceFileAnalyzer.java

Author: pdodds
Date: Wed Sep 13 11:19:22 2006
New Revision: 443058

URL: http://svn.apache.org/viewvc?view=rev&rev=443058
Log:
Implemented new feature that allows you to specify a jbiServicesFile (default location src/main/resources/jbi-services.xml) that can be used to inject the services definition into the jbi.xml for a service unit - this can also be used to override the services generated by a ServiceUnitAnalyzer

Added:
    incubator/servicemix/trunk/tooling/jbi-maven-plugin/src/main/java/org/apache/servicemix/maven/plugin/jbi/JbiServiceFileAnalyzer.java
Modified:
    incubator/servicemix/trunk/tooling/jbi-maven-plugin/src/main/java/org/apache/servicemix/maven/plugin/jbi/GenerateServiceUnitDescriptorMojo.java

Modified: incubator/servicemix/trunk/tooling/jbi-maven-plugin/src/main/java/org/apache/servicemix/maven/plugin/jbi/GenerateServiceUnitDescriptorMojo.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/tooling/jbi-maven-plugin/src/main/java/org/apache/servicemix/maven/plugin/jbi/GenerateServiceUnitDescriptorMojo.java?view=diff&rev=443058&r1=443057&r2=443058
==============================================================================
--- incubator/servicemix/trunk/tooling/jbi-maven-plugin/src/main/java/org/apache/servicemix/maven/plugin/jbi/GenerateServiceUnitDescriptorMojo.java (original)
+++ incubator/servicemix/trunk/tooling/jbi-maven-plugin/src/main/java/org/apache/servicemix/maven/plugin/jbi/GenerateServiceUnitDescriptorMojo.java Wed Sep 13 11:19:22 2006
@@ -66,6 +66,14 @@
 	private Boolean useServiceUnitAnalyzer = Boolean.TRUE;
 
 	/**
+	 * Single directory for extra files to include in the JBI component.
+	 * 
+	 * @parameter expression="${basedir}/src/main/resources/jbi-services.xml"
+	 * @required
+	 */
+	private File jbiServicesFile;
+
+	/**
 	 * The component name.
 	 * 
 	 * @parameter expression="${project.artifactId}"
@@ -177,7 +185,7 @@
 		}
 
 		ClassLoader old = Thread.currentThread().getContextClassLoader();
-		
+
 		try {
 			URLClassLoader newClassLoader = getClassLoader();
 			Thread.currentThread().setContextClassLoader(newClassLoader);
@@ -189,28 +197,29 @@
 			List consumes = new ArrayList();
 			List provides = new ArrayList();
 
-			if (useServiceUnitAnalyzer.booleanValue()) {
-				String serviceUnitAnalyzerClazzName = getServiceUnitAnalyzer();
-
-				// The ServiceUnitAnalyzer should give us the consumes and
-				// provides
-				if (serviceUnitAnalyzerClazzName != null) {
-					ServiceUnitAnalyzer serviceUnitAnalyzer = (ServiceUnitAnalyzer) newClassLoader
-							.loadClass(serviceUnitAnalyzerClazzName)
-							.newInstance();
-					getLog().info(
-							"Created Service Unit Analyzer "
-									+ serviceUnitAnalyzer);
-					serviceUnitAnalyzer.init(serviceUnitArtifactsDir);
-					consumes.addAll(serviceUnitAnalyzer.getConsumes());
-					provides.addAll(serviceUnitAnalyzer.getProvides());
+			String serviceUnitAnalyzerClazzName = getServiceUnitAnalyzer();
+			// The ServiceUnitAnalyzer should give us the consumes and
+			// provides
+			if (serviceUnitAnalyzerClazzName != null) {
+				ServiceUnitAnalyzer serviceUnitAnalyzer = (ServiceUnitAnalyzer) newClassLoader
+						.loadClass(serviceUnitAnalyzerClazzName).newInstance();
+				getLog().info(
+						"Created Service Unit Analyzer " + serviceUnitAnalyzer);
+				serviceUnitAnalyzer.init(serviceUnitArtifactsDir);
+				
+				// Need to determine whether we are using the dummy analyzer
+				// if so we need to give it the services file
+				if (serviceUnitAnalyzer instanceof JbiServiceFileAnalyzer) {
+					((JbiServiceFileAnalyzer)serviceUnitAnalyzer).setJbiServicesFile(jbiServicesFile);
 				}
+				consumes.addAll(serviceUnitAnalyzer.getConsumes());
+				provides.addAll(serviceUnitAnalyzer.getProvides());
+			}
 
-				getLog().info(
-						"generated : consumes " + consumes + " provides "
-								+ provides);
+			getLog().info(
+					"generated : consumes " + consumes + " provides "
+							+ provides);
 
-			}
 			writer.write(descriptor, name, description, uris, consumes,
 					provides);
 		} catch (Exception e) {
@@ -222,18 +231,29 @@
 	}
 
 	private String getServiceUnitAnalyzer() {
-		MavenProject project = getComponentProject();
-		if (project != null) {
-			List plugins = project.getBuild().getPlugins();
-			for (Iterator iterator = plugins.iterator(); iterator.hasNext();) {
-				Plugin plugin = (Plugin) iterator.next();
-				if ("org.apache.servicemix.tooling".equals(plugin.getGroupId())
-						&& "jbi-maven-plugin".equals(plugin.getArtifactId())) {
-					Xpp3Dom o = (Xpp3Dom) plugin.getConfiguration();
-					if (o != null && o.getChild("serviceUnitAnalyzer") != null) {
-						String clazzName = o.getChild("serviceUnitAnalyzer")
-								.getValue();
-						return clazzName;
+		// We need to work out here whether we should use a dummy service unit
+		// analyzer that will examine a local services file or whether
+		// to look for the service unit analyzer from the component
+		if (jbiServicesFile.exists()) {
+			return JbiServiceFileAnalyzer.class.getCanonicalName();
+		}
+		if (useServiceUnitAnalyzer.booleanValue()) {
+			MavenProject project = getComponentProject();
+			if (project != null) {
+				List plugins = project.getBuild().getPlugins();
+				for (Iterator iterator = plugins.iterator(); iterator.hasNext();) {
+					Plugin plugin = (Plugin) iterator.next();
+					if ("org.apache.servicemix.tooling".equals(plugin
+							.getGroupId())
+							&& "jbi-maven-plugin"
+									.equals(plugin.getArtifactId())) {
+						Xpp3Dom o = (Xpp3Dom) plugin.getConfiguration();
+						if (o != null
+								&& o.getChild("serviceUnitAnalyzer") != null) {
+							String clazzName = o
+									.getChild("serviceUnitAnalyzer").getValue();
+							return clazzName;
+						}
 					}
 				}
 			}
@@ -253,8 +273,8 @@
 					&& (artifact.getDependencyTrail().size() == 2)) {
 				MavenProject project = null;
 				try {
-					project = projectBuilder.buildFromRepository(artifact, remoteRepos,
-							localRepo);
+					project = projectBuilder.buildFromRepository(artifact,
+							remoteRepos, localRepo);
 				} catch (ProjectBuildingException e) {
 					getLog().warn(
 							"Unable to determine packaging for dependency : "

Added: incubator/servicemix/trunk/tooling/jbi-maven-plugin/src/main/java/org/apache/servicemix/maven/plugin/jbi/JbiServiceFileAnalyzer.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/tooling/jbi-maven-plugin/src/main/java/org/apache/servicemix/maven/plugin/jbi/JbiServiceFileAnalyzer.java?view=auto&rev=443058
==============================================================================
--- incubator/servicemix/trunk/tooling/jbi-maven-plugin/src/main/java/org/apache/servicemix/maven/plugin/jbi/JbiServiceFileAnalyzer.java (added)
+++ incubator/servicemix/trunk/tooling/jbi-maven-plugin/src/main/java/org/apache/servicemix/maven/plugin/jbi/JbiServiceFileAnalyzer.java Wed Sep 13 11:19:22 2006
@@ -0,0 +1,143 @@
+/*
+ * 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.servicemix.maven.plugin.jbi;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.servicemix.common.packaging.Consumes;
+import org.apache.servicemix.common.packaging.Provides;
+import org.apache.servicemix.common.packaging.ServiceUnitAnalyzer;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * A dummy implementation of the ServiceUnitAnalyzer that allows you to generate
+ * the consumes and provides from a simple XML file
+ * 
+ */
+public class JbiServiceFileAnalyzer implements ServiceUnitAnalyzer {
+
+	List consumes = new ArrayList();
+
+	List provides = new ArrayList();
+
+	public List getConsumes() {
+		return consumes;
+	}
+
+	public List getProvides() {
+		return provides;
+	}
+
+	public void init(File explodedServiceUnitRoot) {
+
+	}
+
+	public void setJbiServicesFile(File jbiServicesFile)
+			throws MojoExecutionException {
+		parseXml(jbiServicesFile);
+	}
+
+	private void parseXml(File jbiServicesFile) throws MojoExecutionException {
+		try {
+			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+			dbf.setNamespaceAware(true);
+			DocumentBuilder db = dbf.newDocumentBuilder();
+			Document doc = db.parse(jbiServicesFile);
+
+			Node servicesNode = doc.getFirstChild();
+			if (servicesNode instanceof Element) {
+				if (((Element) servicesNode).getNodeName().equals("services")) {
+					// We will process the children
+					Element servicesElement = (Element) servicesNode;
+					NodeList children = servicesElement.getChildNodes();
+					for (int i = 0; i < children.getLength(); i++) {
+						if (children.item(i) instanceof Element) {
+							Element childElement = (Element) children.item(i);
+							if (childElement.getNodeName().equals("consumes")) {
+								Consumes newConsumes = new Consumes();
+								newConsumes
+										.setEndpointName(getEndpointName(childElement));
+								newConsumes
+										.setInterfaceName(getInterfaceName(childElement));
+								newConsumes
+										.setServiceName(getServiceName(childElement));
+								consumes.add(newConsumes);
+							} else if (childElement.getNodeName().equals(
+									"provides")) {
+								Provides newProvides = new Provides();
+								newProvides
+										.setEndpointName(getEndpointName(childElement));
+								newProvides
+										.setInterfaceName(getInterfaceName(childElement));
+								newProvides
+										.setServiceName(getServiceName(childElement));
+								provides.add(newProvides);
+							}
+						}
+					}
+				}
+			}
+		} catch (Exception e) {
+			throw new MojoExecutionException("Unable to parse "
+					+ jbiServicesFile.getAbsolutePath());
+		}
+
+	}
+
+	private QName getServiceName(Element childElement) {
+		if (childElement.hasAttribute("service-name")) {
+			String prefixAndLocalPart = childElement
+					.getAttribute("service-name");
+			String prefix = prefixAndLocalPart.substring(0, prefixAndLocalPart
+					.indexOf(':'));
+			String localPart = prefixAndLocalPart.substring(prefixAndLocalPart
+					.indexOf(':'));
+			return new QName(childElement.lookupNamespaceURI(prefix), localPart);
+		}
+		return null;
+	}
+
+	private QName getInterfaceName(Element childElement) {
+		if (childElement.hasAttribute("interface-name")) {
+			String prefixAndLocalPart = childElement
+					.getAttribute("interface-name");
+			String prefix = prefixAndLocalPart.substring(0, prefixAndLocalPart
+					.indexOf(':'));
+			String localPart = prefixAndLocalPart.substring(prefixAndLocalPart
+					.indexOf(':'));
+			return new QName(childElement.lookupNamespaceURI(prefix), localPart);
+		}
+		return null;
+	}
+
+	private String getEndpointName(Element childElement) {
+		if (childElement.hasAttribute("endpoint-name")) {
+			return childElement.getAttribute("endpoint-name");
+		}
+		return null;
+	}
+}