I'm not sure why the archiver needs to use the delegate? Is it because you lose track of the updates? IF that's all, then you could follow the @todo in the class javadoc :)

If it truly needs it, clone is the right method - I'd definitely recommend reading the section on clone in Effective Java though :)

- Brett

On 15/02/2008, at 11:57 AM, Carlos Sanchez wrote:

Reading carefully the javadoc I see the mistakes i made in clone :( I
can fix that

The problem arised with a delegate pattern implementation, the
MavenProject instance is encapsulated [1], but the problem comes with
other classes using this constructor to make copies, which will ignore
any customizations made in the delegating object (the subclass).

If the way to make a copy where defined in a method ( clone() seems to
be the right one ) then subclasses could just override that method and
there wouldnt be any need of getters/setters, but right now that
constructor is used in the maven archiver. Adding the getters and
setters is a patch until the other classes are updated to use clone()
and to keep backwards compatibility.

[1] http://tinyurl.com/29jzte


On Thu, Feb 14, 2008 at 4:15 PM, Brett Porter <[EMAIL PROTECTED]> wrote:
Carlos,

Can you elaborate on the need for this?

I understand that since MavenProject is non-final and so are the get/
sets they can be overridden and so we should be using the get/set
internally. However, it would seem we don't need that funcationality
for every field - which particular ones do you see as needing to be
overridden?

Also, I don't think the clone() stuff is right:
- you've deprecated the copy constructor even though it is still
useful. You also require it's existence which means it shouldn't be
deprecated.
- clone()'s contract says that it doesn't call any constructors,
making the method work but not as documented by the JDK
- clone() should call super.clone() to get a valid MavenProject instance
- MavenProject doesn't implement clonable
Why did you need clone()?

Thanks,
Brett

On 14/02/2008, at 5:40 PM, [EMAIL PROTECTED] wrote:

Author: carlos
Date: Wed Feb 13 22:40:35 2008
New Revision: 627675

URL: http://svn.apache.org/viewvc?rev=627675&view=rev
Log:
[MNG-3400] MavenProject is not extensible. Merge rev 627670 from trunk

Modified:
  maven/components/branches/maven-2.0.x/maven-project/src/main/java/
org/apache/maven/project/MavenProject.java
  maven/components/branches/maven-2.0.x/maven-project/src/test/java/
org/apache/maven/project/MavenProjectTest.java

Modified: maven/components/branches/maven-2.0.x/maven-project/src/
main/java/org/apache/maven/project/MavenProject.java
URL: 
http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.x/maven-project/src/main/java/org/apache/maven/project/MavenProject.java?rev=627675&r1=627674&r2=627675&view=diff
=
=
=
=
=
=
=
=
= = ====================================================================
--- maven/components/branches/maven-2.0.x/maven-project/src/main/
java/org/apache/maven/project/MavenProject.java (original)
+++ maven/components/branches/maven-2.0.x/maven-project/src/main/
java/org/apache/maven/project/MavenProject.java Wed Feb 13 22:40:35
2008
@@ -158,103 +158,107 @@
       model.setArtifactId( EMPTY_PROJECT_ARTIFACT_ID );
       model.setVersion( EMPTY_PROJECT_VERSION );

-        this.model = model;
+        this.setModel( model );
   }

   public MavenProject( Model model )
   {
-        this.model = model;
+        this.setModel( model );
   }

