[SCM] eclipse - Powerful IDE written in java - Debian package. branch, upstream, updated. afa8bc8bf5bc3ee24eefa2fb86400ece5f08f934

Benjamin Drung bdrung-guest at alioth.debian.org
Tue Mar 2 14:32:32 UTC 2010


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "eclipse - Powerful IDE written in java - Debian package.".

The branch, upstream has been updated
       via  afa8bc8bf5bc3ee24eefa2fb86400ece5f08f934 (commit)
      from  d13e10ceec96627e654f884d6ac25e4c52855ba8 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                          |    8 +
 build.xml                                          |   54 ++----
 .../eclipsebuild/SymlinkInstalledOSGiJars.java     |  221 ++++++++++++++++++++
 .../linuxtools/eclipsebuild/SymlinkOSGiJars.java   |  191 +++++++++---------
 4 files changed, 341 insertions(+), 133 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index f10e655..928a4fd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2010-03-01  Andrew Overholt  <overholt at redhat.com>
+
+	* build.xml: Re-symlink to system JARs after p2 director installation.
+	* task-src/org/eclipse/linuxtools/eclipsebuild/SymlinkInstalledOSGiJars.java: 
+	New file.  Symlink OSGI bundles again after p2 installation step.
+	* task-src/org/eclipse/linuxtools/eclipsebuild/SymlinkOSGiJars.java:
+	Remove unused parts.
+
 2010-02-26  Andrew Overholt  <overholt at redhat.com>
 
 	* build.properties: Make buildID same as 3.5.2.
diff --git a/build.xml b/build.xml
index 4901407..7d1f173 100644
--- a/build.xml
+++ b/build.xml
@@ -283,6 +283,9 @@
 		<taskdef name="symlinkOSGiJars"
 			classname="org.eclipse.linuxtools.eclipsebuild.SymlinkOSGiJars"
 			classpath="${basedir}/task-bin" />
+		<taskdef name="symlinkInstalledOSGiJars"
+			classname="org.eclipse.linuxtools.eclipsebuild.SymlinkInstalledOSGiJars"
+			classpath="${basedir}/task-bin" />
 		<taskdef name="symlinkNonOSGiJars"
 			classname="org.eclipse.linuxtools.eclipsebuild.SymlinkNonOSGiJars"
 			classpath="${basedir}/task-bin" />
@@ -607,47 +610,24 @@
 				<include name="org.eclipse.equinox.initializer*.jar" />
 			</fileset>
 		</copy>
-		
-		<!-- Delete system JARs that have been copied over as their symlink target names -->
-		<!--
-        <delete>
-                <fileset dir="${buildDirectory}/installation/plugins" includes="com.ibm.icu*" />
-                <fileset dir="${buildDirectory}/installation/plugins" includes="com.jcraft.jsch*" />
-                <fileset dir="${buildDirectory}/installation/plugins" includes="javax.servlet*" />
-                <fileset dir="${buildDirectory}/installation/plugins" includes="javax.servlet.jsp*" />
-                <fileset dir="${buildDirectory}/installation/plugins" includes="org.apache.commons.codec*" />
-                <fileset dir="${buildDirectory}/installation/plugins" includes="org.apache.commons.el*" />
-                <fileset dir="${buildDirectory}/installation/plugins" includes="org.apache.commons.httpclient*" />
-                <fileset dir="${buildDirectory}/installation/plugins" includes="org.apache.commons.logging*" />
-                <fileset dir="${buildDirectory}/installation/plugins" includes="org.apache.jasper*" />
-                <fileset dir="${buildDirectory}/installation/plugins" includes="org.apache.lucene*" />
-                <fileset dir="${buildDirectory}/installation/plugins" includes="org.apache.lucene.analysis*" />
-                <fileset dir="${buildDirectory}/installation/plugins" includes="org.hamcrest.core*" />
-                <fileset dir="${buildDirectory}/installation/plugins" includes="org.mortbay.jetty.server*" />
-                <fileset dir="${buildDirectory}/installation/plugins" includes="org.mortbay.jetty.util*" />
-                <fileset dir="${buildDirectory}/installation/plugins" includes="org.objectweb.asm*" />
-                <fileset dir="${buildDirectory}/installation/plugins" includes="org.sat4j.core*" />
-                <fileset dir="${buildDirectory}/installation/plugins" includes="org.sat4j.pb*" />
-        </delete>
-
-		<symlinkOSGiJars dependencies="${basedir}/dependencies.properties" 
-			topLevelDir="${buildDirectory}/installation/plugins"
-		    manifests="${basedir}/dependencyManifests"
-		    keepOrigNames="false"/>
+
+		<!-- Re-symlink system JARs -->
+		<symlinkInstalledOSGiJars dependencies="${basedir}/dependencies.properties" 
+			topLevelDir="${buildDirectory}/installation/plugins"/>
 		<symlinkNonOSGiJars dependencies="${basedir}/nonosgidependencies.properties"
 			topLevelDir="${buildDirectory}/installation/plugins"/>
