From: <jar...@us...> - 2012-03-05 19:23:55
|
Revision: 21247 http://jedit.svn.sourceforge.net/jedit/?rev=21247&view=rev Author: jarekczek Date: 2012-03-05 19:23:48 +0000 (Mon, 05 Mar 2012) Log Message: ----------- Added a new typedef: plugininfo, which took some code from get-plugin-info task. A new typedef allows for more ant-like syntax and has a new capability: reading plugin info from jar files. This funcionality is a prerequisite for downloading plugin dependencies recursively. Modified Paths: -------------- build-support/trunk/java-src/org/jedit/ant/GetPluginInfoTask.java build-support/trunk/java-src/org/jedit/ant/GetPluginJarNameTask.java build-support/trunk/java-src/org/jedit/ant/antlib.xml build-support/trunk/plugin-build.xml Added Paths: ----------- build-support/trunk/java-src/org/jedit/ant/PluginInfoType.java Modified: build-support/trunk/java-src/org/jedit/ant/GetPluginInfoTask.java =================================================================== --- build-support/trunk/java-src/org/jedit/ant/GetPluginInfoTask.java 2012-03-05 17:26:56 UTC (rev 21246) +++ build-support/trunk/java-src/org/jedit/ant/GetPluginInfoTask.java 2012-03-05 19:23:48 UTC (rev 21247) @@ -32,9 +32,9 @@ import org.apache.tools.ant.types.resources.FileResource; import org.apache.tools.ant.types.resources.FileResourceIterator; -/** Takes fileset ids as arguments: <code>fsSrc</code> and - <code>fsExtras</code> and generates plugin information. - Sets the following properties:<ul> +/** Takes <code>plugininfo</code> as nested argument and stores the plugin + info as properties. + <p>The following properties are set:<ul> <li>plugin.class.name - e.g. projectviewer.ProjectPlugin <li>plugin.jar.name - e.g. ProjectViewer <li>plugin.jedit.version.full - e.g. 4.4.99.0 @@ -44,137 +44,33 @@ <li>plugin.dep.X.jar.name - e.g. CommonControls </ul> and a property set <code>plugin.props.set</code>. + Properties names and property set name may be prefixed if + the <code>prefix</code> attribute is specified. When providing this + attribute include a dot at the end. */ public class GetPluginInfoTask extends Task { - private FileSet fsSrc; - private FileSet fsExtras; - private Project p; - private PropertySet ps; + private PluginInfoType pi; + private String sPrefix = ""; - //{{{ getPluginClassName method - /** Gets an <code>Iterator</code> over objects implementing - <code>toString</code> and discovers the plugin name. - The strings are treated as filenames and the filename ending - with <code>Plugin.java</code> denotes the plugin name. - This is the same as done in - <code>org.gjt.sp.jedit.PluginJAR.generateCache()</code>. - @param sBaseDir The base directory will be substracted from plugin - filename to get only the part containing the - package name. May be <code>null</code> - @param it The <code>iterator</code> over <code>Object</code>s, - which implement <code>toString()</code> - @return <code>null</code> if not a plugin. - */ - public static String getPluginClassName(String sBaseDir, Iterator it) { - String sPluginClass = null; - while (it.hasNext()) { - String sFile = it.next().toString(); - if (sFile.endsWith("Plugin.java")) { - sPluginClass = sFile.substring(sBaseDir.length()+1); - sPluginClass = sPluginClass.replaceFirst("\\.java$", ""); - sPluginClass = sPluginClass.replaceAll("[/\\\\]", "."); - break; - } - } - return sPluginClass; - } //}}} - - //{{{ parsePropse method - /** Reads dependencies from properties. - * See <code>PluginJAR.checkDependencies()</code> */ - private void parseProps(String sPluginClass, Properties props) - { - int i, iPluginDep; - i = 0; iPluginDep = 0; - String sDepPropName = "plugin." + sPluginClass + ".depend."; - String sDep; - while((sDep = props.getProperty(sDepPropName + i)) != null) { - String asDeps[] = sDep.split(" "); - if (asDeps[0].equals("jedit")) { - p.setProperty("plugin.jedit.version.full", asDeps[1]); - String v[] = asDeps[1].split("\\."); - getProject().setProperty("plugin.jedit.version", v[0] + "." + v[1]); - ps.appendName("plugin.jedit.version.full"); - ps.appendName("plugin.jedit.version"); - } - if (asDeps[0].equals("optional")) { - // ignore the optional keyword, treat as usual plugin dep - asDeps = java.util.Arrays.copyOfRange(asDeps, 1, asDeps.length); - } - if (asDeps[0].equals("plugin")) { - //print("" + iPluginDep + asDeps[1] + "-" + asDeps[2]); - String sPref = "plugin.dep." + iPluginDep; - String sDepPluginClass = asDeps[1]; - p.setProperty(sPref + ".class", sDepPluginClass); - p.setProperty(sPref + ".version", asDeps[2]); - ps.appendRegex(sPref + "\\.*"); - String sJarName = GetPluginJarNameTask.getJarName(asDeps[1]); - p.setProperty(sPref + ".jar.name", sJarName); - iPluginDep++; - } - - i++; - } - p.setProperty("plugin.dep.count", "" + iPluginDep); - } //}}} - @Override public void execute() { - p = getProject(); - if (fsSrc == null) { - throw new BuildException("fsSrc parameter not specified."); + if (pi == null) { + throw new BuildException("pluginInfo not provided"); } - if (fsExtras == null) { - throw new BuildException("fsSrc parameter not specified."); - } - - String sPluginClass = getPluginClassName(fsSrc.getDir().toString(), - fsSrc.iterator()); - getProject().setProperty("plugin.class.name", sPluginClass); - ps = (PropertySet)getProject().createDataType("propertyset"); - getProject().addReference("plugin.props.set", ps); - //print("no src files:" + fsSrc.size()); - - ps.appendName("plugin.class.name"); - ps.appendName("plugin.jar.name"); - ps.appendName("plugin.dep.count"); - - // load all props files {{{ - Properties props = new Properties(); - FileResourceIterator it = (FileResourceIterator)fsExtras.iterator(); - while (it.hasNext()) { - FileResource fr = (FileResource)it.next(); - if (fr.toString().endsWith(".props")) { - try { - props.load(fr.getInputStream()); - } - catch (java.io.IOException e) { - throw new BuildException(e); - } - } - } // }}} - - parseProps(sPluginClass, props); + pi.setProjectProperties(sPrefix); } - public void setFsSrc(String sId) + public void add(PluginInfoType pi) { - Object o = getProject().getReference(sId); - if (o == null || !(o instanceof FileSet)) { - throw new BuildException("Fileset id fsSrc not correct."); - } - fsSrc = (FileSet)o; + this.pi = pi; } - public void setFsExtras(String sId) + public void setPrefix(String s) { - Object o = getProject().getReference(sId); - if (o == null || !(o instanceof FileSet)) { - throw new BuildException("Fileset id fsExtras not correct."); - } - fsExtras = (FileSet)o; + sPrefix = s; } + } \ No newline at end of file Modified: build-support/trunk/java-src/org/jedit/ant/GetPluginJarNameTask.java =================================================================== --- build-support/trunk/java-src/org/jedit/ant/GetPluginJarNameTask.java 2012-03-05 17:26:56 UTC (rev 21246) +++ build-support/trunk/java-src/org/jedit/ant/GetPluginJarNameTask.java 2012-03-05 19:23:48 UTC (rev 21247) @@ -40,10 +40,12 @@ private String sOutputProp; /** To be used as a non-task - @return Never <code>null</code>. When no other clue + @return <code>null</code> if <code>sClassName</code> + is <code>null</code>. When no other clue - <code>sClassName</code> */ public static String getJarName(String sClassName) { + if (sClassName == null) { return null; } String sJarName = sClassName; sJarName = sJarName.replaceFirst("^.*\\.([^\\.]+)$", "$1"); if (sJarName.length()>9) { Added: build-support/trunk/java-src/org/jedit/ant/PluginInfoType.java =================================================================== --- build-support/trunk/java-src/org/jedit/ant/PluginInfoType.java (rev 0) +++ build-support/trunk/java-src/org/jedit/ant/PluginInfoType.java 2012-03-05 19:23:48 UTC (rev 21247) @@ -0,0 +1,274 @@ +/* + * Definition of an ant type for jedit build environment. + * :tabSize=2:indentSize=2:noTabs=true: + * :folding=explicit:collapseFolds=1: + * + * Copyright (C) 2012 Jarek Czekalski + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +package org.jedit.ant; + +import java.util.Arrays; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.Properties; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.types.DataType; +import org.apache.tools.ant.types.FileSet; +import org.apache.tools.ant.types.PropertySet; +import org.apache.tools.ant.types.resources.FileResource; +import org.apache.tools.ant.types.resources.FileResourceIterator; + +/** Takes filesets as nested arguments: <code>fsSrc</code> and + <code>fsExtras</code> and retrieves plugin information. + Alternatively <code>jar</code> attibute may be given to parse the + jar contents instead of filesets. + */ + +public class PluginInfoType extends DataType +{ + // input parameters + private FileSet fsSrc; + private FileSet fsExtras; + private String sJarIn; + + // plugin info + private String sClass; + private String sJar; + private String sJeditVersionShort; + private String sJeditVersionFull; + private ArrayList<Dep> deps = new ArrayList<Dep>(); + + /** Whether the info is already filled. */ + private boolean bFilled; + private Project p; + + //{{{ getPluginClassName method + /** Gets an <code>Iterator</code> over objects implementing + <code>toString</code> and discovers the plugin name. + The strings are treated as filenames and the filename ending + with <code>Plugin.java</code> denotes the plugin name. + This is the same as done in + <code>org.gjt.sp.jedit.PluginJAR.generateCache()</code>. + @param sBaseDir The base directory will be substracted from plugin + filename to get only the part containing the + package name. May be <code>null</code> + @param it The <code>iterator</code> over <code>Object</code>s, + which implement <code>toString()</code> + @return <code>null</code> if not a plugin. + */ + public static String getPluginClassName(String sBaseDir, Iterator it) { + String sPluginClass = null; + while (it.hasNext()) { + String sFile = it.next().toString(); + if (sFile.endsWith("Plugin.java") || + sFile.endsWith("Plugin.class") ) { + sPluginClass = sFile; + if (sBaseDir != null) { + sPluginClass = sPluginClass.substring(sBaseDir.length()+1); + } + sPluginClass = sPluginClass.replaceFirst("\\.((java)|(class))$", ""); + sPluginClass = sPluginClass.replaceAll("[/\\\\]", "."); + break; + } + } + return sPluginClass; + } //}}} + + //{{{ fill() method + public void fill() + { + if (isReference()) { getRef().fill(); return; } + if (bFilled) { return; } + Iterator itSrc, itExtras; + String sBaseDir; + ZipFile zip = null; + p = getProject(); + if (sJarIn != null) { + // process jar file to get the info + try { + zip = new ZipFile(sJarIn); + sBaseDir = null; + itSrc = Collections.list(zip.entries()).iterator(); + itExtras = itSrc; + } catch (java.io.IOException ioe) { + throw new BuildException(ioe); + } + } else { + // filesets given as source for the info + if (fsSrc == null) { + throw new BuildException("fsSrc parameter not specified."); + } + if (fsExtras == null) { + throw new BuildException("fsExtras parameter not specified."); + } + sBaseDir = fsSrc.getDir().toString(); + itSrc = fsSrc.iterator(); + itExtras = fsExtras.iterator(); + } + sClass = getPluginClassName(sBaseDir, itSrc); + sJar = GetPluginJarNameTask.getJarName(sClass); + + // load all props files {{{ + Properties props = new Properties(); + while (itExtras.hasNext()) { + Object entry = itExtras.next(); + if (entry.toString().endsWith(".props")) { + try { + if (sJarIn != null) { + ZipEntry zipEntry = (ZipEntry)entry; + props.load(zip.getInputStream(zipEntry)); + } else { + FileResource fr = (FileResource)entry; + props.load(fr.getInputStream()); + } + } catch (java.io.IOException e) { + throw new BuildException(e); + } + } + } // }}} + + parseProps(sClass, props); + bFilled = true; + } //}}} + + //{{{ parsePropse method + /** Reads dependencies from properties. + * See <code>PluginJAR.checkDependencies()</code> */ + private void parseProps(String sPluginClass, Properties props) + { + int i, iPluginDep; + i = 0; iPluginDep = 0; + String sDepPropName = "plugin." + sPluginClass + ".depend."; + String sDep; + while((sDep = props.getProperty(sDepPropName + i)) != null) { + String asDeps[] = sDep.split(" "); + if (asDeps[0].equals("jedit")) { + sJeditVersionFull = asDeps[1]; + String v[] = sJeditVersionFull.split("\\."); + sJeditVersionShort = v[0] + "." + v[1]; + } + if (asDeps[0].equals("optional")) { + // ignore the optional keyword, treat as usual plugin dep + asDeps = Arrays.copyOfRange(asDeps, 1, asDeps.length); + } + if (asDeps[0].equals("plugin")) { + Dep dep = new Dep(); + //print("" + iPluginDep + asDeps[1] + "-" + asDeps[2]); + String sPref = "plugin.dep." + iPluginDep; + dep.sClass = asDeps[1]; + dep.sVersion = asDeps[2]; + dep.sJar = GetPluginJarNameTask.getJarName(asDeps[1]); + deps.add(dep); + iPluginDep++; + } + + i++; + } + } //}}} + + public void setJar(String s) + { + sJarIn = s; + checkAttr(); + } + + public void addFsSrc(FileSet fs) + { + fsSrc = fs; + checkAttr(); + } + + public void addFsExtras(FileSet fs) + { + fsExtras = fs; + checkAttr(); + } + + private void checkAttr() + { + p = getProject(); + if (sJarIn != null && (fsSrc != null || fsExtras != null)) { + throw new BuildException("jar and fsSrc/Extras " + + "are mutually exclusive."); + } + } + + protected PluginInfoType getRef() { + return (PluginInfoType) getCheckedRef(PluginInfoType.class, + "plugininfotype"); + } + + public String toString() + { + if (isReference()) { return getRef().toString(); } + String s; + if (!bFilled) { fill(); } + s = "Plugin class name: " + sClass + ", jar name: " + sJar + "\n"; + s += "jedit version: " + sJeditVersionFull; + s += ", dependencies count: " + deps.size() + "\n"; + for (Dep dep: deps) { + s += "dependency: " + dep.sJar + " " + dep.sVersion + "\n"; + } + return s; + } + + //{{{ setProjectProperties() method + /** Stores plugin info in project properties. For details see + {@link GetPluginInfoTask}. + @param sPref Prefix added to the properties. May not be + <code>null</code> + */ + public void setProjectProperties(String sPref) + { + if (isReference()) { getRef().setProjectProperties(sPref); return; } + fill(); + PropertySet ps = (PropertySet)p.createDataType("propertyset"); + p.addReference(sPref + "plugin.props.set", ps); + p.setProperty(sPref + "plugin.class.name", sClass); + p.setProperty(sPref + "plugin.jar.name", sJar); + p.setProperty(sPref + "plugin.jedit.version.full", sJeditVersionFull); + p.setProperty(sPref + "plugin.jedit.version", sJeditVersionShort); + p.setProperty(sPref + "plugin.dep.count", "" + deps.size()); + ps.appendName(sPref + "plugin.class.name"); + ps.appendName(sPref + "plugin.jar.name"); + ps.appendName(sPref + "plugin.jedit.version.full"); + ps.appendName(sPref + "plugin.jedit.version"); + ps.appendName(sPref + "plugin.dep.count"); + for (int i=0; i<deps.size(); i++) { + Dep dep = deps.get(i); + String sDepPref = sPref + "plugin.dep." + i; + p.setProperty(sDepPref + ".class", dep.sClass); + p.setProperty(sDepPref + ".version", dep.sVersion); + p.setProperty(sDepPref + ".jar.name", dep.sJar); + ps.appendRegex(sDepPref + "\\.*"); + } + } //}}} + + //{{{ Dep class + /** Plugin dependency information */ + public static class Dep + { + String sClass; + String sVersion; + String sJar; + } //}}} +} \ No newline at end of file Modified: build-support/trunk/java-src/org/jedit/ant/antlib.xml =================================================================== --- build-support/trunk/java-src/org/jedit/ant/antlib.xml 2012-03-05 17:26:56 UTC (rev 21246) +++ build-support/trunk/java-src/org/jedit/ant/antlib.xml 2012-03-05 19:23:48 UTC (rev 21247) @@ -1,6 +1,8 @@ <?xml version="1.0"?> <antlib> - <taskdef name="gen-plugin-deps-ivy-file" classname="org.jedit.ant.GenPluginDepsIvyFileTask"/> - <taskdef name="get-plugin-info" classname="org.jedit.ant.GetPluginInfoTask"/> - <taskdef name="get-plugin-jar-name" classname="org.jedit.ant.GetPluginJarNameTask"/> + <typedef name="plugininfo" classname="org.jedit.ant.PluginInfoType"/> + + <taskdef name="gen-plugin-deps-ivy-file" classname="org.jedit.ant.GenPluginDepsIvyFileTask"/> + <taskdef name="get-plugin-info" classname="org.jedit.ant.GetPluginInfoTask"/> + <taskdef name="get-plugin-jar-name" classname="org.jedit.ant.GetPluginJarNameTask"/> </antlib> Modified: build-support/trunk/plugin-build.xml =================================================================== --- build-support/trunk/plugin-build.xml 2012-03-05 17:26:56 UTC (rev 21246) +++ build-support/trunk/plugin-build.xml 2012-03-05 19:23:48 UTC (rev 21247) @@ -668,16 +668,16 @@ <target name="get-plugin-info" depends="def-jedit-tasks" > <local name="src.fileset" /> <local name="extras.fileset" /> - <fileset id="src.fileset" dir="${src.dir}" > - <selector refid="compileFiles" /> - </fileset> - <fileset id="extras.fileset" dir="${basedir}" > - <selector refid="extraFiles" /> - </fileset> - <jedit:get-plugin-info fsSrc="src.fileset" - fsExtras="extras.fileset" /> - <jedit:get-plugin-jar-name className="${plugin.class.name}" - outputProp="plugin.jar.name" /> + <jedit:get-plugin-info> + <jedit:plugininfo> + <fsSrc dir="${src.dir}" > + <selector refid="compileFiles" /> + </fsSrc> + <fsExtras dir="${basedir}" > + <selector refid="extraFiles" /> + </fsExtras> + </jedit:plugininfo> + </jedit:get-plugin-info> <!--<dump-prop-ref refid="src.fileset" />--> <!--<dump-prop-ref refid="plugin.props.set" />--> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |