ace-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ma...@apache.org
Subject svn commit: r1305618 - in /ace/trunk: ./ ace-ant-tasks/ ace-ant-tasks/src/main/java/org/apache/ace/ant/deploymentpackage/ ace-builder/ ace-builder/src/ ace-builder/src/main/ ace-builder/src/main/java/ ace-builder/src/main/java/org/ ace-builder/src/main...
Date Mon, 26 Mar 2012 21:45:45 GMT
Author: marrs
Date: Mon Mar 26 21:45:44 2012
New Revision: 1305618

URL: http://svn.apache.org/viewvc?rev=1305618&view=rev
Log:
ACE-235 added a stand-alone builder, refactored the Ant task to use it

Added:
    ace/trunk/ace-builder/
    ace/trunk/ace-builder/pom.xml
    ace/trunk/ace-builder/src/
    ace/trunk/ace-builder/src/main/
    ace/trunk/ace-builder/src/main/java/
    ace/trunk/ace-builder/src/main/java/org/
    ace/trunk/ace-builder/src/main/java/org/apache/
    ace/trunk/ace-builder/src/main/java/org/apache/ace/
    ace/trunk/ace-builder/src/main/java/org/apache/ace/builder/
    ace/trunk/ace-builder/src/main/java/org/apache/ace/builder/ArtifactData.java
    ace/trunk/ace-builder/src/main/java/org/apache/ace/builder/DeploymentPackageBuilder.java
    ace/trunk/ace-builder/src/test/
    ace/trunk/ace-builder/src/test/java/
    ace/trunk/ace-builder/src/test/java/org/
    ace/trunk/ace-builder/src/test/java/org/apache/
    ace/trunk/ace-builder/src/test/java/org/apache/ace/
    ace/trunk/ace-builder/src/test/java/org/apache/ace/builder/
    ace/trunk/ace-builder/src/test/java/org/apache/ace/builder/DeploymentPackageBuilderTest.java
Modified:
    ace/trunk/ace-ant-tasks/build.xml
    ace/trunk/ace-ant-tasks/pom.xml
    ace/trunk/ace-ant-tasks/src/main/java/org/apache/ace/ant/deploymentpackage/DeploymentPackageTask.java
    ace/trunk/pom.xml

Modified: ace/trunk/ace-ant-tasks/build.xml
URL: http://svn.apache.org/viewvc/ace/trunk/ace-ant-tasks/build.xml?rev=1305618&r1=1305617&r2=1305618&view=diff
==============================================================================
--- ace/trunk/ace-ant-tasks/build.xml (original)
+++ ace/trunk/ace-ant-tasks/build.xml Mon Mar 26 21:45:44 2012
@@ -20,7 +20,7 @@
 <!-- be sure to run 'mvn install' to create the library before trying this -->
 <project name="sample-build" default="build">
 	<!-- defines the deployment package task as 'dp' -->
-    <taskdef name="dp" classname="org.apache.ace.ant.deploymentpackage.DeploymentPackageTask"
classpath="target/org.apache.ace.ant.tasks-0.8.1-SNAPSHOT.jar" />
+    <taskdef name="dp" classname="org.apache.ace.ant.deploymentpackage.DeploymentPackageTask"
classpath="target/org.apache.ace.ant.tasks-0.8.1-SNAPSHOT.jar:../ace-builder/target/org.apache.ace.builder-0.8.1-SNAPSHOT.jar"
/>
 
     <!-- builds a deployment package based on some existing jar files -->
 	<target name="build">
@@ -28,7 +28,7 @@
 			<!-- uses two completely arbitrary bundles -->
             <orderedinclude name="ace-log-listener/target/org.apache.ace.log.listener-0.8.1-SNAPSHOT.jar"
/>
 			<orderedinclude name="ace-log/target/org.apache.ace.log-0.8.1-SNAPSHOT.jar" />
-			<include name="ace-range-api/target/*.jar" />
+			<include name="ace-range-api/target/org.apache.ace.range.api-0.8.1-SNAPSHOT.jar" />
 		</dp>
 	</target>
 </project>

