You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@gump.apache.org by bo...@apache.org on 2010/08/01 05:05:31 UTC

svn commit: r981122 - /gump/trunk/python/gump/core/model/builder.py

Author: bodewig
Date: Sun Aug  1 03:05:30 2010
New Revision: 981122

URL: http://svn.apache.org/viewvc?rev=981122&view=rev
Log:
The complete method is called while building the graph before any module has been updated - this is too early to parse the POM which may be outdated or not even been checked out, yet.  Move POM parsing logic to a the building phase.

Modified:
    gump/trunk/python/gump/core/model/builder.py

Modified: gump/trunk/python/gump/core/model/builder.py
URL: http://svn.apache.org/viewvc/gump/trunk/python/gump/core/model/builder.py?rev=981122&r1=981121&r2=981122&view=diff
==============================================================================
--- gump/trunk/python/gump/core/model/builder.py (original)
+++ gump/trunk/python/gump/core/model/builder.py Sun Aug  1 03:05:30 2010
@@ -33,7 +33,7 @@ from gump.util.domutils import domAttrib
 
 from gump.core.model.depend import INHERIT_NONE, ProjectDependency
 from gump.core.model.object import ModelObject
-from gump.core.model.property import PropertyContainer
+from gump.core.model.property import Property, PropertyContainer
 
 # represents a generic build (e.g. <ant/>) element
 class Builder(ModelObject, PropertyContainer):
@@ -200,7 +200,14 @@ class Builder(ModelObject, PropertyConta
         # Complete them all
         self.completeProperties(workspace)
 
-        self.resolve_basedir()
+        if self.hasDomAttribute('basedir'):
+            self.basedir = os.path.abspath(os.path.join(
+                    self.project.getModule().getWorkingDirectory()
+                    or dir.base,
+                    self.getDomAttributeValue('basedir')
+                    ))
+        else:
+            self.basedir = self.project.getBaseDirectory()
 
         # Check for debugging properties
         self.setDebug(self.domAttributeIsTrue('debug'))
@@ -219,19 +226,6 @@ class Builder(ModelObject, PropertyConta
     def getBaseDirectory(self):
         return self.basedir
 
-    def resolve_basedir(self):
-        """ Sets basedir based on the basedir attribute or the
-        project's configuration """
-        if not self.basedir:
-            if self.hasDomAttribute('basedir'):
-                self.basedir = os.path.abspath(os.path.join(
-                        self.project.getModule().getWorkingDirectory()
-                        or dir.base,
-                        self.getDomAttributeValue('basedir')
-                        ))
-            else:
-                self.basedir = self.project.getBaseDirectory()
-
 # represents an <ant/> element
 class BaseAnt(Builder):
     """ An Ant command (within a project)"""
@@ -366,61 +360,72 @@ class Mvn2Install(Maven2):
         self._add_property(impl, 'groupId', project.getArtifactGroup())
         self._add_property(impl, Mvn2Install.PACKAGING, self.packaging)
         self._add_property(impl, Mvn2Install.FILE, self.file)
+        if self.version:
+            self._add_property(impl, Mvn2Install.VERSION, self.version)
+        elif not self.packaging == Mvn2Install.POM:
+            project.addError("version attribute is mandatory if the file is"
+                             + " not a POM.")
 
-    def complete(self, project, workspace):
+    def getProperties(self):
         """
-        Complete the model from XML - potentially parse POM for version
+        Get a list of all the property objects - potentially parse POM
+        for version
         """
-        impl = getDOMImplementation()
-        if self.version:
-            self._add_property(impl, Mvn2Install.VERSION, self.version)
-        elif self.packaging == Mvn2Install.POM:
+        props = PropertyContainer.getProperties(self)[:]
+
+        if not self.version and self.packaging == Mvn2Install.POM:
             try:
-                self.resolve_basedir()
                 pomDoc = self._read_pom()
                 root = pomDoc.documentElement
                 if not root.tagName == 'project':
-                    project.addError('file is not a POM, its root element is '
-                                     + root.tagName)
+                    self.project.addError('file is not a POM, its root element'
+                                          + ' is ' + root.tagName)
                     return
 
                 version = _extract_version_from_pom(root)
 
                 if not version:
-                    project.addError("POM doesn't specify a version, you must"
-                                     + " provide the version attribute")
+                    self.project.addError("POM doesn't specify a version,"
+                                          + " you must provide the version"
+                                          + " attribute.")
                     return
+
                 version_text = getDomTextValue(version)
                 if '${' in version_text:
-                    project.addError("POM uses a property reference as version"
-                                     + " which is not supported by Gump.  You"
-                                     + " must provide an explicit version"
-                                     + " attribute to mvn2install.")
+                    self.project.addError('POM uses a property reference as'
+                                          + ' version which is not supported'
+                                          + ' by Gump.  You must provide an'
+                                          + ' explicit version attribute to'
+                                          + ' mvn2install.')
                 else:
-                    self._add_property(impl, Mvn2Install.VERSION,
-                                       version_text)
+                    impl = getDOMImplementation()
+                    dom = _create_dom_property(impl, Mvn2Install.VERSION,
+                                               version_text)
+                    prop = Property(Mvn2Install.VERSION, dom, self.project)
+                    prop.complete(self.project, self.project.getWorkspace())
+                    props.append(prop)
             except Exception, details:
-                project.addError('failed to parse POM because of '
-                                 + str(details))
-        else:
-            project.addError("version attribute is mandatory if the file is"
-                             + " not a POM.")
-
-        Builder.complete(self, project, workspace)
+                self.project.addError('failed to parse POM because of '
+                                      + str(details))
+        return props
 
     def _add_property(self, impl, name, value):
         """ Adds a named property """
-        doc = impl.createDocument(None, 'property', None)
-        prop = doc.documentElement
-        prop.setAttribute('name', name)
-        prop.setAttribute('value', value)
-        self.importProperty(prop)
+        self.importProperty(_create_dom_property(impl, name, value))
 
     def _read_pom(self):
         """ locates the POM, parses it and returns it as DOM Document """ 
         pom = os.path.join(self.getBaseDirectory(), self.file)
         return xml.dom.minidom.parse(pom)
 
+def _create_dom_property(impl, name, value):
+    """ creates and returns a DOM element for a named property """
+    doc = impl.createDocument(None, 'property', None)
+    prop = doc.documentElement
+    prop.setAttribute('name', name)
+    prop.setAttribute('value', value)
+    return prop
+
 def _extract_version_from_pom(root):
     """ Tries to extract the version DOM element from a POM DOM tree """
     version = None