+    /**
+     * @deprecated use [EMAIL PROTECTED] #clone()}
+     */
   public MavenProject( MavenProject project )
   {
       // disown the parent

       // copy fields
-        this.file = project.file;
+        setFile( project.getFile() );

- // don't need a deep copy, they don't get modified or added/
removed to/from - but make them unmodifiable to be sure!
-        if ( project.dependencyArtifacts != null )
+ // don't need a deep copy, they don't get modified or added/
removed to/from - but make them unmodifiable to be
+        // sure!
+        if ( project.getDependencyArtifacts() != null )
       {
-            this.dependencyArtifacts =
Collections.unmodifiableSet( project.dependencyArtifacts );
+
setDependencyArtifacts
( Collections.unmodifiableSet( project.getDependencyArtifacts() ) );
       }
-
-        if ( project.artifacts != null )
+
+        if ( project.getArtifacts() != null )
       {
-            this.artifacts =
Collections.unmodifiableSet( project.artifacts );
+
setArtifacts ( Collections.unmodifiableSet( project.getArtifacts() ) );
       }
-
-        if ( project.pluginArtifacts != null )
+
+        if ( project.getPluginArtifacts() != null )
       {
-            this.pluginArtifacts =
Collections.unmodifiableSet( project.pluginArtifacts );
+
setPluginArtifacts
( Collections.unmodifiableSet( project.getPluginArtifacts() ) );
       }
-
-        if ( project.reportArtifacts != null )
+
+        if ( project.getReportArtifacts() != null )
       {
-            this.reportArtifacts =
Collections.unmodifiableSet( project.reportArtifacts );
-        }
-
-        if ( project.extensionArtifacts != null )
+
setReportArtifacts
( Collections.unmodifiableSet( project.getReportArtifacts() ) );
+        }
+
+        if ( project.getExtensionArtifacts() != null )
       {
-            this.extensionArtifacts =
Collections.unmodifiableSet( project.extensionArtifacts );
-        }
-
-        this.parentArtifact = project.parentArtifact;
+
setExtensionArtifacts
( Collections.unmodifiableSet( project.getExtensionArtifacts() ) );
+        }
+
+        setParentArtifact( ( project.getParentArtifact() ) );

-        if ( project.remoteArtifactRepositories != null )
+        if ( project.getRemoteArtifactRepositories() != null )
       {
-            this.remoteArtifactRepositories =
Collections.unmodifiableList( project.remoteArtifactRepositories );
-        }
-
-        if ( project.pluginArtifactRepositories != null )
+
setRemoteArtifactRepositories
( Collections
.unmodifiableList( project.getRemoteArtifactRepositories() ) );
+        }
+
+        if ( project.getPluginArtifactRepositories() != null )
       {
-            this.pluginArtifactRepositories =
Collections.unmodifiableList( project.pluginArtifactRepositories );
-        }
-
-        if ( project.collectedProjects != null )
+
setPluginArtifactRepositories
( ( Collections
.unmodifiableList( project.getPluginArtifactRepositories() ) ) );
+        }
+
+        if ( project.getCollectedProjects() != null )
       {
-            this.collectedProjects =
Collections.unmodifiableList( project.collectedProjects );
-        }
-
-        if ( project.activeProfiles != null )
+
setCollectedProjects
( ( Collections
.unmodifiableList( project.getCollectedProjects() ) ) );
+        }
+
+        if ( project.getActiveProfiles() != null )
       {
-            this.activeProfiles =
Collections.unmodifiableList( project.activeProfiles );
-        }
-
+
setActiveProfiles
( ( Collections.unmodifiableList( project.getActiveProfiles() ) ) );
+        }
+
       if ( project.getAttachedArtifacts() != null )
       {
           // clone properties modifyable by plugins in a forked
lifecycle
-            this.attachedArtifacts = new
ArrayList( project.getAttachedArtifacts() );
-        }
-
-        if ( project.compileSourceRoots != null )
+            setAttachedArtifacts( new
ArrayList( project.getAttachedArtifacts() ) );
+        }
+
+        if ( project.getCompileSourceRoots() != null )
       {
           // clone source roots
-            this.compileSourceRoots = new
ArrayList( project.compileSourceRoots );
-        }
-
-        if ( project.testCompileSourceRoots != null )
+            setCompileSourceRoots( ( new
ArrayList( project.getCompileSourceRoots() ) ) );
+        }
+
+        if ( project.getTestCompileSourceRoots() != null )
       {
-            this.testCompileSourceRoots = new
ArrayList( project.testCompileSourceRoots );
-        }
-
-        if ( project.scriptSourceRoots != null )
+            setTestCompileSourceRoots( ( new
ArrayList( project.getTestCompileSourceRoots() ) ) );
+        }
+
+        if ( project.getScriptSourceRoots() != null )
       {
-            this.scriptSourceRoots = new
ArrayList( project.scriptSourceRoots );
-        }
-
-        this.model = ModelUtils.cloneModel( project.model );
+            setScriptSourceRoots( ( new
ArrayList( project.getScriptSourceRoots() ) ) );
+        }

