|
From: <fd...@us...> - 2009-03-08 10:02:19
|
Revision: 5094
http://jnode.svn.sourceforge.net/jnode/?rev=5094&view=rev
Author: fduminy
Date: 2009-03-08 10:02:17 +0000 (Sun, 08 Mar 2009)
Log Message:
-----------
fixed build process to support multiple versions of a library (aka 2 plugins with the same id but with a different version)
Modified Paths:
--------------
trunk/builder/src/builder/org/jnode/build/AbstractBootImageBuilder.java
trunk/builder/src/builder/org/jnode/build/InitJarBuilder.java
trunk/builder/src/builder/org/jnode/build/PluginList.java
trunk/builder/src/builder/org/jnode/build/packager/PluginListInsertor.java
trunk/core/src/core/org/jnode/plugin/PluginDescriptor.java
trunk/core/src/core/org/jnode/plugin/model/PluginDescriptorModel.java
trunk/core/src/core/org/jnode/plugin/model/PluginRegistryModel.java
trunk/core/src/emu/org/jnode/emu/plugin/model/DummyPluginDescriptor.java
Modified: trunk/builder/src/builder/org/jnode/build/AbstractBootImageBuilder.java
===================================================================
--- trunk/builder/src/builder/org/jnode/build/AbstractBootImageBuilder.java 2009-03-08 09:22:32 UTC (rev 5093)
+++ trunk/builder/src/builder/org/jnode/build/AbstractBootImageBuilder.java 2009-03-08 10:02:17 UTC (rev 5094)
@@ -407,7 +407,7 @@
try {
log("plugin-list: " + getPluginListFile(), Project.MSG_DEBUG);
piList = getPluginList();
- memMgrPluginURL = piList.createPluginURL(memMgrPluginId);
+ memMgrPluginURL = piList.createPluginURL(memMgrPluginId, version);
lmPI = Math.max(piList.lastModified(), memMgrPluginURL.openConnection().getLastModified());
} catch (PluginException ex) {
throw new BuildException(ex);
Modified: trunk/builder/src/builder/org/jnode/build/InitJarBuilder.java
===================================================================
--- trunk/builder/src/builder/org/jnode/build/InitJarBuilder.java 2009-03-08 09:22:32 UTC (rev 5093)
+++ trunk/builder/src/builder/org/jnode/build/InitJarBuilder.java 2009-03-08 10:02:17 UTC (rev 5094)
@@ -24,9 +24,11 @@
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import org.apache.tools.ant.Project;
@@ -188,20 +190,49 @@
*/
protected void testPluginPrerequisites(List<PluginJar> pluginJars)
throws BuildException {
- final HashSet<String> ids = new HashSet<String>();
-
+ final Map<String, List<String>> idToVersions = new HashMap<String, List<String>>();
+
+ // get all couples (id, version) in idToVersions
for (PluginJar piJar : pluginJars) {
final PluginDescriptor descr = piJar.getDescriptor();
- ids.add(descr.getId());
+
+ List<String> versions = idToVersions.get(descr.getId());
+ if (versions == null) {
+ versions = new ArrayList<String>();
+ idToVersions.put(descr.getId(), versions);
+ }
+
+ versions.add(descr.getVersion());
}
+
+ // now, check that each dependency is satisfied
for (PluginJar piJar : pluginJars) {
final PluginDescriptor descr = piJar.getDescriptor();
final PluginPrerequisite[] prereqs = descr.getPrerequisites();
+
for (int j = 0; j < prereqs.length; j++) {
- if (!ids.contains(prereqs[j].getPluginId())) {
+ PluginPrerequisite required = prereqs[j];
+ List<String> versions = idToVersions.get(required.getPluginId());
+
+ boolean versionSpecified = (required.getPluginVersion() == null);
+
+ boolean satisfied = false;
+ if (versions != null) {
+ satisfied = !versionSpecified ||
+ versions.contains(required.getPluginVersion());
+ }
+
+ if (!satisfied) {
+ String reqVersionStr = versionSpecified ? "" : " version " +
+ required.getPluginVersion();
+
+ String versionStr = (descr.getVersion() == null) ? "" : " version " +
+ descr.getVersion();
+
throw new BuildException("Cannot find plugin "
- + prereqs[j].getPluginId()
- + ", which is required by " + descr.getId());
+ + required.getPluginId() + reqVersionStr
+ + ", which is required by " + descr.getId()
+ + versionStr);
}
}
}
Modified: trunk/builder/src/builder/org/jnode/build/PluginList.java
===================================================================
--- trunk/builder/src/builder/org/jnode/build/PluginList.java 2009-03-08 09:22:32 UTC (rev 5093)
+++ trunk/builder/src/builder/org/jnode/build/PluginList.java 2009-03-08 10:02:17 UTC (rev 5094)
@@ -90,8 +90,12 @@
throw new PluginException("id attribute expected on "
+ e.getName());
}
+
+ // version attribute is optional
+ // if not specified, then the latest version found will be used.
+ final String version = e.getStringAttribute("version");
- addPlugin(descrList, pluginList, id);
+ addPlugin(descrList, pluginList, id, version);
} else if (e.getName().equals("manifest")) {
manifest = parseManifest(e);
} else if (e.getName().equals("include")) {
@@ -103,39 +107,76 @@
}
}
- public void addPlugin(String id) throws MalformedURLException, PluginException {
- addPlugin(descrList, pluginList, id);
+ /**
+ *
+ * @param id
+ * @param version optional
+ * @throws MalformedURLException
+ * @throws PluginException
+ */
+ public void addPlugin(String id, String version) throws MalformedURLException, PluginException {
+ addPlugin(descrList, pluginList, id, version);
}
- private void addPlugin(List<URL> descrList, List<URL> pluginList, String id)
+ /**
+ *
+ * @param descrList
+ * @param pluginList
+ * @param id
+ * @param version optional parameter
+ * @throws MalformedURLException
+ * @throws PluginException
+ */
+ private void addPlugin(List<URL> descrList, List<URL> pluginList, String id, String version)
throws MalformedURLException, PluginException {
- final File f = findPlugin(defaultDir, id);
+ final File f = findPlugin(defaultDir, id, version);
final URL pluginUrl = f.toURL();
final URL descrUrl = new URL("jar:" + pluginUrl + "!/plugin.xml");
-
+
if (pluginList.contains(pluginUrl)) {
- throw new PluginException("can't use the same id(" + id + ") for multiple plugins");
+ String versionStr = (version == null) ? "unspecified" : version;
+ throw new PluginException("can't use the same id(" + id +
+ ") and version(" + versionStr + ") for multiple plugins");
}
descrList.add(descrUrl);
pluginList.add(pluginUrl);
}
- private File findPlugin(File dir, final String id) {
+ private File findPlugin(File dir, final String id, String version) {
// System.out.println("Find " + id + " in " + dir);
+ final String begin = id + "_";
+ final String end = ".jar";
+
String[] names = dir.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
- return name.startsWith(id + "_") && name.endsWith(".jar");
+ return name.startsWith(begin) && name.endsWith(end);
}
});
if (names.length == 0) {
throw new IllegalArgumentException("Cannot find plugin " + id
+ " in " + dir + " for list " + this.name);
- } else {
- Arrays.sort(names);
- return new File(dir, names[names.length - 1]);
}
+
+ String filename = null;
+ if (version != null) {
+ // version specified, try to find it
+ for (String name : names) {
+ String v = name.substring(begin.length(), name.length() - end.length());
+ if (version.equals(v)) {
+ filename = name; // found exact version
+ break;
+ }
+ }
+ }
+
+ if (filename == null) {
+ // by default, take the latest version
+ filename = names[names.length - 1];
+ }
+
+ return new File(dir, filename);
}
private Manifest parseManifest(XMLElement me) throws PluginException {
@@ -239,11 +280,11 @@
}
/**
- * Create an URL to a plugin with a given id.
+ * Create an URL to a plugin with a given id and version.
*/
- public final URL createPluginURL(String id) {
+ public final URL createPluginURL(String id, String version) {
try {
- return findPlugin(defaultDir, id).toURL();
+ return findPlugin(defaultDir, id, version).toURL();
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
Modified: trunk/builder/src/builder/org/jnode/build/packager/PluginListInsertor.java
===================================================================
--- trunk/builder/src/builder/org/jnode/build/packager/PluginListInsertor.java 2009-03-08 09:22:32 UTC (rev 5093)
+++ trunk/builder/src/builder/org/jnode/build/packager/PluginListInsertor.java 2009-03-08 10:02:17 UTC (rev 5094)
@@ -49,7 +49,7 @@
if (isEnabled()) {
for (String pluginId : readPluginIds(list.getName())) {
log("Adding user plugin " + pluginId + " to " + list.getName(), Project.MSG_INFO);
- list.addPlugin(pluginId);
+ list.addPlugin(pluginId, null);
}
} else {
log("PluginListInsertor is disabled", Project.MSG_INFO);
Modified: trunk/core/src/core/org/jnode/plugin/PluginDescriptor.java
===================================================================
--- trunk/core/src/core/org/jnode/plugin/PluginDescriptor.java 2009-03-08 09:22:32 UTC (rev 5093)
+++ trunk/core/src/core/org/jnode/plugin/PluginDescriptor.java 2009-03-08 10:02:17 UTC (rev 5094)
@@ -80,8 +80,14 @@
* @return the version
*/
public abstract String getVersion();
-
+
/**
+ * Get the plugin reference, something that uniquely identify a plugin (id + version)
+ * @return
+ */
+ public PluginReference getPluginReference();
+
+ /**
* Gets the required imports.
*
* @return the required imports
Modified: trunk/core/src/core/org/jnode/plugin/model/PluginDescriptorModel.java
===================================================================
--- trunk/core/src/core/org/jnode/plugin/model/PluginDescriptorModel.java 2009-03-08 09:22:32 UTC (rev 5093)
+++ trunk/core/src/core/org/jnode/plugin/model/PluginDescriptorModel.java 2009-03-08 10:02:17 UTC (rev 5094)
@@ -38,6 +38,7 @@
import org.jnode.plugin.PluginDescriptorListener;
import org.jnode.plugin.PluginException;
import org.jnode.plugin.PluginPrerequisite;
+import org.jnode.plugin.PluginReference;
import org.jnode.plugin.Runtime;
import org.jnode.system.BootLog;
import org.jnode.util.BootableArrayList;
@@ -106,6 +107,8 @@
private final String version;
private final int priority;
+
+ private PluginReference reference;
/**
* Create a new instance
@@ -529,6 +532,17 @@
public String getVersion() {
return version;
}
+
+ /**
+ * {@inheritDoc}
+ */
+ public PluginReference getPluginReference() {
+ if (reference == null) {
+ // lazy creation
+ reference = new PluginReference(id, version);
+ }
+ return reference;
+ }
/**
* Does this plugin have a custom plugin class specified?
Modified: trunk/core/src/core/org/jnode/plugin/model/PluginRegistryModel.java
===================================================================
--- trunk/core/src/core/org/jnode/plugin/model/PluginRegistryModel.java 2009-03-08 09:22:32 UTC (rev 5093)
+++ trunk/core/src/core/org/jnode/plugin/model/PluginRegistryModel.java 2009-03-08 10:02:17 UTC (rev 5094)
@@ -435,7 +435,7 @@
}
// Now remove it
- unloadedIds.add(new PluginReference(descr.getId(), descr.getVersion()));
+ unloadedIds.add(descr.getPluginReference());
descr.unresolve(this);
}
}
Modified: trunk/core/src/emu/org/jnode/emu/plugin/model/DummyPluginDescriptor.java
===================================================================
--- trunk/core/src/emu/org/jnode/emu/plugin/model/DummyPluginDescriptor.java 2009-03-08 09:22:32 UTC (rev 5093)
+++ trunk/core/src/emu/org/jnode/emu/plugin/model/DummyPluginDescriptor.java 2009-03-08 10:02:17 UTC (rev 5094)
@@ -30,6 +30,7 @@
import org.jnode.plugin.PluginDescriptorListener;
import org.jnode.plugin.PluginException;
import org.jnode.plugin.PluginPrerequisite;
+import org.jnode.plugin.PluginReference;
import org.jnode.plugin.Runtime;
/**
@@ -158,4 +159,8 @@
// TODO Auto-generated method stub
}
+
+ public PluginReference getPluginReference() {
+ return null;
+ }
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|