Modified: ace/trunk/ace-ant-tasks/pom.xml
URL: http://svn.apache.org/viewvc/ace/trunk/ace-ant-tasks/pom.xml?rev=1305618&r1=1305617&r2=1305618&view=diff
==============================================================================
--- ace/trunk/ace-ant-tasks/pom.xml (original)
+++ ace/trunk/ace-ant-tasks/pom.xml Mon Mar 26 21:45:44 2012
@@ -47,5 +47,10 @@
             <artifactId>ant</artifactId>
             <version>1.8.2</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.ace</groupId>
+            <artifactId>org.apache.ace.builder</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 </project>

Modified: ace/trunk/ace-ant-tasks/src/main/java/org/apache/ace/ant/deploymentpackage/DeploymentPackageTask.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-ant-tasks/src/main/java/org/apache/ace/ant/deploymentpackage/DeploymentPackageTask.java?rev=1305618&r1=1305617&r2=1305618&view=diff
==============================================================================
--- ace/trunk/ace-ant-tasks/src/main/java/org/apache/ace/ant/deploymentpackage/DeploymentPackageTask.java
(original)
+++ ace/trunk/ace-ant-tasks/src/main/java/org/apache/ace/ant/deploymentpackage/DeploymentPackageTask.java
Mon Mar 26 21:45:44 2012
@@ -19,18 +19,12 @@
 package org.apache.ace.ant.deploymentpackage;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileOutputStream;
-import java.io.FilenameFilter;
-import java.io.IOException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.jar.Attributes;
-import java.util.jar.JarInputStream;
-import java.util.jar.JarOutputStream;
-import java.util.jar.Manifest;
-import java.util.zip.ZipEntry;
 
+import org.apache.ace.builder.DeploymentPackageBuilder;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.DirectoryScanner;
 import org.apache.tools.ant.Project;
@@ -140,78 +134,16 @@ public class DeploymentPackageTask exten
         for (String file : files) {
             log("Found file: " + file);
         }
-
-        Manifest manifest = new Manifest();
-        Attributes main = manifest.getMainAttributes();
-        main.putValue("Manifest-Version", "1.0");
-        main.putValue("DeploymentPackage-SymbolicName", m_name);
-        main.putValue("DeploymentPackage-Version", m_version);
-
-        for (String file : files) {
-            try {
-                log("Parsing manifest of: " + file);
-                JarInputStream jis = new JarInputStream(new FileInputStream(new File(m_dir,
file)));
-                Manifest bundleManifest = jis.getManifest();
-                String bsn = "INVALID";
-                String version = "INVALID";
-                if (bundleManifest == null) {
-                    throw new BuildException("Not a valid manifest in: " + file);
-                }
-                else {
-                    bsn = bundleManifest.getMainAttributes().getValue("Bundle-SymbolicName");
-                    version = bundleManifest.getMainAttributes().getValue("Bundle-Version");
-                    jis.close();
-                }
-                Attributes a = new Attributes();
-                a.putValue("Bundle-SymbolicName", bsn);
-                a.putValue("Bundle-Version", version);
-                manifest.getEntries().put(file, a);
-            }
-            catch (IOException e) {
-                throw new BuildException("Could not read bundle " + file + ".", e);
-            }
-        }
-
-        JarOutputStream output = null;
-        FileInputStream fis = null;
+        
         try {
-            output = new JarOutputStream(new FileOutputStream(m_destination), manifest);
-            byte[] buffer = new byte[4096];
-            for (String file : files) {
-                log("Writing to deployment package: " + file);
-                output.putNextEntry(new ZipEntry(file));
-                fis = new FileInputStream(new File(m_dir, file));
-                int bytes = fis.read(buffer);
-                while (bytes != -1) {
-                    output.write(buffer, 0, bytes);
-                    bytes = fis.read(buffer);
-                }
-                output.closeEntry();
-                fis.close();
-                fis = null;
-            }
-        }
+        	DeploymentPackageBuilder dp = DeploymentPackageBuilder.createDeploymentPackage(m_name,
m_version);
+        	for (String file : files) {
+        		dp.addBundle(new URL("file://" + m_dir.getAbsolutePath() + "/" + file));
+        	}
+			dp.generate(new FileOutputStream(m_destination));
+		}
         catch (Exception e) {
-            throw new BuildException("Could not create deployment package " + m_destination
+ ".", e);
-        }
-        finally {
-            if (output != null) {
-                try {
-                    output.close();
-                }
-                catch (IOException e) {
-                    throw new BuildException("Could not close deployment package " + m_destination
+ ".", e);
-                }
-            }
-            if (fis != null) {
-                try {
-                    fis.close();
-                }
-                catch (IOException e) {
-                    throw new BuildException("Could not close file " + fis + ".", e);
-                }
-            }
+			throw new BuildException("Error building deployment package: " + e.getMessage(), e);
         }
     }
 }