-        if ( project.originalModel != null )
+ setModel( ( ModelUtils.cloneModel( project.getModel() ) ) );
+
+        if ( project.getOriginalModel() != null )
       {
-            this.originalModel =
ModelUtils.cloneModel( project.originalModel );
+
setOriginalModel
( ( ModelUtils.cloneModel( project.getOriginalModel() ) ) );
       }

-        this.executionRoot = project.executionRoot;
+        setExecutionRoot( project.isExecutionRoot() );

-        if ( project.artifact != null )
+        if ( project.getArtifact() != null )
       {
-            this.artifact =
ArtifactUtils.copyArtifact( project.artifact );
+
setArtifact( ArtifactUtils.copyArtifact( project.getArtifact() ) );
       }

       if ( project.getManagedVersionMap() != null )
@@ -262,14 +266,14 @@
           setManagedVersionMap( new
ManagedVersionMap( project.getManagedVersionMap() ) );
       }

-        if ( project.releaseArtifactRepository != null )
+        if ( project.getReleaseArtifactRepository() != null )
       {
-            releaseArtifactRepository =
project.releaseArtifactRepository;
+
setReleaseArtifactRepository
( project.getReleaseArtifactRepository() );
       }

-        if ( project.snapshotArtifactRepository != null )
+        if ( project.getSnapshotArtifactRepository() != null )
       {
-            snapshotArtifactRepository =
project.snapshotArtifactRepository;
+
setSnapshotArtifactRepository
( project.getSnapshotArtifactRepository() );
       }
   }

@@ -403,17 +407,17 @@

   public void setDependencies( List dependencies )
   {
-        model.setDependencies( dependencies );
+        getModel().setDependencies( dependencies );
   }

   public List getDependencies()
   {
-        return model.getDependencies();
+        return getModel().getDependencies();
   }

   public DependencyManagement getDependencyManagement()
   {
-        return model.getDependencyManagement();
+        return getModel().getDependencyManagement();
   }

   //
----------------------------------------------------------------------
@@ -427,9 +431,9 @@
           path = path.trim();
           if ( path.length() != 0 )
           {
-                if ( !compileSourceRoots.contains( path ) )
+                if ( !getCompileSourceRoots().contains( path ) )
               {
-                    compileSourceRoots.add( path );
+                    getCompileSourceRoots().add( path );
               }
           }
       }
@@ -442,9 +446,9 @@
           path = path.trim();
           if ( path.length() != 0 )
           {
-                if ( !scriptSourceRoots.contains( path ) )
+                if ( !getScriptSourceRoots().contains( path ) )
               {
-                    scriptSourceRoots.add( path );
+                    getScriptSourceRoots().add( path );
               }
           }
       }
@@ -457,9 +461,9 @@
           path = path.trim();
           if ( path.length() != 0 )
           {
-                if ( !testCompileSourceRoots.contains( path ) )
+ if ( ! getTestCompileSourceRoots().contains( path ) )
               {
-                    testCompileSourceRoots.add( path );
+                    getTestCompileSourceRoots().add( path );
               }
           }
       }
