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. |