-

Added: ace/trunk/ace-builder/pom.xml
URL: http://svn.apache.org/viewvc/ace/trunk/ace-builder/pom.xml?rev=1305618&view=auto
==============================================================================
--- ace/trunk/ace-builder/pom.xml (added)
+++ ace/trunk/ace-builder/pom.xml Mon Mar 26 21:45:44 2012
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.ace</groupId>
+        <artifactId>ace-pom</artifactId>
+        <version>0.8.1-SNAPSHOT</version>
+        <relativePath>../pom/pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.ace.builder</artifactId>
+
+    <name>Apache ACE :: Builders</name>
+    <description>Collection of builders that can be used in various contexts.</description>
+    <packaging>jar</packaging>
+
+    <scm>
+        <connection>scm:svn:http://svn.apache.org/repos/asf/ace/trunk/ace-builder</connection>
+        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/ace/trunk/ace-builder</developerConnection>
+        <url>http://svn.apache.org/repos/asf/ace/trunk/ace-builder</url>
+    </scm>
+    
+    <dependencies>
+       <dependency>
+         <groupId>org.apache.ace</groupId>
+         <artifactId>org.apache.ace.util</artifactId>
+       </dependency>
+     </dependencies>
+</project>

Added: ace/trunk/ace-builder/src/main/java/org/apache/ace/builder/ArtifactData.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-builder/src/main/java/org/apache/ace/builder/ArtifactData.java?rev=1305618&view=auto
==============================================================================
--- ace/trunk/ace-builder/src/main/java/org/apache/ace/builder/ArtifactData.java (added)
+++ ace/trunk/ace-builder/src/main/java/org/apache/ace/builder/ArtifactData.java Mon Mar 26
21:45:44 2012
@@ -0,0 +1,98 @@
+/*
+ * 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.ace.builder;
+
+import java.net.URL;
+
+public class ArtifactData {
+	private final URL m_url;
+	private boolean m_isBundle;
+	private String m_filename;
+	private String m_bundleSymbolicName;
+	private String m_bundleVersion;
+	private boolean m_isCustomizer;
+	private String m_processorPID;
+	
+	private ArtifactData(URL url, String filename) {
+		m_url = url;
+		m_filename = filename;
+	}
+	
+	public static ArtifactData createBundle(URL url, String filename, String bundleSymbolicName,
String bundleVersion) {
+		ArtifactData data = new ArtifactData(url, filename);
+		data.setBundleMetadata(bundleSymbolicName, bundleVersion);
+		return data;
+	}
+	
+	public static ArtifactData createResourceProcessor(URL url, String filename, String bundleSymbolicName,
String bundleVersion, String processorPID) {
+		ArtifactData data = new ArtifactData(url, filename);
+		data.setBundleMetadata(bundleSymbolicName, bundleVersion);
+		data.setResourceProcessor(processorPID);
+		return data;
+	}
+	
+	public static ArtifactData createArtifact(URL url, String filename, String processorPID)
{
+		ArtifactData data = new ArtifactData(url, filename);
+		data.setArtifactResourceProcessor(processorPID);
+		return data;
+	}
+	
+	public URL getURL() {
+		return m_url;
+	}
+
+	public boolean isBundle() {
+		return m_isBundle;
+	}
+	
+	public String getFilename() {
+		return m_filename;
+	}
+
+	public String getSymbolicName() {
+		return m_bundleSymbolicName;
+	}
+	
+	public String getVersion() {
+		return m_bundleVersion;
+	}
+	
+	public boolean isCustomizer() {
+		return m_isCustomizer;
+	}
+	
+	public String getProcessorPid() {
+		return m_processorPID;
+	}
+
+	private void setBundleMetadata(String bundleSymbolicName, String bundleVersion) {
+		m_isBundle = true;
+		m_bundleSymbolicName = bundleSymbolicName;
+		m_bundleVersion = bundleVersion;
+	}
+	
+	private void setResourceProcessor(String processorPID) {
+		m_isCustomizer = true;
+		m_processorPID = processorPID;
+	}
+	
+	private void setArtifactResourceProcessor(String processorPID) {
+		m_processorPID = processorPID;
+	}
+}

Added: ace/trunk/ace-builder/src/main/java/org/apache/ace/builder/DeploymentPackageBuilder.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-builder/src/main/java/org/apache/ace/builder/DeploymentPackageBuilder.java?rev=1305618&view=auto
==============================================================================
--- ace/trunk/ace-builder/src/main/java/org/apache/ace/builder/DeploymentPackageBuilder.java
(added)
+++ ace/trunk/ace-builder/src/main/java/org/apache/ace/builder/DeploymentPackageBuilder.java
Mon Mar 26 21:45:44 2012
@@ -0,0 +1,242 @@
+/*
+ * 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.ace.builder;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.jar.Attributes;
+import java.util.jar.JarInputStream;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+import java.util.zip.ZipEntry;
+
+/**
+ * Builder for deployment packages. Can handle bundles, resource processors and artifacts.
Uses
+ * the builder pattern:
+ * <pre>
+ * OutputStream out = new FileOutputStream("first.dp");
+ * DeploymentPackageBuilder.createDeploymentPackage("mydp", "1.0")
+ *     .addBundle(new URL("http://repository/api-1.1.0.jar"))
+ *     .addBundle(new URL("http://repository/impl-1.1.3.jar"))
+ *     .addResourceProcessor(new URL("http://repository/rp-1.0.2.jar"))
+ *     .addArtifact(new URL("http://artifacts/config/v1.jar"), "rp.pid")
+ *     .addArtifact(new URL("http://artifacts/data/v3.jar"), "rp.pid")
+ *     .generate(out);
+ * </pre>
+ * For bundles and resource processors, you can simply point to a valid URL and it will
+ * be queried for all required metadata. For artifacts, you need to specify both the URL
+ * and the PID of the resource processor. The builder will use the order you specify for
+ * bundles, resource processors and artifacts, but you don't have to specify all bundles
+ * and resource processors first and then all artifacts.
+ */
+public class DeploymentPackageBuilder {
+	private static final int BUFFER_SIZE = 32 * 1024;
+	private final String m_name;
+	private final String m_version;
+	private final List<ArtifactData> m_bundles = new ArrayList<ArtifactData>();
+	private final List<ArtifactData> m_processors = new ArrayList<ArtifactData>();
+	private final List<ArtifactData> m_artifacts = new ArrayList<ArtifactData>();
+	
+	private DeploymentPackageBuilder(String name, String version) {
+		m_name = name;
+		m_version = version;
+	}
+	
+	/**
+	 * Creates a new deployment package.
+	 * 
+	 * @param name the name of the deployment package
+	 * @param version the version of the deployment package
+	 * @return a builder to further add data to the deployment package
+	 */
+	public static DeploymentPackageBuilder createDeploymentPackage(String name, String version)
{
+		return new DeploymentPackageBuilder(name, version);
+	}
+	
+	/**
+	 * Adds a bundle to the deployment package.
+	 * 
+	 * @param url a url that refers to the bundle
+	 * @return a builder to further add data to the deployment package
+	 * @throws Exception if something goes wrong while building
+	 */
+	public DeploymentPackageBuilder addBundle(URL url) throws Exception {
+		return addBundleArtifact(url, false);
+	}
+	
+	/**
+	 * Adds a resource processor to the deployment package. A resource processor is a special
+	 * type of bundle.
+	 * 
+	 * @param url a url that refers to the resource processor
+	 * @return a builder to further add data to the deployment package
+	 * @throws Exception if something goes wrong while building
+	 */
+	public DeploymentPackageBuilder addResourceProcessor(URL url) throws Exception {
+		return addBundleArtifact(url, true);
+	}
+	
+	/**
+	 * Adds an artifact to the deployment package.
+	 * 
+	 * @param url a url that refers to the bundle
+	 * @param processorPID the PID of the processor for this artifact
+	 * @return a builder to further add data to the deployment package
+	 * @throws Exception if something goes wrong while building
+	 */
+	public DeploymentPackageBuilder addArtifact(URL url, String processorPID) throws Exception
{
+        File file = new File(url.toURI());
+    	m_artifacts.add(ArtifactData.createArtifact(url, file.getName(), processorPID));
+		return this;
+	}
+
+	/**
+	 * Generates a deployment package and streams it to the output stream you provide. Before
+	 * it starts generating, it will first validate that you have actually specified a
+	 * resource processor for each type of artifact you provided.
+	 * 
+	 * @param output the output stream to write to
+	 * @throws Exception if something goes wrong while validating or generating
+	 */
+	public void generate(OutputStream output) throws Exception {
+		validateArtifacts();
+		List<ArtifactData> artifacts = new ArrayList<ArtifactData>();
+		artifacts.addAll(m_bundles);
+		artifacts.addAll(m_processors);
+		artifacts.addAll(m_artifacts);
+		Manifest m = createManifest(artifacts);
+		writeStream(artifacts, m, output);
+	}
+	
+	private DeploymentPackageBuilder addBundleArtifact(URL url, boolean isResourceProcessor)
throws Exception {
+		JarInputStream jis = null;
+		try {
+			jis = new JarInputStream(url.openStream());
+	        Manifest bundleManifest = jis.getManifest();
+	        if (bundleManifest == null) {
+	        	throw new Exception("Not a valid manifest in: " + url);
+	        }
+	        Attributes attributes = bundleManifest.getMainAttributes();
+			String bundleSymbolicName = getRequiredHeader(attributes, "Bundle-SymbolicName");
+	        String bundleVersion = getRequiredHeader(attributes, "Bundle-Version");
+	        File file = new File(url.toURI());
+	        if (isResourceProcessor) {
+	        	if (!"true".equals(getRequiredHeader(attributes, "DeploymentPackage-Customizer")))
{
+	        		throw new IOException("Invalid DeploymentPackage-Customizer header in: " + url);
+	        	}
+	        	String processorPID = getRequiredHeader(attributes, "Deployment-ProvidesResourceProcessor");
+	        	m_processors.add(ArtifactData.createResourceProcessor(url, file.getName(), bundleSymbolicName,
bundleVersion, processorPID));
+	        }
+	        else {
+	        	m_bundles.add(ArtifactData.createBundle(url, file.getName(), bundleSymbolicName,
bundleVersion));
+	        }
+		}
+		finally {
+			if (jis != null) {
+				jis.close();
+			}
+		}
+		return this;
+	}
+
+	private void validateArtifacts() throws Exception {
+		for (ArtifactData data : m_artifacts) {
+			String pid = data.getProcessorPid();
+			boolean found = false;
+			for (ArtifactData processor : m_processors) {
+				if (pid.equals(processor.getProcessorPid())) {
+					found = true;
+					break;
+				}
+			}
+			if (!found) {
+				throw new Exception("No resource processor found for artifact " + data.getURL() + " with
processor PID " + pid);
+			}
+		}
+	}
+	
+	private String getRequiredHeader(Attributes mainAttributes, String headerName) throws Exception
{
+		String value = mainAttributes.getValue(headerName);
+		if (value == null || value.equals("")) {
+			throw new Exception("Missing or invalid " + headerName + " header.");
+		}
+		return value;
+	}
+	
+	private Manifest createManifest(List<ArtifactData> files) throws Exception {
+		Manifest manifest = new Manifest();
+        Attributes main = manifest.getMainAttributes();
+        main.putValue("Manifest-Version", "1.0");
+        main.putValue("DeploymentPackage-SymbolicName", m_name);
+        main.putValue("DeploymentPackage-Version", m_version);
+
+        for (ArtifactData file : files) {
+        	if (file.isBundle()) {
+                Attributes a = new Attributes();
+                a.putValue("Bundle-SymbolicName", file.getSymbolicName());
+                a.putValue("Bundle-Version", file.getVersion());
+                if (file.isCustomizer()) {
+                    a.putValue("DeploymentPackage-Customizer", "true");
+                    a.putValue("Deployment-ProvidesResourceProcessor", file.getProcessorPid());
+                }
+                manifest.getEntries().put(file.getFilename(), a);
+        	}
+        	else {
+                Attributes a = new Attributes();
+                a.putValue("Resource-Processor", file.getProcessorPid());
+                manifest.getEntries().put(file.getFilename(), a);
+        	}
+        }
+		return manifest;
+	}
+	
+	private void writeStream(List<ArtifactData> files, Manifest manifest, OutputStream
outputStream) throws Exception {
+        JarOutputStream output = null;
+        InputStream fis = null;
+        try {
+			output = new JarOutputStream(outputStream, manifest);
+            byte[] buffer = new byte[BUFFER_SIZE];
+            for (ArtifactData file : files) {
+                output.putNextEntry(new ZipEntry(file.getFilename()));
+                fis = file.getURL().openStream();
+                int bytes = fis.read(buffer);
+                while (bytes != -1) {
+                    output.write(buffer, 0, bytes);
+                    bytes = fis.read(buffer);
+                }
+                output.closeEntry();
+                fis.close();
+                fis = null;
+            }
+        }
+        finally {
+            if (output != null) {
+            	output.close();
+            }
+            if (fis != null) {
+                fis.close();
+            }
+        }
+    }
+}

Added: ace/trunk/ace-builder/src/test/java/org/apache/ace/builder/DeploymentPackageBuilderTest.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-builder/src/test/java/org/apache/ace/builder/DeploymentPackageBuilderTest.java?rev=1305618&view=auto
==============================================================================
--- ace/trunk/ace-builder/src/test/java/org/apache/ace/builder/DeploymentPackageBuilderTest.java
(added)
+++ ace/trunk/ace-builder/src/test/java/org/apache/ace/builder/DeploymentPackageBuilderTest.java
Mon Mar 26 21:45:44 2012
@@ -0,0 +1,234 @@
+/*
+ * 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.ace.builder;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Map;
+import java.util.jar.Attributes;
+import java.util.jar.JarInputStream;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import static org.apache.ace.test.utils.TestUtils.UNIT;
+
+public class DeploymentPackageBuilderTest {
+    @Test(groups = { UNIT })
+	public void testEmptyDeploymentPackage() throws Exception {
+		File tempFile = File.createTempFile("output-", ".jar");
+		System.out.println("File: " + tempFile);
+		FileOutputStream output = new FileOutputStream(tempFile);
+		String name = "test";
+		String version = "1.0.0";
+		DeploymentPackageBuilder.createDeploymentPackage(name, version).generate(output);
+		Manifest m = getManifest(tempFile);
+
+		// the deployment package should have just a name and a version, but no entries
+		Assert.assertEquals(name, m.getMainAttributes().getValue("DeploymentPackage-SymbolicName"));
+		Assert.assertEquals(version, m.getMainAttributes().getValue("DeploymentPackage-Version"));
+		Assert.assertTrue(m.getEntries().isEmpty());
+	}
+
+    @Test(groups = { UNIT })
+	public void testSingleBundleDeploymentPackage() throws Exception {
+		File tempFile = File.createTempFile("output-", ".jar");
+		FileOutputStream output = new FileOutputStream(tempFile);
+		String name = "test";
+		String version = "1.0.0";
+		
+		String bundleSymbolicName = "bundle";
+		String bundleVersion = "1.0.0";
+		File tempBundleFile = File.createTempFile(bundleSymbolicName + "-" + bundleVersion + "-",
".jar");
+		
+		DeploymentPackageBuilder.createDeploymentPackage(name, version)
+			.addBundle(createBundle(bundleSymbolicName, bundleVersion, tempBundleFile))
+			.generate(output);
+
+		// the deployment package should have a name and a version, and a single entry (our bundle)
+		Manifest m = getManifest(tempFile);
+		Assert.assertEquals(name, m.getMainAttributes().getValue("DeploymentPackage-SymbolicName"));
+		Assert.assertEquals(version, m.getMainAttributes().getValue("DeploymentPackage-Version"));
+		Assert.assertEquals(1, m.getEntries().size());
+		Attributes attributes = m.getEntries().get(tempBundleFile.getName());
+		Assert.assertNotNull(attributes);
+		Assert.assertEquals(bundleSymbolicName, attributes.getValue("Bundle-SymbolicName"));
+		Assert.assertEquals(bundleVersion, attributes.getValue("Bundle-Version"));
+	}
+
+    @Test(groups = { UNIT })
+	public void testTwoBundleDeploymentPackage() throws Exception {
+		File tempFile = File.createTempFile("output-", ".jar");
+		FileOutputStream output = new FileOutputStream(tempFile);
+		String name = "test";
+		String version = "1.0.0";
+		
+		String bundleSymbolicName = "bundle";
+		String bundleVersion = "1.0.0";
+		File tempBundleFile = File.createTempFile(bundleSymbolicName + "-" + bundleVersion + "-",
".jar");
+		
+		String bundleSymbolicName2 = "bundle-two";
+		String bundleVersion2 = "1.2.0";
+		File tempBundleFile2 = File.createTempFile(bundleSymbolicName2 + "-" + bundleVersion2 +
"-", ".jar");
+
+		DeploymentPackageBuilder.createDeploymentPackage(name, version)
+			.addBundle(createBundle(bundleSymbolicName, bundleVersion, tempBundleFile))
+			.addBundle(createBundle(bundleSymbolicName2, bundleVersion2, tempBundleFile2))
+			.generate(output);
+
+		// the deployment package should have a name and a version, and a single entry (our bundle)
+		Manifest m = getManifest(tempFile);
+		Assert.assertEquals(name, m.getMainAttributes().getValue("DeploymentPackage-SymbolicName"));
+		Assert.assertEquals(version, m.getMainAttributes().getValue("DeploymentPackage-Version"));
+		Assert.assertEquals(2, m.getEntries().size());
+		Attributes attributes = m.getEntries().get(tempBundleFile.getName());
+		Assert.assertNotNull(attributes);
+		Assert.assertEquals(bundleSymbolicName, attributes.getValue("Bundle-SymbolicName"));
+		Assert.assertEquals(bundleVersion, attributes.getValue("Bundle-Version"));
+		attributes = m.getEntries().get(tempBundleFile2.getName());
+		Assert.assertEquals(bundleSymbolicName2, attributes.getValue("Bundle-SymbolicName"));
+		Assert.assertEquals(bundleVersion2, attributes.getValue("Bundle-Version"));
+	}
+	
+    @Test(groups = { UNIT })
+	public void testProcessorAndResourceDeploymentPackage() throws Exception {
+		File tempFile = File.createTempFile("output-", ".jar");
+		FileOutputStream output = new FileOutputStream(tempFile);
+		String name = "test";
+		String version = "1.0.0";
+		
+		String bundleSymbolicName = "bundle";
+		String bundleVersion = "1.0.0";
+		File tempBundleFile = File.createTempFile(bundleSymbolicName + "-" + bundleVersion + "-",
".jar");
+		
+		String pid = "my.processor";
+
+		File tempArtifactFile = File.createTempFile("artifact-", ".jar");
+
+		DeploymentPackageBuilder.createDeploymentPackage(name, version)
+			.addResourceProcessor(createResourceProcessor(bundleSymbolicName, bundleVersion, pid,
tempBundleFile))
+			.addArtifact(createArtifact(pid, tempArtifactFile), pid)
+			.generate(output);
+
+		// the deployment package should have a name and a version, and a single entry (our bundle)
+		Manifest m = getManifest(tempFile);
+		Assert.assertEquals(name, m.getMainAttributes().getValue("DeploymentPackage-SymbolicName"));
+		Assert.assertEquals(version, m.getMainAttributes().getValue("DeploymentPackage-Version"));
+		Map<String, Attributes> entries = m.getEntries();
+		Assert.assertEquals(2, entries.size());
+		Attributes attributes = entries.get(tempBundleFile.getName());
+		Assert.assertNotNull(attributes);
+		Assert.assertEquals(bundleSymbolicName, attributes.getValue("Bundle-SymbolicName"));
+		Assert.assertEquals(bundleVersion, attributes.getValue("Bundle-Version"));
+		Assert.assertEquals("true", attributes.getValue("DeploymentPackage-Customizer"));
+		Assert.assertEquals(pid, attributes.getValue("Deployment-ProvidesResourceProcessor"));
+		attributes = entries.get(tempArtifactFile.getName());
+		Assert.assertEquals(pid, attributes.getValue("Resource-Processor"));
+	}
+
+    @Test(groups = { UNIT }, expectedExceptions = { Exception.class })
+	public void testResourceWithoutProcessorDeploymentPackage() throws Exception {
+		File tempFile = File.createTempFile("output-", ".jar");
+		FileOutputStream output = new FileOutputStream(tempFile);
+		String name = "test";
+		String version = "1.0.0";
+		
+		String pid = "my.processor";
+
+		File tempArtifactFile = File.createTempFile("artifact-", ".jar");
+
+		DeploymentPackageBuilder.createDeploymentPackage(name, version)
+			.addArtifact(createArtifact(pid, tempArtifactFile), pid)
+			.generate(output);
+	}
+	
+	
+	private Manifest getManifest(File file) throws Exception {
+        JarInputStream jis = new JarInputStream(file.toURI().toURL().openStream());
+        Manifest bundleManifest = jis.getManifest();
+        jis.close();
+        return bundleManifest;
+	}
+	
+	private URL createBundle(String symbolicName, String version, File file) throws Exception
{
+		Manifest manifest = new Manifest();
+        Attributes main = manifest.getMainAttributes();
+        main.putValue("Manifest-Version", "1.0");
+        main.putValue("Bundle-SymbolicName", symbolicName);
+        main.putValue("Bundle-Version", version);
+        
+        JarOutputStream output = null;
+        InputStream fis = null;
+        try {
+			output = new JarOutputStream(new FileOutputStream(file), manifest);
+			return file.toURI().toURL();
+        }
+        finally {
+            if (output != null) {
+            	output.close();
+            }
+            if (fis != null) {
+                fis.close();
+            }
+        }
+	}
+	
+	private URL createResourceProcessor(String symbolicName, String version, String processorPID,
File file) throws Exception {
+		Manifest manifest = new Manifest();
+        Attributes main = manifest.getMainAttributes();
+        main.putValue("Manifest-Version", "1.0");
+        main.putValue("Bundle-SymbolicName", symbolicName);
+        main.putValue("Bundle-Version", version);
+        main.putValue("DeploymentPackage-Customizer", "true");
+        main.putValue("Deployment-ProvidesResourceProcessor", processorPID);
+        
+        JarOutputStream output = null;
+        InputStream fis = null;
+        try {
+			output = new JarOutputStream(new FileOutputStream(file), manifest);
+			return file.toURI().toURL();
+        }
+        finally {
+            if (output != null) {
+            	output.close();
+            }
+            if (fis != null) {
+                fis.close();
+            }
+        }
+	}
+
+	private URL createArtifact(String processorPID, File file) throws Exception {
+        FileOutputStream output = null;
+        try {
+			output = new FileOutputStream(file);
+			output.write(0);
+			return file.toURI().toURL();
+        }
+        finally {
+            if (output != null) {
+            	output.close();
+            }
+        }
+	}
+}

Modified: ace/trunk/pom.xml
URL: http://svn.apache.org/viewvc/ace/trunk/pom.xml?rev=1305618&r1=1305617&r2=1305618&view=diff
==============================================================================
--- ace/trunk/pom.xml (original)
+++ ace/trunk/pom.xml Mon Mar 26 21:45:44 2012
@@ -35,6 +35,9 @@
         <module>pom</module>
         <module>ace-util</module>
 
+        <module>ace-ant-tasks</module>
+        <module>ace-builder</module>
+
         <module>ace-range-api</module>
 
         <module>ace-repository-api</module>



Mime
View raw message