aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathieu Pasquet <kiorky@cryptelium.net>2007-06-13 20:49:31 +0000
committerMathieu Pasquet <kiorky@cryptelium.net>2007-06-13 20:49:31 +0000
commitb9dc994cbc0c33d5f2bb7205a3c12d0b67744422 (patch)
tree5406ab592d170c4771c8dc94170108ee19bcac9f
parentreverting xml-rewrite-2 to initial state (diff)
downloadjavatoolkit-b9dc994cbc0c33d5f2bb7205a3c12d0b67744422.tar.gz
javatoolkit-b9dc994cbc0c33d5f2bb7205a3c12d0b67744422.tar.bz2
javatoolkit-b9dc994cbc0c33d5f2bb7205a3c12d0b67744422.zip
add rewrite feature
svn path=/projects/javatoolkit/trunk/; revision=5122
-rwxr-xr-xsrc/maven/maven-helper.py297
1 files changed, 233 insertions, 64 deletions
diff --git a/src/maven/maven-helper.py b/src/maven/maven-helper.py
index 95f3b06..cd370bb 100755
--- a/src/maven/maven-helper.py
+++ b/src/maven/maven-helper.py
@@ -12,64 +12,190 @@
# ChangeLog
# kiorky <kiorky@cryptelium.net>:
+# 31/05/2007 Add rewrite feature
+#
+# kiorky <kiorky@cryptelium.net>:
# 08/05/2007 initial version
import sys
import StringIO
-
from optparse import OptionParser, make_option
-__version__ = "$Revision: 1.0 $"[11:-2]
+
+__version__ = "$Revision: 1.1 $"[11:-2]
+
+
+
+# either a very simplified representation of a maven pom
+# or a fully xml rewritten pom
class MavenPom:
- def __init__(self,pomfile = ""):
+ def __init__(self,cli_options = None):
self.group = ''
self.artifact = ''
self.version = ''
- self.name = ''
+ self.name = ''
+ self.is_child = "false"
self.dependencies = []
self.buffer = StringIO.StringIO()
self.__write = self.buffer.write
+ self.mydoc = None
+ self.cli_options = cli_options
+
def getInfos(self,node):
- if node.nodeName == "version":
- self.version = node.childNodes[0].nodeValue
- if node.nodeName == "artifactId":
- self.artifact = node.childNodes[0].nodeValue
- if node.nodeName == "groupId":
- self.group = node.childNodes[0].nodeValue
- if node.nodeName == "name":
- self.name = node.childNodes[0].nodeValue
-
- def parse(self,in_stream):
- from xml.dom.minidom import parse
- xmldoc = parse(in_stream)
-
- if xmldoc:
- self.project = xmldoc.getElementsByTagName("project")[0]
- # get our properties
+ for child_node in node.childNodes:
+ if child_node.nodeType == child_node.ELEMENT_NODE:
+ if child_node.childNodes[0].nodeValue != "":
+ if child_node.nodeName == "version":
+ self.version = child_node.childNodes[0].nodeValue
+
+ if child_node.nodeName == "artifactId":
+ self.artifact = child_node.childNodes[0].nodeValue
+
+ if child_node.nodeName == "groupId":
+ self.group = child_node.childNodes[0].nodeValue
+
+ if child_node.nodeName == "name":
+ self.name = child_node.childNodes[0].nodeValue
+
+
+ def getDescription(self,mydoc,**kwargs):
+ if mydoc:
+ self.project = mydoc.getElementsByTagName("project")[0]
+ # get inherited properties from parent pom if any
+ if self.group == "" or self.version == "" or self.artifact == "":
+ for node in self.project.childNodes:
+ if node.nodeName == "parent":
+ self.is_child = "true"
+ self.getInfos(node)
+
+ self.getInfos(self.project)
+
+ # get our deps
for node in self.project.childNodes:
- self.getInfos(node)
if node.nodeName == "dependencies":
for dependency_node in node.childNodes:
if dependency_node.nodeName == "dependency":
dep = MavenPom()
for child_node in dependency_node.childNodes:
- dep.getInfos(child_node)
- self.dependencies.append(dep)
+ if child_node.nodeType == child_node.ELEMENT_NODE:
+ dep.getInfos(child_node)
+
+ self.dependencies.append(dep)
+
+ if self.cli_options.p_group:
+ self.__write("pom group:%s\n" % self.group )
+
+ if self.cli_options.p_ischild:
+ self.__write("pom ischild:%s\n" % self.is_child )
+
+ if self.cli_options.p_artifact:
+ self.__write("pom artifact:%s\n" % self.artifact )
+
+ if self.cli_options.p_version:
+ self.__write("pom version:%s\n" % self.version )
+
+ if self.cli_options.p_dep:
+ i=0
+ for dependency in self.dependencies:
+ i=i+1
+ self.__write("%d:dep_group:%s\n" % (i,dependency.group) )
+ self.__write("%d:dep_artifact:%s\n" % (i,dependency.artifact) )
+ self.__write("%d:dep_version:%s\n" % (i,dependency.version) )
+
+
+ def read(self):
+ return self.buffer.getvalue()
+
+
+ def rewrite(self,xmldoc,**kwargs):
+ # desactivate all dependencies
+ dependencies_root = ( xmldoc.getElementsByTagName("dependencies") or [] )
+ for node in dependencies_root:
+ copylist_child_Nodes =list(node.childNodes)
+ for child_node in copylist_child_Nodes:
+ node.removeChild(child_node)
+ child_node.unlink()
+
+ # add our classpath using system scope
+ if self.cli_options.classpath:
+ i=0
+ dependencies_root = ( xmldoc.getElementsByTagName("dependencies") or [] )
+ if dependencies_root:
+ for node in dependencies_root:
+ for classpath_element in self.cli_options.classpath[0].split(':'):
+ dependency_elem = xmldoc.createElement("dependency")
+ dependency_elem.appendChild( self.create_element(xmldoc, "groupId", "sexy"))
+ dependency_elem.appendChild( self.create_element(xmldoc, "artifactId", "gentoo%d" % (i)))
+ dependency_elem.appendChild( self.create_element(xmldoc, "version", "666"))
+ dependency_elem.appendChild( self.create_element(xmldoc, "scope", "system"))
+ dependency_elem.appendChild( self.create_element(xmldoc, "systemPath", classpath_element))
+ node.appendChild(dependency_elem)
+ i += 1
+
+ # overwrite source/target options if any
+ # remove version node for all plugins
+ if self.cli_options.p_source or self.cli_options.p_target:
+ dependencies_root = ( xmldoc.getElementsByTagName("plugin") or [] )
+ # remove part
+ if len(dependencies_root) > 0:
+ for node in dependencies_root:
+ for child_node in node.childNodes:
+ if child_node.nodeName == "version":
+ node.removeChild(child_node)
+ child_node.unlink()
+
+ if child_node.nodeName == "artifactId":
+ if "maven-compiler-plugin" == child_node.childNodes[0].data:
+ node.parentNode.removeChild(node)
+ node.unlink()
+
+ # creation/overwrite part
+ plugin_node = self.create_element(xmldoc,"plugin")
+ group_node = self.create_element(xmldoc,"groupId","org.apache.maven.plugins")
+ artifact_node = self.create_element(xmldoc,"artifactId","maven-compiler-plugin")
+ configuration_node = self.create_element(xmldoc,"configuration")
+ plugin_node.appendChild(group_node)
+ plugin_node.appendChild(artifact_node)
+ plugin_node.appendChild(configuration_node)
+ if self.cli_options.p_target:
+ target_node = self.create_element(xmldoc,"target",self.cli_options.p_target[0])
+ configuration_node.appendChild(target_node)
+
+ if self.cli_options.p_source:
+ source_node = self.create_element(xmldoc,"source",self.cli_options.p_source[0])
+ configuration_node.appendChild(source_node)
+
+ dependencies_root = ( xmldoc.getElementsByTagName("plugins") or [] )
+ for node in dependencies_root:
+ node.appendChild(plugin_node)
+
+ from xml.dom.ext import PrettyPrint
+ self.write = self.__write
+ PrettyPrint(xmldoc,self)
+ self.write = None
+
+
+ def create_element(self,xmldoc,element_name,text_value=None):
+ element = None
+ if element_name:
+ element = xmldoc.createElement(element_name)
+ if text_value:
+ text_node = xmldoc.createTextNode(text_value)
+ element.appendChild(text_node)
+
+ return element
+
+
+ def parse(self,in_stream,callback=None,**kwargs):
+ from xml.dom.minidom import parseString
+ self.mydoc = parseString(in_stream)
+
+ if callback:
+ callback(self.mydoc,**kwargs)
- # get inherited properties from parent pom if any
- if self.group == "" or self.version == "" or self.artifact == "":
- for node in self.project.childNodes:
- if node.nodeName == "parent":
- for child_node in node.childNodes:
- if (
- (child_node.nodeName == "version" and self.version == "" )
- or (child_node.nodeName == "artifactId" and self.artifact == "")
- or (child_node.nodeName == "groupId" and self.group == "")
- ):
- self.getInfos(child_node)
if __name__ == '__main__':
@@ -79,77 +205,120 @@ if __name__ == '__main__':
usage += "Please contact the Gentoo Java Team <java@gentoo.org> with problems.\n"
usage += "\n"
usage += "Usage:\n"
- usage += " maven-helper.py [-a] [-v] [-g] [-d] [-f fic.xml]\n"
+ usage += " %s [-a] [-v] [-g] [-d] [-f fic.xml]\n" % sys.argv[0]
+ usage += "Or:\n"
+ usage += " %s --rewrite [--classpath some.jar:class.jar:path.jar] [--source JVM_VER ] |--target JVM_VER]\n" % sys.argv[0]
+ usage += " JVM_VER ::= 1.4 || 1.5 "
usage += "\n"
usage += "If the -f parameter is not utilized, the script will read and\n"
usage += "write to stdin and stdout respectively. The use of quotes on\n"
usage += "parameters will break the script.\n"
+
def error(message):
print "ERROR: " + message
sys.exit(1)
+
+ def doAction(stream,options):
+ pom = MavenPom(options)
+ if options.p_rewrite:
+ pom.parse(stream, pom.rewrite)
+ elif options.p_ischild or options.p_group or options.p_dep or options.p_artifact or options.p_version:
+ pom.parse(stream, pom.getDescription)
+
+ return pom
+
+
def run():
if options.files:
import os
for file in options.files:
# First parse the file into memory
- # Tricks with cwd are needed for relative includes of other xml files to build.xml files
cwd = os.getcwd()
dirname = os.path.dirname(file)
if dirname != '': # for file comes out as ''
os.chdir(os.path.dirname(file))
f = open(os.path.basename(file),"r")
- # parse file
- pom = MavenPom()
- pom.parse(f)
- os.chdir(cwd)
+ fs = f.read()
f.close()
+ # parse file and return approtiate pom object
+ pom = doAction(fs,options)
+ if options.p_rewrite:
+ f = open(os.path.basename(file),"w")
+ f.write(pom.read())
+ f.close()
+ else:
+ print "%s" % pom.read()
+
+ os.chdir(cwd)
+
else:
# process stdin
- pom = MavenPom()
- pom.parse(sys.stdin)
+ pom = doAction(sys.stdin.read(),options)
+ print pom.read()
- if options.p_group:
- print "pom group:%s" % pom.group
- if options.p_artifact:
- print "pom artifact:%s" % pom.artifact
- if options.p_version:
- print "pom version:%s" % pom.version
+############### MAIN ###############
- if options.p_dep:
- i=0
- for dependency in pom.dependencies:
- i=i+1
- print "%d:dep_group:%s" % (i,dependency.group)
- print "%d:dep_artifact:%s" % (i,dependency.artifact)
- print "%d:dep_version:%s" % (i,dependency.version)
- options_list = [
+
+ options_list = [
+ make_option ("-a", "--artifact", action="store_true", dest="p_artifact", help="get artifact name."),
+ make_option ("-c", "--classpath", action="append", dest="classpath", help="set classpath to use with maven."),
+ make_option ("-s", "--source", action="append", dest="p_source", help="Java source version."),
+ make_option ("-t", "--target", action="append", dest="p_target", help="Java target version."),
+ make_option ("-d", "--depependencies" , action="store_true", dest="p_dep", help="get dependencies infos"),
make_option ("-f", "--file", action="append", dest="files", help="Transform files instead of operating on stdout and stdin"),
- make_option ("-v", "--version" , action="store_true", dest="p_version", help="get artifact version."),
- make_option ("-d", "--depependencies" , action="store_true", dest="p_dep", help="get dependencies infos"),
make_option ("-g", "--group" , action="store_true", dest="p_group", help="get artifact group."),
- make_option ("-a", "--artifact", action="store_true", dest="p_artifact", help="get artifact name."),
+ make_option ("-r", "--rewrite", action="store_true", dest="p_rewrite", help="rewrite poms to use our classpath"),
+ make_option ("-p", "--ischild", action="store_true", dest="p_ischild", help="return true if this is a child pom"),
+ make_option ("-v", "--version" , action="store_true", dest="p_version", help="get artifact version."),
]
parser = OptionParser(usage, options_list)
(options, args) = parser.parse_args()
# Invalid Arguments Must be smited!
- if not options.p_dep and not options.p_version and not options.p_artifact and not options.p_group:
+ if not options.p_ischild and not options.p_rewrite and not options.p_dep and not options.p_version and not options.p_artifact and not options.p_group:
print usage
print
error("No action was specified.")
- if options.files:
- if options.files.length > 1:
- error("Please specify only one pom at a time.")
- # End Invalid Arguments Check
+ if options.files:
+ if len(options.files) > 1:
+ error("Please specify only one pom at a time.")
+
+ if options.p_rewrite:
+ valid_sources = ["1.4","1.5"]
+ for source in valid_sources:
+ if options.p_source:
+ if len(options.p_source) != 1:
+ error("Please specify one and only one source.")
+
+ if options.p_source[0] not in valid_sources:
+ error("Source %s is not valid" % options.p_source[0])
+
+ if options.p_target:
+ if len(options.p_target) != 1:
+ error("Please specify one and only one target.")
+ if options.p_target[0] not in valid_sources:
+ error("Target %s is not valid" % options.p_target[0])
+
+ # join any classpathes if any
+ if options.classpath:
+ if len(options.classpath) > 1:
+ start =[]
+ start.append(options.classpath[0])
+ for item in options.classpath[1:]:
+ start[0] += ":%s" % (item)
+
+ options.classpath = start
+
+ # End Invalid Arguments Check
# main loop
run()