@@ -821,31 +825,31 @@

   public void setModelVersion( String pomVersion )
   {
-        model.setModelVersion( pomVersion );
+        getModel().setModelVersion( pomVersion );
   }

   public String getModelVersion()
   {
-        return model.getModelVersion();
+        return getModel().getModelVersion();
   }

   public String getId()
   {
-        return model.getId();
+        return getModel().getId();
   }

   public void setGroupId( String groupId )
   {
-        model.setGroupId( groupId );
+        getModel().setGroupId( groupId );
   }

   public String getGroupId()
   {
-        String groupId = model.getGroupId();
-
-        if ( groupId == null && model.getParent() != null )
+        String groupId = getModel().getGroupId();
+
+        if ( ( groupId == null ) && ( getModel().getParent() !=
null ) )
       {
-            groupId = model.getParent().getGroupId();
+            groupId = getModel().getParent().getGroupId();
       }

       return groupId;
@@ -853,25 +857,25 @@

   public void setArtifactId( String artifactId )
   {
-        model.setArtifactId( artifactId );
+        getModel().setArtifactId( artifactId );
   }

   public String getArtifactId()
   {
-        return model.getArtifactId();
+        return getModel().getArtifactId();
   }

   public void setName( String name )
   {
-        model.setName( name );
+        getModel().setName( name );
   }

   public String getName()
   {
       // TODO: this should not be allowed to be null.
-        if ( model.getName() != null )
+        if ( getModel().getName() != null )
       {
-            return model.getName();
+            return getModel().getName();
       }
       else
       {
@@ -881,16 +885,16 @@

   public void setVersion( String version )
   {
-        model.setVersion( version );
+        getModel().setVersion( version );
   }

   public String getVersion()
   {
-        String version = model.getVersion();
-
-        if ( version == null && model.getParent() != null )
+        String version = getModel().getVersion();
+
+        if ( ( version == null ) && ( getModel().getParent() !=
null ) )
       {
-            version = model.getParent().getVersion();
+            version = getModel().getParent().getVersion();
       }

       return version;
@@ -898,149 +902,149 @@

   public String getPackaging()
   {
-        return model.getPackaging();
+        return getModel().getPackaging();
   }

   public void setPackaging( String packaging )
   {
-        model.setPackaging( packaging );
+        getModel().setPackaging( packaging );
   }

   public void setInceptionYear( String inceptionYear )
   {
-        model.setInceptionYear( inceptionYear );
+        getModel().setInceptionYear( inceptionYear );
   }

   public String getInceptionYear()
   {
-        return model.getInceptionYear();
+        return getModel().getInceptionYear();
   }

   public void setUrl( String url )
   {
-        model.setUrl( url );
+        getModel().setUrl( url );
   }

   public String getUrl()
   {
-        return model.getUrl();
+        return getModel().getUrl();
   }

   public Prerequisites getPrerequisites()
   {
-        return model.getPrerequisites();
+        return getModel().getPrerequisites();
   }

   public void setIssueManagement( IssueManagement issueManagement )
   {
-        model.setIssueManagement( issueManagement );
+        getModel().setIssueManagement( issueManagement );
   }

   public CiManagement getCiManagement()
   {
-        return model.getCiManagement();
+        return getModel().getCiManagement();
   }

   public void setCiManagement( CiManagement ciManagement )
   {
-        model.setCiManagement( ciManagement );
+        getModel().setCiManagement( ciManagement );
   }

   public IssueManagement getIssueManagement()
   {
-        return model.getIssueManagement();
+        return getModel().getIssueManagement();
   }

   public void setDistributionManagement( DistributionManagement
distributionManagement )
   {
-        model.setDistributionManagement( distributionManagement );
+
getModel().setDistributionManagement( distributionManagement );
   }

   public DistributionManagement getDistributionManagement()
   {
-        return model.getDistributionManagement();
+        return getModel().getDistributionManagement();
   }

   public void setDescription( String description )
   {
-        model.setDescription( description );
+        getModel().setDescription( description );
   }

   public String getDescription()
   {
-        return model.getDescription();
+        return getModel().getDescription();
   }

   public void setOrganization( Organization organization )
   {
-        model.setOrganization( organization );
+        getModel().setOrganization( organization );
   }

   public Organization getOrganization()
   {
-        return model.getOrganization();
+        return getModel().getOrganization();
   }

   public void setScm( Scm scm )
   {
-        model.setScm( scm );
+        getModel().setScm( scm );
   }

   public Scm getScm()
   {
-        return model.getScm();
+        return getModel().getScm();
   }

   public void setMailingLists( List mailingLists )
   {
-        model.setMailingLists( mailingLists );
+        getModel().setMailingLists( mailingLists );
   }

   public List getMailingLists()
   {
-        return model.getMailingLists();
+        return getModel().getMailingLists();
   }

   public void addMailingList( MailingList mailingList )
   {
-        model.addMailingList( mailingList );
+        getModel().addMailingList( mailingList );
   }

   public void setDevelopers( List developers )
   {
-        model.setDevelopers( developers );
+        getModel().setDevelopers( developers );
   }

   public List getDevelopers()
   {
-        return model.getDevelopers();
+        return getModel().getDevelopers();
   }

   public void addDeveloper( Developer developer )
   {
-        model.addDeveloper( developer );
+        getModel().addDeveloper( developer );
   }

   public void setContributors( List contributors )
   {
-        model.setContributors( contributors );
+        getModel().setContributors( contributors );
   }

   public List getContributors()
   {
-        return model.getContributors();
+        return getModel().getContributors();
   }

   public void addContributor( Contributor contributor )
   {
-        model.addContributor( contributor );
+        getModel().addContributor( contributor );
   }

   public void setBuild( Build build )
   {
       this.buildOverlay = new BuildOverlay( build );

-        model.setBuild( build );
+        getModel().setBuild( build );
   }

   public Build getBuild()
@@ -1075,27 +1079,27 @@

   public void setReporting( Reporting reporting )
   {
-        model.setReporting( reporting );
+        getModel().setReporting( reporting );
   }

   public Reporting getReporting()
   {
-        return model.getReporting();
+        return getModel().getReporting();
   }

   public void setLicenses( List licenses )
   {
-        model.setLicenses( licenses );
+        getModel().setLicenses( licenses );
   }

   public List getLicenses()
   {
-        return model.getLicenses();
+        return getModel().getLicenses();
   }

   public void addLicense( License license )
   {
-        model.addLicense( license );
+        getModel().addLicense( license );
   }

   public void setArtifacts( Set artifacts )
@@ -1206,7 +1210,7 @@

   public List getRepositories()
   {
-        return model.getRepositories();
+        return getModel().getRepositories();
   }

   //
----------------------------------------------------------------------
@@ -1215,33 +1219,33 @@

   public List getReportPlugins()
   {
-        if ( model.getReporting() == null )
+        if ( getModel().getReporting() == null )
       {
           return null;
       }
-        return model.getReporting().getPlugins();
+        return getModel().getReporting().getPlugins();

   }

   public List getBuildPlugins()
   {
-        if ( model.getBuild() == null )
+        if ( getModel().getBuild() == null )
       {
           return null;
       }
-        return model.getBuild().getPlugins();
+        return getModel().getBuild().getPlugins();
   }

   public List getModules()
   {
-        return model.getModules();
+        return getModel().getModules();
   }

   public PluginManagement getPluginManagement()
   {
       PluginManagement pluginMgmt = null;

-        Build build = model.getBuild();
+        Build build = getModel().getBuild();
       if ( build != null )
       {
           pluginMgmt = build.getPluginManagement();
@@ -1252,13 +1256,13 @@

   private Build getModelBuild()
   {
-        Build build = model.getBuild();
+        Build build = getModel().getBuild();

       if ( build == null )
       {
           build = new Build();

-            model.setBuild( build );
+            getModel().setBuild( build );
       }

       return build;
@@ -1322,13 +1326,13 @@

   public ArtifactRepository
getDistributionManagementArtifactRepository()
   {
-        return getArtifact().isSnapshot() &&
snapshotArtifactRepository != null ? snapshotArtifactRepository
-            : releaseArtifactRepository;
+        return getArtifact().isSnapshot() &&
( getSnapshotArtifactRepository() != null ) ?
getSnapshotArtifactRepository()
+            : getReleaseArtifactRepository();
   }

   public List getPluginRepositories()
   {
-        return model.getPluginRepositories();
+        return getModel().getPluginRepositories();
   }

   public void setActiveProfiles( List activeProfiles )
@@ -1624,6 +1628,42 @@
       return getBuild() != null ? getBuild().getDefaultGoal() :
null;
   }

+
+    protected void setModel( Model model )
+    {
+        this.model = model;
+    }
+
+    protected void setAttachedArtifacts( List attachedArtifacts )
+    {
+        this.attachedArtifacts = attachedArtifacts;
+    }
+
+    protected void setCompileSourceRoots( List compileSourceRoots )
+    {
+        this.compileSourceRoots = compileSourceRoots;
+    }
+
+    protected void setTestCompileSourceRoots( List
testCompileSourceRoots )
+    {
+        this.testCompileSourceRoots = testCompileSourceRoots;
+    }
+
+    protected void setScriptSourceRoots( List scriptSourceRoots )
+    {
+        this.scriptSourceRoots = scriptSourceRoots;
+    }
+
+    protected ArtifactRepository getReleaseArtifactRepository()
+    {
+        return releaseArtifactRepository;
+    }
+
+    protected ArtifactRepository getSnapshotArtifactRepository()
+    {
+        return snapshotArtifactRepository;
+    }
+
   public Artifact replaceWithActiveArtifact( Artifact
pluginArtifact )
   {
       if ( getProjectReferences() != null && !
getProjectReferences().isEmpty() )
@@ -1743,6 +1783,14 @@
       }

       return sb.toString();
+    }
+
+    /**
+     * @since 2.0.9
+     */
+    public Object clone()
+    {
+        return new MavenProject( this );
   }

}

Modified: maven/components/branches/maven-2.0.x/maven-project/src/
test/java/org/apache/maven/project/MavenProjectTest.java
URL: 
http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.x/maven-project/src/test/java/org/apache/maven/project/MavenProjectTest.java?rev=627675&r1=627674&r2=627675&view=diff
=
=
=
=
=
=
=
=
= = ====================================================================
--- maven/components/branches/maven-2.0.x/maven-project/src/test/
java/org/apache/maven/project/MavenProjectTest.java (original)
+++ maven/components/branches/maven-2.0.x/maven-project/src/test/
java/org/apache/maven/project/MavenProjectTest.java Wed Feb 13
22:40:35 2008
@@ -21,15 +21,13 @@

import java.io.File;
import java.io.IOException;
-import java.util.Map;
-import java.util.Iterator;
import java.util.List;
+import java.util.Map;

+import org.apache.maven.artifact.versioning.ManagedVersionMap;
+import org.apache.maven.model.DependencyManagement;
import org.apache.maven.model.Model;
import org.apache.maven.model.Parent;
-import org.apache.maven.model.DependencyManagement;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.artifact.versioning.ManagedVersionMap;

public class MavenProjectTest
   extends AbstractMavenProjectTestCase
@@ -90,20 +88,20 @@
                       + MavenProject.EMPTY_PROJECT_VERSION,
project.getId() );
   }

-    public void testCopyConstructor()
+    public void testClone()
       throws Exception
   {
       File f = getFileForClasspathResource( "canonical-pom.xml" );
       MavenProject projectToClone = getProject( f );

-        MavenProject clonedProject = new
MavenProject( projectToClone );
+        MavenProject clonedProject = (MavenProject)
projectToClone.clone();
       assertEquals( "maven-core", clonedProject.getArtifactId() );
       Map clonedMap = clonedProject.getManagedVersionMap();
       assertNotNull("ManagedVersionMap not copied", clonedMap);
       assertTrue("ManagedVersionMap is not empty",
clonedMap.isEmpty());
   }

-    public void testCopyConstructorWithDependencyManagement()
+    public void testCloneWithDependencyManagement()
       throws Exception
   {
       File f = getFileForClasspathResource( "dependencyManagement-
pom.xml" );
@@ -118,7 +116,7 @@
       assertNotNull("No ManagedVersionMap", map);
       assertTrue("ManagedVersionMap is empty", !map.isEmpty());

-        MavenProject clonedProject = new
MavenProject( projectToClone );
+        MavenProject clonedProject = (MavenProject)
projectToClone.clone();
       assertEquals( "maven-core", clonedProject.getArtifactId() );
       Map clonedMap = clonedProject.getManagedVersionMap();
       assertNotNull("ManagedVersionMap not copied", clonedMap);
@@ -146,13 +144,13 @@
       assertEquals( "..", pathAdjustment );
   }

-    public void testCopyConstructorWithDistributionManagement()
throws Exception
+    public void testCloneWithDistributionManagement() throws
Exception
   {

       File f =
getFileForClasspathResource( "distributionManagement-pom.xml" );
       MavenProject projectToClone = getProject( f );

-        MavenProject clonedProject = new
MavenProject( projectToClone );
+        MavenProject clonedProject = (MavenProject)
projectToClone.clone();
       assertNotNull( "clonedProject - distributionManagement",
clonedProject.getDistributionManagementArtifactRepository() );
   }
}



--
Brett Porter
[EMAIL PROTECTED]
http://blogs.exist.com/bporter/


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]





--
I could give you my word as a Spaniard.
No good. I've known too many Spaniards.
-- The Princess Bride

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


--
Brett Porter
[EMAIL PROTECTED]
http://blogs.exist.com/bporter/


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to