-		-->
-		<!-- FIXME the junit4 bundle has no qualifier at build time but does
-		     at install time.  Watch out for other distros with different
-		     locations of junit4's system JAR.
-		-->
-		<!--
-		<delete dir="${buildDirectory}/installation/plugins/org.junit4" />
-		<delete file="${buildDirectory}/installation/plugins/org.junit4_4.5.0.v20090824/junit.jar" />
 
-		<symlink link="${buildDirectory}/installation/plugins/org.junit4_4.5.0.v20090824/junit.jar"
+		<fileset id="junit4.jar" dir="${buildDirectory}/installation/plugins">
+		  	<include name="**/org.junit4_**/junit.jar"/>
+	  	</fileset>
+	  	<property name="junit4jar.path" refid="junit4.jar"/>
+	  	
+		<delete file="${buildDirectory}/installation/plugins/${junit4jar.path}" />
+
+		<!-- FIXME:  Watch out for other distros with different
+		     locations of junit4's system JAR. -->
+		<symlink link="${buildDirectory}/installation/plugins/${junit4jar.path}"
 			resource="/usr/share/java/junit4.jar" />		
-		-->
 		<echo file="provision.sdk-stamp" />
 	</target>
 
diff --git a/task-src/org/eclipse/linuxtools/eclipsebuild/SymlinkInstalledOSGiJars.java b/task-src/org/eclipse/linuxtools/eclipsebuild/SymlinkInstalledOSGiJars.java
new file mode 100644
index 0000000..b2e9c39
--- /dev/null
+++ b/task-src/org/eclipse/linuxtools/eclipsebuild/SymlinkInstalledOSGiJars.java
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Red Hat Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Red Hat, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.linuxtools.eclipsebuild;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.Set;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Delete;
+import org.apache.tools.ant.taskdefs.optional.unix.Symlink;
+
+public class SymlinkInstalledOSGiJars extends Task {
+
+	private String[] importantManifestEntries = { "Bundle-SymbolicName", "Bundle-Version", "Export-Package" };
+
+	private Properties dependencies;
+	private String topLevelDir;
+	
+	// Main method for ant task
+    public void execute() throws BuildException {
+    	Set<Object> jarLocations = dependencies.keySet();
+    	for (Iterator<Object> jarIter = jarLocations.iterator(); jarIter.hasNext();) {
+			
+    		// File we need to replace with a symlink
+    		String origLocation = (String) jarIter.next();
+    		// origLocation is something like:
+    		//   org.mortbay.jetty.util_6.1.15.v200905182336.jar
+    		// but we want to have what matches this glob:
+    		//   org.mortbay.jetty.util_*
+    		File fileToSymlink = findFileToSymlink(origLocation, new File(topLevelDir));
+    		JarFile fileToSymlinkJarFile;
+    		Manifest fileToSymlinkManifest = null;
+    		try {
+    			fileToSymlinkJarFile = new JarFile(fileToSymlink);
+    			fileToSymlinkManifest = fileToSymlinkJarFile.getManifest();
+    		} catch (IOException e) {
+    			// not a JAR file or can't be read
+    			throw new BuildException("Can't read file which should be replaced with a symlink:  " + fileToSymlink);
+    		}
+    		if (fileToSymlinkManifest == null)
+    			throw new BuildException("Can't read file which should be replaced with a symlink:  " + fileToSymlink);
+    		
+    		Attributes origAttributes = fileToSymlinkManifest.getMainAttributes();
+    		
+			String systemLocations = (String) dependencies.get(origLocation);
+			String[] systemLocationList = systemLocations.split(":");
+			Attributes systemAttributes = null;
+			File matchedJar = null;
+
+			for (int i = 0; i < systemLocationList.length; i++) {
+				File systemFile = new File(systemLocationList[i]);
+				if (!systemFile.exists())
+					continue;
+				log("Seeing if " + systemFile + " is a suitable match for " + origLocation, Project.MSG_DEBUG);
+				
+				
+				JarFile systemJarFile;
+				Manifest systemManifest = null;
+				try {
+					systemJarFile = new JarFile(systemFile);
+					// System MANIFEST.MF
+					systemManifest = systemJarFile.getManifest();
+				} catch (IOException e) {
+					// not a JAR file or can't be read
+				}
+				if (systemManifest == null)
+					continue;
+				
+				systemAttributes = systemManifest.getMainAttributes();
+				if (compareImportantAttributes(origAttributes, systemAttributes)) {
+					matchedJar = systemFile;
+					break;
+				}
+			}
+			
+			if (matchedJar == null) {
+				String noSystemJarMsg = buildNoSystemJarMsg(origLocation, systemLocationList);
+				throw new BuildException(noSystemJarMsg);
+			}
+			
+			
+			// After using the p2 director, the filenames in the
+			// "installation" directory will have the same names as the
+			// targets of their symlinks from build time.  Since bundles.info
+			// will have been written with these filenames, we need to keep 
+			// them and not over-write with what the source drop originally
+			// had.
+			
+			Delete d = new Delete();
+			d.init();
+			d.setFile(fileToSymlink);
+			d.execute();
+			
+			Symlink s = new Symlink();
+			s.init();
+			s.setLink(topLevelDir + "/" + fileToSymlink.getName());
+			s.setResource(matchedJar.getAbsolutePath());
+			s.execute();
+    	}
+    }
+
+	private File findFileToSymlink(String origLocation, File origDirectory) {
+		String bundleId = origLocation.split("_")[0];
+		String[] filesInDir = origDirectory.list();
+		if (filesInDir != null) {
+			for (int i = 0; i < filesInDir.length; i++) {
+				String filename = filesInDir[i];
+				if (filename.startsWith(bundleId + "_"))
+					return new File(origDirectory, filename);
+			}
+		}
+		return null;
+	}
+	
+	private boolean compareImportantAttributes(Attributes origAttributes,
+			Attributes systemAttributes) {
+		boolean isAMatch = true;
+		for (int j = 0; j < importantManifestEntries.length; j++) {
+			String attributeToCheck = importantManifestEntries[j];
+			String origAttribute = (String) origAttributes
+					.getValue(attributeToCheck);
+			String systemAttribute = (String) systemAttributes
+					.getValue(attributeToCheck);
+			if (attributeToCheck.equals("Bundle-Version")) {
+				// System version should be higher; ignore qualifier
+				String[] origVersionSegments = origAttribute.split("\\.");
+				String[] systemVersionSegments = systemAttribute.split("\\.");
+				// Orbit JARs always have major.minor.micro.qualifier
+				Integer origInteger = new Integer(origVersionSegments[0]) * 100
+						+ new Integer(origVersionSegments[1]) * 10
+						+ new Integer(origVersionSegments[2]);
+				// System JARs sometimes don't have 4 parts
+				int maxSegments = systemVersionSegments.length;
+				if (systemVersionSegments.length > 3)
+					maxSegments = 3;
+				Integer systemInteger = new Integer(0);
+				for (int m = 0; m < maxSegments; m++) {
+					systemInteger = systemInteger
+							+ new Integer(systemVersionSegments[m])
+							* (int) Math.pow(10, (2 - m));
+				}
+				if (systemInteger < origInteger) {
+					isAMatch = false;
+					break;
+				}
+			} else if (attributeToCheck.equals("Export-Package")) {
+				if (origAttribute != null && systemAttribute != null) {
+					if (!origAttribute.equals(systemAttribute)) {
+						log("Export-Package attributes do not match for "
+								+ origAttributes
+										.getValue("Bundle-SymbolicName"),
+								Project.MSG_WARN);
+					}
+				}
+			} else {
+				if (origAttribute != null && systemAttribute != null) {
+					if (!origAttribute.equals(systemAttribute)) {
+						isAMatch = false;
+						break;
+					}
+				} else {
+					isAMatch = false;
+					break;
+				}
+			}
+		}
+		return isAMatch;
+	}
+	
+	private String buildNoSystemJarMsg(String origLocation,
+			String[] systemLocationList) {
+		String attemptedLocations = "";
+		for (int j = 0; j < systemLocationList.length; j++) {
+			if (j == 0)
+				attemptedLocations = systemLocationList[j];
+			else
+				attemptedLocations = attemptedLocations + ", "
+						+ systemLocationList[j];
+		}
+		return "Could not find suitable system JAR for " + origLocation
+				+ ".  Tried:  " + attemptedLocations;
+	}
+
+	public void setDependencies(File dependencyProperties) {
+		dependencies = new Properties();
+		FileInputStream fis;
+		try {
+			fis = new FileInputStream(dependencyProperties);
+			dependencies.load(fis);
+			fis.close();
+		} catch (FileNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+	public void setTopleveldir(String topLevelDir) {
+		this.topLevelDir = topLevelDir;
+	}
+}
diff --git a/task-src/org/eclipse/linuxtools/eclipsebuild/SymlinkOSGiJars.java b/task-src/org/eclipse/linuxtools/eclipsebuild/SymlinkOSGiJars.java
index b96db9e..7f34c0f 100644
--- a/task-src/org/eclipse/linuxtools/eclipsebuild/SymlinkOSGiJars.java
+++ b/task-src/org/eclipse/linuxtools/eclipsebuild/SymlinkOSGiJars.java
@@ -34,7 +34,6 @@ public class SymlinkOSGiJars extends Task {
 	private Properties dependencies;
 	private String topLevelDir;
 	private String manifestsDir;
-	private boolean keepOrigNames = true;
 	
 	// Main method for ant task
     public void execute() throws BuildException {
@@ -46,81 +45,32 @@ public class SymlinkOSGiJars extends Task {
     		String origManifestFile = manifestsDir + "/" + origLocation + "/META-INF/MANIFEST.MF";
     		Attributes origAttributes = getAttributesFromManifest(origManifestFile);
 			
-			// System MANIFEST.MF
 			String systemLocations = (String) dependencies.get(origLocation);
 			String[] systemLocationList = systemLocations.split(":");
-			File matchedJar = null;
 			String matchedJarBundleNameVersion = "";
 			Attributes systemAttributes = null;
+			File matchedJar = null;
+
 			for (int i = 0; i < systemLocationList.length; i++) {
-				boolean isAMatch = true;
 				File systemFile = new File(systemLocationList[i]);
-				if (systemFile.exists()) {
-					JarFile systemJarFile;
-					log("Seeing if " + systemFile + " is a suitable match for "
-							+ origLocation, Project.MSG_DEBUG);
-					try {
-						systemJarFile = new JarFile(systemFile);
-						Manifest systemManifest = systemJarFile.getManifest();
-						systemAttributes = systemManifest.getMainAttributes();
-						for (int j = 0; j < importantManifestEntries.length; j++) {
-							String attributeToCheck = importantManifestEntries[j];
-							String origAttribute = (String) origAttributes.getValue(attributeToCheck);
-							String systemAttribute = (String) systemAttributes.getValue(attributeToCheck);
-							// System version should be higher; ignore qualifier
-							if (attributeToCheck.equals("Bundle-Version")) {
-								String[] origVersionSegments = origAttribute.split("\\.");
-								String[] systemVersionSegments = systemAttribute.split("\\.");
-								// Orbit JARs always have major.minor.micro.qualifier
-								Integer origInteger =
-									new Integer(origVersionSegments[0]) * 100
-								    + new Integer(origVersionSegments[1]) * 10
-									+ new Integer(origVersionSegments[2]);
-								// System JARs sometimes don't have 4 parts
-								int maxSegments = systemVersionSegments.length;
-								if (systemVersionSegments.length > 3)
-									maxSegments = 3;
-								Integer systemInteger = new Integer(0);
-								for (int m = 0; m < maxSegments; m++) {
-									systemInteger = systemInteger + 
-										new Integer(systemVersionSegments[m]) *
-										  (int) Math.pow(10, (2-m));
-								}
-								if (systemInteger < origInteger) {
-									isAMatch = false;
-									break;
-								}
-							} else if (attributeToCheck
-									.equals("Export-Package")) {
-								if (origAttribute != null
-										&& systemAttribute != null) {
-									if (!origAttribute.equals(systemAttribute)) {
-										log("Export-Package attributes do not match for "
-														+ origLocation
-														+ " and "
-														+ systemFile, Project.MSG_WARN);
-									}
-								}
-							} else {
-								if (origAttribute != null
-										&& systemAttribute != null) {
-									if (!origAttribute.equals(systemAttribute)) {
-										isAMatch = false;
-										break;
-									}
-								} else {
-									isAMatch = false;
-									break;
-								}
-							}
-						}
-					} catch (IOException e) {
-						// not a JAR file or can't be read
-					} 
-				} else {
-					isAMatch = false;
+				if (!systemFile.exists())
+					break;
+				log("Seeing if " + systemFile + " is a suitable match for " + origLocation, Project.MSG_DEBUG);
+
+				JarFile systemJarFile;
+				Manifest systemManifest = null;
+				try {
+					systemJarFile = new JarFile(systemFile);
+					// System MANIFEST.MF
+					systemManifest = systemJarFile.getManifest();
+				} catch (IOException e) {
+					// not a JAR file or can't be read
 				}
-				if (isAMatch) {
+				if (systemManifest == null)
+					break;
+				
+				systemAttributes = systemManifest.getMainAttributes();
+				if (compareImportantAttributes(origAttributes, systemAttributes)) {
 					matchedJar = systemFile;
 					String matchedJarBundleName =
 						systemAttributes.getValue("Bundle-SymbolicName");
@@ -132,38 +82,23 @@ public class SymlinkOSGiJars extends Task {
 					break;
 				}
 			}
+			
 			if (matchedJar == null) {
-				String attemptedLocations = "";
-				for (int j = 0; j < systemLocationList.length; j++) {
-					if (j == 0)
-						attemptedLocations = systemLocationList[j];
-					else
-						attemptedLocations = attemptedLocations + ", "
-								+ systemLocationList[j];
-				}
-				throw new BuildException(
-						"Could not find suitable system JAR for "
-								+ origLocation + ".  Tried:  "
-								+ attemptedLocations);
+				String noSystemJarMsg = buildNoSystemJarMsg(origLocation, systemLocationList);
+				throw new BuildException(noSystemJarMsg);
 			}
 			
-			
 			// First, delete any existing symlink
 			Delete d = new Delete();
 			d.init();
+			
 			d.setFile(new File(topLevelDir + "/" + origLocation));
 			d.execute();
-			
+
 			// Then make the actual symlink
 			Symlink s = new Symlink();
 			s.init();
-			if (keepOrigNames) {
-				log("Going to symlink " + origLocation + " to " + matchedJar.getAbsolutePath(), Project.MSG_DEBUG);
-				s.setLink(topLevelDir + "/" + origLocation);
-			} else {
-				log("Going to symlink " + matchedJarBundleNameVersion + ".jar" + " to " + matchedJar.getAbsolutePath(), Project.MSG_DEBUG);
-				s.setLink(topLevelDir + "/" + matchedJarBundleNameVersion + ".jar");
-			}
+			s.setLink(topLevelDir + "/" + matchedJarBundleNameVersion + ".jar");
 			s.setResource(matchedJar.getAbsolutePath());
 			s.execute();
 		}
@@ -181,7 +116,76 @@ public class SymlinkOSGiJars extends Task {
 		Attributes origAttributes = origManifest.getMainAttributes();
 		return origAttributes;
 	}
- 
+	
+	private boolean compareImportantAttributes(Attributes origAttributes,
+			Attributes systemAttributes) {
+		boolean isAMatch = true;
+		for (int j = 0; j < importantManifestEntries.length; j++) {
+			String attributeToCheck = importantManifestEntries[j];
+			String origAttribute = (String) origAttributes
+					.getValue(attributeToCheck);
+			String systemAttribute = (String) systemAttributes
+					.getValue(attributeToCheck);
+			if (attributeToCheck.equals("Bundle-Version")) {
+				// System version should be higher; ignore qualifier
+				String[] origVersionSegments = origAttribute.split("\\.");
+				String[] systemVersionSegments = systemAttribute.split("\\.");
+				// Orbit JARs always have major.minor.micro.qualifier
+				Integer origInteger = new Integer(origVersionSegments[0]) * 100
+						+ new Integer(origVersionSegments[1]) * 10
+						+ new Integer(origVersionSegments[2]);
+				// System JARs sometimes don't have 4 parts
+				int maxSegments = systemVersionSegments.length;
+				if (systemVersionSegments.length > 3)
+					maxSegments = 3;
+				Integer systemInteger = new Integer(0);
+				for (int m = 0; m < maxSegments; m++) {
+					systemInteger = systemInteger
+							+ new Integer(systemVersionSegments[m])
+							* (int) Math.pow(10, (2 - m));
+				}
+				if (systemInteger < origInteger) {
+					isAMatch = false;
+					break;
+				}
+			} else if (attributeToCheck.equals("Export-Package")) {
+				if (origAttribute != null && systemAttribute != null) {
+					if (!origAttribute.equals(systemAttribute)) {
+						log("Export-Package attributes do not match for "
+								+ origAttributes
+										.getValue("Bundle-SymbolicName"),
+								Project.MSG_WARN);
+					}
+				}
+			} else {
+				if (origAttribute != null && systemAttribute != null) {
+					if (!origAttribute.equals(systemAttribute)) {
+						isAMatch = false;
+						break;
+					}
+				} else {
+					isAMatch = false;
+					break;
+				}
+			}
+		}
+		return isAMatch;
+	}
+	
+	private String buildNoSystemJarMsg(String origLocation,
+			String[] systemLocationList) {
+		String attemptedLocations = "";
+		for (int j = 0; j < systemLocationList.length; j++) {
+			if (j == 0)
+				attemptedLocations = systemLocationList[j];
+			else
+				attemptedLocations = attemptedLocations + ", "
+						+ systemLocationList[j];
+		}
+		return "Could not find suitable system JAR for " + origLocation
+				+ ".  Tried:  " + attemptedLocations;
+	}
+
 	public void setDependencies(File dependencyProperties) {
 		dependencies = new Properties();
 		FileInputStream fis;
@@ -198,7 +202,6 @@ public class SymlinkOSGiJars extends Task {
 		}
 	}
 
-
 	public void setTopleveldir(String topLevelDir) {
 		this.topLevelDir = topLevelDir;
 	}
@@ -206,8 +209,4 @@ public class SymlinkOSGiJars extends Task {
 	public void setManifests(String manifests) {
 		this.manifestsDir = manifests;
 	}
-	
-	public void setKeeporignames(boolean keeporignames) {
-		this.keepOrigNames = keeporignames;
-	}
 }


hooks/post-receive
-- 
eclipse - Powerful IDE written in java - Debian package.



More information about the pkg-java-commits mailing list