You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by si...@apache.org on 2008/10/21 03:06:04 UTC

svn commit: r706486 - in /maven/components/branches/sisbell-maven-3.0-mercury: ./ maven-mercury/ maven-mercury/src/ maven-mercury/src/main/ maven-mercury/src/main/java/ maven-mercury/src/main/java/org/ maven-mercury/src/main/java/org/apache/ maven-merc...

Author: sisbell
Date: Mon Oct 20 18:06:03 2008
New Revision: 706486

URL: http://svn.apache.org/viewvc?rev=706486&view=rev
Log:
Initial import of mercury integration.

Added:
    maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/
    maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/pom.xml   (with props)
    maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/
    maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/
    maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/
    maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/
    maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/
    maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/
    maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/
    maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDependencyProcessor.java   (with props)
    maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDomainModel.java   (with props)
    maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MercuryPomTransformer.java   (with props)
Modified:
    maven/components/branches/sisbell-maven-3.0-mercury/pom.xml

Added: maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/pom.xml
URL: http://svn.apache.org/viewvc/maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/pom.xml?rev=706486&view=auto
==============================================================================
--- maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/pom.xml (added)
+++ maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/pom.xml Mon Oct 20 18:06:03 2008
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
+    <artifactId>maven</artifactId>
+    <groupId>org.apache.maven</groupId>
+    <version>3.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>maven-mercury</artifactId>
+  <name>Maven Mercury</name>
+  <dependencies>
+  	<dependency>
+  		<groupId>org.apache.maven.mercury</groupId>
+  		<artifactId>mercury-artifact</artifactId>
+  	</dependency>
+  	<dependency>
+  		<groupId>org.apache.maven.mercury</groupId>
+  		<artifactId>mercury-external</artifactId>
+  	</dependency>
+  	<dependency>
+  		<groupId>org.apache.maven</groupId>
+  		<artifactId>maven-project-builder</artifactId>
+  		<version>3.0-SNAPSHOT</version>
+  	</dependency>
+  </dependencies>
+</project>

Propchange: maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/pom.xml
------------------------------------------------------------------------------
    svn:executable = *

Added: maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDependencyProcessor.java
URL: http://svn.apache.org/viewvc/maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDependencyProcessor.java?rev=706486&view=auto
==============================================================================
--- maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDependencyProcessor.java (added)
+++ maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDependencyProcessor.java Mon Oct 20 18:06:03 2008
@@ -0,0 +1,69 @@
+package org.apache.maven.mercury;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Hashtable;
+import java.util.List;
+
+import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
+import org.apache.maven.mercury.builder.api.DependencyProcessor;
+import org.apache.maven.mercury.builder.api.MetadataReader;
+import org.apache.maven.mercury.builder.api.MetadataReaderException;
+import org.apache.maven.project.builder.ArtifactModelContainerFactory;
+import org.apache.maven.project.builder.IdModelContainerFactory;
+import org.apache.maven.shared.model.DomainModel;
+import org.apache.maven.shared.model.ModelTransformerContext;
+import org.apache.maven.shared.model.ModelMarshaller;
+
+public final class MavenDependencyProcessor implements DependencyProcessor {
+
+    public List<ArtifactBasicMetadata> getDependencies(ArtifactBasicMetadata bmd, MetadataReader mdReader, Hashtable env)
+            throws MetadataReaderException {
+        if (bmd == null) {
+            throw new IllegalArgumentException("bmd: null");
+        }
+
+        if (mdReader == null) {
+            throw new IllegalArgumentException("mdReader: null");
+        }
+
+        //TODO: Add super model
+        List<DomainModel> domainModels = new ArrayList<DomainModel>();
+        try {
+            MavenDomainModel domainModel = new MavenDomainModel(mdReader.readMetadata(bmd));
+            domainModels.add(domainModel);
+            domainModels.addAll(getParentsOfDomainModel(domainModel, mdReader));
+        } catch (IOException e) {
+            throw new MetadataReaderException("Failed to create domain model. Message = " + e.getMessage());
+        }
+
+        MercuryPomTransformer transformer = new MercuryPomTransformer();
+        ModelTransformerContext ctx = new ModelTransformerContext(
+                Arrays.asList(new ArtifactModelContainerFactory(), new IdModelContainerFactory()));
+
+        try {
+            return ((MavenDomainModel) ctx.transform(domainModels,
+                    transformer,
+                    transformer,
+                    null,
+                    null)).getDependencyMetadata();
+        } catch (IOException e) {
+            throw new MetadataReaderException("Unable to transform model");
+        }
+    }
+
+    private static List<DomainModel> getParentsOfDomainModel(MavenDomainModel domainModel, MetadataReader mdReader)
+            throws IOException, MetadataReaderException {
+        List<DomainModel> domainModels = new ArrayList<DomainModel>();
+        if (domainModel.hasParent()) {
+            MavenDomainModel parentDomainModel = new MavenDomainModel(mdReader.readMetadata(domainModel.getParentMetadata()));
+            domainModels.add(parentDomainModel);
+            domainModels.addAll(getParentsOfDomainModel(parentDomainModel, mdReader));
+        }
+        return domainModels;
+    }    
+}

Propchange: maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDependencyProcessor.java
------------------------------------------------------------------------------
    svn:executable = *

Added: maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDomainModel.java
URL: http://svn.apache.org/viewvc/maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDomainModel.java?rev=706486&view=auto
==============================================================================
--- maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDomainModel.java (added)
+++ maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDomainModel.java Mon Oct 20 18:06:03 2008
@@ -0,0 +1,184 @@
+package org.apache.maven.mercury;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.shared.model.*;
+import org.apache.maven.shared.model.impl.DefaultModelDataSource;
+import org.apache.maven.project.builder.ProjectUri;
+import org.apache.maven.project.builder.ArtifactModelContainerFactory;
+import org.apache.maven.project.builder.IdModelContainerFactory;
+import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
+import org.apache.maven.mercury.artifact.ArtifactMetadata;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ByteArrayInputStream;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+/**
+ * Provides a wrapper for the maven model.
+ */
+public final class MavenDomainModel implements DomainModel {
+
+    /**
+     * Bytes containing the underlying model
+     */
+    private final List<ModelProperty> modelProperties;
+
+    /**
+     * History of joins and deletes of model properties
+     */
+    private String eventHistory;
+
+    private ArtifactBasicMetadata parentMetadata;
+
+
+    /**
+     * Constructor
+     *
+     * @throws IOException if there is a problem constructing the model
+     */
+    public MavenDomainModel(byte[] bytes)
+            throws IOException {
+        this(new ByteArrayInputStream(bytes));
+    }
+
+    /**
+     * Constructor
+     *
+     * @throws IOException if there is a problem constructing the model
+     */
+    public MavenDomainModel(InputStream inputStream)
+            throws IOException {
+        this(ModelMarshaller.marshallXmlToModelProperties(inputStream, ProjectUri.baseUri, MercuryPomTransformer.URIS));
+    }
+
+    /**
+     * Constructor
+     *
+     * @throws IOException if there is a problem constructing the model
+     */
+    public MavenDomainModel(List<ModelProperty> modelProperties)
+            throws IOException {
+        if (modelProperties == null) {
+            throw new IllegalArgumentException("modelProperties: null");
+        }
+
+        this.modelProperties = new ArrayList<ModelProperty>(modelProperties);
+    }
+
+    public boolean hasParent() {
+        //TODO: Expensive call if no parent
+        return getParentMetadata() != null;
+    }
+
+    public List<ArtifactBasicMetadata> getDependencyMetadata() throws DataSourceException {
+        List<ArtifactBasicMetadata> metadatas = new ArrayList<ArtifactBasicMetadata>();
+
+        ModelDataSource source = new DefaultModelDataSource();
+        source.init(modelProperties, Arrays.asList(new ArtifactModelContainerFactory(), new IdModelContainerFactory()));
+        for(ModelContainer modelContainer: source.queryFor(ProjectUri.Dependencies.Dependency.xUri)) {
+            metadatas.add(transformContainerToMetadata(modelContainer));
+        }
+
+        return metadatas;
+    }
+
+    public ArtifactBasicMetadata getParentMetadata() {
+        if (parentMetadata != null) {
+            return copyArtifactBasicMetadata(parentMetadata);
+        }
+        String groupId = null, artifactId = null, version = null;
+
+        for (ModelProperty mp : modelProperties) {
+            if (mp.getUri().equals(ProjectUri.Parent.version)) {
+                version = mp.getValue();
+            } else if (mp.getUri().equals(ProjectUri.Parent.artifactId)) {
+                artifactId = mp.getValue();
+            } else if (mp.getUri().equals(ProjectUri.Parent.groupId)) {
+                groupId = mp.getValue();
+            }
+            if (groupId != null && artifactId != null && version != null) {
+                break;
+            }
+        }
+
+        if (groupId == null || artifactId == null || version == null) {
+            return null;
+        }
+        parentMetadata = new ArtifactBasicMetadata();
+        parentMetadata.setArtifactId(artifactId);
+        parentMetadata.setVersion(version);
+        parentMetadata.setGroupId(groupId);
+
+        return copyArtifactBasicMetadata(parentMetadata);
+    }
+
+    private ArtifactBasicMetadata copyArtifactBasicMetadata(ArtifactBasicMetadata metadata) {
+        ArtifactMetadata amd = new ArtifactMetadata();
+        amd.setArtifactId(metadata.getVersion());
+        amd.setGroupId(metadata.getGroupId());
+        amd.setVersion(metadata.getVersion());
+        return amd;
+    }
+
+    /**
+     * @see org.apache.maven.shared.model.DomainModel#getEventHistory()
+     */
+    public String getEventHistory() {
+        return eventHistory;
+    }
+
+    /**
+     * @see org.apache.maven.shared.model.DomainModel#setEventHistory(String)
+     */
+    public void setEventHistory(String eventHistory) {
+        if (eventHistory == null) {
+            throw new IllegalArgumentException("eventHistory: null");
+        }
+        this.eventHistory = eventHistory;
+    }
+
+    public List<ModelProperty> getModelProperties() {
+        return new ArrayList<ModelProperty>(modelProperties);
+    }
+
+    private static ArtifactBasicMetadata transformContainerToMetadata( ModelContainer container  )
+    {
+        List<ModelProperty> modelProperties = container.getProperties();
+
+        ArtifactBasicMetadata metadata = new ArtifactBasicMetadata();
+        for ( ModelProperty mp : modelProperties )
+        {
+            if(mp.getUri().equals(ProjectUri.Dependencies.Dependency.groupId)) {
+                metadata.setGroupId(mp.getValue());
+            } else if(mp.getUri().equals(ProjectUri.Dependencies.Dependency.artifactId)) {
+                metadata.setArtifactId(mp.getValue());
+            }  else if(mp.getUri().equals(ProjectUri.Dependencies.Dependency.version)) {
+                metadata.setVersion(mp.getValue());
+            } else if(mp.getUri().equals(ProjectUri.Dependencies.Dependency.classifier)) {
+                metadata.setClassifier(mp.getValue());
+            }
+        }
+        return metadata;
+    }
+}

Propchange: maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDomainModel.java
------------------------------------------------------------------------------
    svn:executable = *

Added: maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MercuryPomTransformer.java
URL: http://svn.apache.org/viewvc/maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MercuryPomTransformer.java?rev=706486&view=auto
==============================================================================
--- maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MercuryPomTransformer.java (added)
+++ maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MercuryPomTransformer.java Mon Oct 20 18:06:03 2008
@@ -0,0 +1,637 @@
+package org.apache.maven.mercury;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.project.builder.ArtifactModelContainerFactory;
+import org.apache.maven.project.builder.IdModelContainerFactory;
+import org.apache.maven.project.builder.PomInterpolatorTag;
+import org.apache.maven.project.builder.ProjectUri;
+import org.apache.maven.shared.model.*;
+import org.apache.maven.shared.model.impl.DefaultModelDataSource;
+
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * Provides methods for transforming model properties into a domain model for the pom classic format and vice versa.
+ */
+public final class MercuryPomTransformer
+    implements ModelTransformer
+{
+
+    /**
+     * The URIs this transformer supports
+     */
+    public static final Set<String> URIS = Collections.unmodifiableSet(new HashSet<String>( Arrays.asList( ProjectUri.Build.Extensions.xUri,
+                                                                          ProjectUri.Build.PluginManagement.Plugins.xUri,
+                                                                          ProjectUri.Build.PluginManagement.Plugins.Plugin.configuration,
+                                                                          ProjectUri.Build.PluginManagement.Plugins.Plugin.Dependencies.xUri,
+                                                                          ProjectUri.Build.PluginManagement.Plugins.Plugin.Dependencies.Dependency.Exclusions.xUri,
+                                                                          ProjectUri.Build.PluginManagement.Plugins.Plugin.Executions.xUri,
+
+                                                                          ProjectUri.Build.Plugins.xUri,
+                                                                          ProjectUri.Build.Plugins.Plugin.configuration,
+                                                                          ProjectUri.Build.Plugins.Plugin.Dependencies.xUri,
+                                                                          ProjectUri.Build.Plugins.Plugin.Executions.xUri,
+                                                                          ProjectUri.Build.Resources.xUri,
+                                                                          ProjectUri.Build.Resources.Resource.includes,
+                                                                          ProjectUri.Build.Resources.Resource.excludes,
+                                                                          ProjectUri.Build.TestResources.xUri,
+
+                                                                          ProjectUri.CiManagement.Notifiers.xUri,
+
+                                                                          ProjectUri.Contributors.xUri,
+
+                                                                          ProjectUri.Dependencies.xUri,
+                                                                          ProjectUri.Dependencies.Dependency.Exclusions.xUri,
+
+                                                                          ProjectUri.DependencyManagement.Dependencies.xUri,
+                                                                          ProjectUri.DependencyManagement.Dependencies.Dependency.Exclusions.xUri,
+
+                                                                          ProjectUri.Developers.xUri,
+                                                                          ProjectUri.Developers.Developer.roles,
+                                                                          ProjectUri.Licenses.xUri,
+                                                                          ProjectUri.MailingLists.xUri,
+                                                                          ProjectUri.Modules.xUri,
+                                                                          ProjectUri.PluginRepositories.xUri,
+
+                                                                          ProjectUri.Profiles.xUri,
+                                                                          ProjectUri.Profiles.Profile.Build.Plugins.xUri,
+                                                                          ProjectUri.Profiles.Profile.Build.Plugins.Plugin.Dependencies.xUri,
+                                                                          ProjectUri.Profiles.Profile.Build.Resources.xUri,
+                                                                          ProjectUri.Profiles.Profile.Build.TestResources.xUri,
+                                                                          ProjectUri.Profiles.Profile.Dependencies.xUri,
+                                                                          ProjectUri.Profiles.Profile.Dependencies.Dependency.Exclusions.xUri,
+                                                                          ProjectUri.Profiles.Profile.DependencyManagement.Dependencies.xUri,
+                                                                          ProjectUri.Profiles.Profile.PluginRepositories.xUri,
+                                                                          ProjectUri.Profiles.Profile.Reporting.Plugins.xUri,
+                                                                          ProjectUri.Profiles.Profile.Repositories.xUri,
+
+                                                                          ProjectUri.Reporting.Plugins.xUri,
+                                                                          ProjectUri.Reporting.Plugins.Plugin.ReportSets.xUri,
+
+                                                                          ProjectUri.Repositories.xUri,
+
+                                                                          "http://apache.org/maven/project/profiles/profile/build/pluginManagement/plugins/plugin/dependencies#collection",
+                                                                          "http://apache.org/maven/project/profiles/profile/build/pluginManagement/plugins/plugin/dependencies/dependency/exclusions#collection",
+                                                                          "http://apache.org/maven/project/profiles/profile/build/pluginManagement/plugins/plugin/executions#collection",
+                                                                          "http://apache.org/maven/project/profiles/profile/build/pluginManagement/plugins#collection",
+                                                                          "http://apache.org/maven/project/profiles/profile/build/plugins/plugin/dependencies/dependency/exclusions#collection",
+                                                                          "http://apache.org/maven/project/profiles/profile/dependencyManagement/dependencies/dependency/exclusions#collection",
+                                                                          "http://apache.org/maven/project/profiles/profile/reporting/plugins/plugin/reportSets#collection",
+                                                                          "http://apache.org/maven/project/profiles/profile/build/plugins/plugin/executions#collection" ) ));
+
+    /**
+     * @see ModelTransformer#transformToDomainModel(java.util.List)
+     */
+    public DomainModel transformToDomainModel( List<ModelProperty> properties )
+        throws IOException
+    {
+        if ( properties == null )
+        {
+            throw new IllegalArgumentException( "properties: null" );
+        }
+
+        List<ModelProperty> props = new ArrayList<ModelProperty>( properties );
+
+        //dependency management
+        ModelDataSource source = new DefaultModelDataSource();
+        source.init( props, Arrays.asList( new ArtifactModelContainerFactory(), new IdModelContainerFactory() ) );
+
+        for ( ModelContainer dependencyContainer : source.queryFor( ProjectUri.Dependencies.Dependency.xUri ) )
+        {
+            for ( ModelContainer managementContainer : source.queryFor(
+                ProjectUri.DependencyManagement.Dependencies.Dependency.xUri ) )
+            {
+                managementContainer = new ArtifactModelContainerFactory().create(
+                    transformDependencyManagement( managementContainer.getProperties() ) );
+                ModelContainerAction action = dependencyContainer.containerAction( managementContainer );
+                if ( action.equals( ModelContainerAction.JOIN ) || action.equals( ModelContainerAction.DELETE ) )
+                {
+                    source.join( dependencyContainer, managementContainer );
+                }
+            }
+        }
+
+        for ( ModelContainer dependencyContainer : source.queryFor( ProjectUri.Build.Plugins.Plugin.xUri ) )
+        {
+            for ( ModelContainer managementContainer : source.queryFor(
+                ProjectUri.Build.PluginManagement.Plugins.Plugin.xUri ) )
+            {
+                managementContainer = new ArtifactModelContainerFactory().create(
+                    transformPluginManagement( managementContainer.getProperties() ) );
+
+                //Remove duplicate executions tags
+                boolean hasExecutionsTag = false;
+                for ( ModelProperty mp : dependencyContainer.getProperties() )
+                {
+                    if ( mp.getUri().equals( ProjectUri.Build.Plugins.Plugin.Executions.xUri ) )
+                    {
+                        hasExecutionsTag = true;
+                        break;
+                    }
+                }
+                List<ModelProperty> pList = new ArrayList<ModelProperty>();
+                if ( !hasExecutionsTag )
+                {
+                    pList = managementContainer.getProperties();
+                }
+                else
+                {
+                    for ( ModelProperty mp : managementContainer.getProperties() )
+                    {
+                        if ( !mp.getUri().equals( ProjectUri.Build.Plugins.Plugin.Executions.xUri ) )
+                        {
+                            pList.add( mp );
+                        }
+                    }
+                }
+                managementContainer = new ArtifactModelContainerFactory().create( pList );
+
+                ModelContainerAction action = dependencyContainer.containerAction( managementContainer );
+                if ( action.equals( ModelContainerAction.JOIN ) || action.equals( ModelContainerAction.DELETE ) )
+                {
+                    source.join( dependencyContainer, managementContainer );
+                }
+            }
+        }
+
+        props = source.getModelProperties();
+
+        //Rule: Do not join plugin executions without ids
+        Set<ModelProperty> removeProperties = new HashSet<ModelProperty>();
+        ModelDataSource dataSource = new DefaultModelDataSource();
+        dataSource.init( props, Arrays.asList( new ArtifactModelContainerFactory(), new IdModelContainerFactory() ) );
+        List<ModelContainer> containers = dataSource.queryFor( ProjectUri.Build.Plugins.Plugin.xUri );
+        for ( ModelContainer pluginContainer : containers )
+        {
+            ModelDataSource executionSource = new DefaultModelDataSource();
+            executionSource.init( pluginContainer.getProperties(),
+                                  Arrays.asList( new ArtifactModelContainerFactory(), new IdModelContainerFactory() ) );
+            List<ModelContainer> executionContainers =
+                executionSource.queryFor( ProjectUri.Build.Plugins.Plugin.Executions.Execution.xUri );
+            if ( executionContainers.size() < 2 )
+            {
+                continue;
+            }
+
+            boolean hasAtLeastOneWithoutId = true;
+            for ( ModelContainer executionContainer : executionContainers )
+            {
+                if ( hasAtLeastOneWithoutId )
+                {
+                    hasAtLeastOneWithoutId = hasExecutionId( executionContainer );
+                }
+                if ( !hasAtLeastOneWithoutId && !hasExecutionId( executionContainer ) &&
+                    executionContainers.indexOf( executionContainer ) > 0 )
+                {
+                    removeProperties.addAll( executionContainer.getProperties() );
+                }
+            }
+        }
+        props.removeAll( removeProperties );
+        return new MavenDomainModel(props ); 
+    }
+
+    /**
+     * @see ModelTransformer#transformToModelProperties(java.util.List
+     */
+    public List<ModelProperty> transformToModelProperties(List<DomainModel> domainModels )
+        throws IOException
+    {
+        if ( domainModels == null || domainModels.isEmpty() )
+        {
+            throw new IllegalArgumentException( "domainModels: null or empty" );
+        }
+
+        List<ModelProperty> modelProperties = new ArrayList<ModelProperty>();
+        List<String> projectNames = new ArrayList<String>();
+        StringBuffer scmUrl = new StringBuffer();
+        StringBuffer scmConnectionUrl = new StringBuffer();
+        StringBuffer scmDeveloperUrl = new StringBuffer();
+
+        boolean containsBuildResources = false;
+        boolean containsTestResources = false;
+        boolean containsPluginRepositories = false;
+
+        for ( DomainModel domainModel : domainModels )
+        {
+            if ( !( domainModel instanceof MavenDomainModel ) )
+            {
+                throw new IllegalArgumentException( "domainModels: Invalid domain model" );
+            }
+
+
+            List<ModelProperty> tmp =
+                ( (MavenDomainModel) domainModel).getModelProperties();
+
+            List<ModelProperty> clearedProperties = new ArrayList<ModelProperty>();
+
+            //Missing Version Rule
+            if ( getPropertyFor( ProjectUri.version, tmp ) == null )
+            {
+                ModelProperty parentVersion = getPropertyFor( ProjectUri.Parent.version, tmp );
+                if ( parentVersion != null )
+                {
+                    tmp.add( new ModelProperty( ProjectUri.version, parentVersion.getResolvedValue() ) );
+                }
+            }
+
+            //Modules Not Inherited Rule
+            if ( domainModels.indexOf( domainModel ) != 0 )
+            {
+                ModelProperty modulesProperty = getPropertyFor( ProjectUri.Modules.xUri, tmp );
+                if ( modulesProperty != null )
+                {
+                    tmp.remove( modulesProperty );
+                    tmp.removeAll( getPropertiesFor( ProjectUri.Modules.module, tmp ) );
+                }
+            }
+
+            //Missing groupId, use parent one Rule
+            if ( getPropertyFor( ProjectUri.groupId, tmp ) == null )
+            {
+                ModelProperty parentGroupId = getPropertyFor( ProjectUri.Parent.groupId, tmp );
+                if ( parentGroupId != null )
+                {
+                    tmp.add( new ModelProperty( ProjectUri.groupId, parentGroupId.getResolvedValue() ) );
+                }
+
+            }
+
+            //Not inherited plugin execution rule
+            if ( domainModels.indexOf( domainModel ) > 0 )
+            {
+                List<ModelProperty> removeProperties = new ArrayList<ModelProperty>();
+                ModelDataSource source = new DefaultModelDataSource();
+                source.init( tmp, Arrays.asList( new ArtifactModelContainerFactory(), new IdModelContainerFactory() ) );
+                List<ModelContainer> containers =
+                    source.queryFor( ProjectUri.Build.Plugins.Plugin.Executions.Execution.xUri );
+                for ( ModelContainer container : containers )
+                {
+                    for ( ModelProperty mp : container.getProperties() )
+                    {
+                        if ( mp.getUri().equals( ProjectUri.Build.Plugins.Plugin.Executions.Execution.inherited ) &&
+                            mp.getResolvedValue() != null && mp.getResolvedValue().equals( "false" ) )
+                        {
+                            removeProperties.addAll( container.getProperties() );
+                            for ( int j = tmp.indexOf( mp ); j >= 0; j-- )
+                            {
+                                if ( tmp.get( j ).getUri().equals( ProjectUri.Build.Plugins.Plugin.Executions.xUri ) )
+                                {
+                                    removeProperties.add( tmp.get( j ) );
+                                    break;
+                                }
+                            }
+                            break;
+                        }
+                    }
+                }
+                tmp.removeAll( removeProperties );
+            }
+            //Not inherited plugin rule
+            if ( domainModels.indexOf( domainModel ) > 0 )
+            {
+                List<ModelProperty> removeProperties = new ArrayList<ModelProperty>();
+                ModelDataSource source = new DefaultModelDataSource();
+                source.init( tmp, Arrays.asList( new ArtifactModelContainerFactory(), new IdModelContainerFactory() ) );
+                List<ModelContainer> containers = source.queryFor( ProjectUri.Build.Plugins.Plugin.xUri );
+                for ( ModelContainer container : containers )
+                {
+                    for ( ModelProperty mp : container.getProperties() )
+                    {
+                        if ( mp.getUri().equals( ProjectUri.Build.Plugins.Plugin.inherited ) && mp.getResolvedValue() != null &&
+                            mp.getResolvedValue().equals( "false" ) )
+                        {
+                            removeProperties.addAll( container.getProperties() );
+                            for ( int j = tmp.indexOf( mp ); j >= 0; j-- )
+                            {
+                                if ( tmp.get( j ).getUri().equals( ProjectUri.Build.Plugins.Plugin.xUri ) )
+                                {
+                                    removeProperties.add( tmp.get( j ) );
+                                    break;
+                                }
+                            }
+                            break;
+                        }
+                    }
+                }
+                tmp.removeAll( removeProperties );
+            }
+
+            //SCM Rule
+            ModelProperty scmUrlProperty = getPropertyFor( ProjectUri.Scm.url, tmp );
+            if ( scmUrl.length() == 0 && scmUrlProperty != null )
+            {
+                scmUrl.append( scmUrlProperty.getResolvedValue() );
+                for ( String projectName : projectNames )
+                {
+                    scmUrl.append( "/" ).append( projectName );
+                }
+                int index = tmp.indexOf( scmUrlProperty );
+                tmp.remove( index );
+                tmp.add( index, new ModelProperty( ProjectUri.Scm.url, scmUrl.toString() ) );
+            }
+
+            //SCM Connection Rule
+            scmUrlProperty = getPropertyFor( ProjectUri.Scm.connection, tmp );
+            if ( scmConnectionUrl.length() == 0 && scmUrlProperty != null )
+            {
+                scmConnectionUrl.append( scmUrlProperty.getResolvedValue() );
+                for ( String projectName : projectNames )
+                {
+                    scmConnectionUrl.append( "/" ).append( projectName );
+                }
+                int index = tmp.indexOf( scmUrlProperty );
+                tmp.remove( index );
+                tmp.add( index, new ModelProperty( ProjectUri.Scm.connection, scmConnectionUrl.toString() ) );
+            }
+            //SCM Developer Rule
+            scmUrlProperty = getPropertyFor( ProjectUri.Scm.developerConnection, tmp );
+            if ( scmDeveloperUrl.length() == 0 && scmUrlProperty != null )
+            {
+                scmDeveloperUrl.append( scmUrlProperty.getResolvedValue() );
+                for ( String projectName : projectNames )
+                {
+                    scmDeveloperUrl.append( "/" ).append( projectName );
+                }
+                int index = tmp.indexOf( scmUrlProperty );
+                tmp.remove( index );
+                tmp.add( index, new ModelProperty( ProjectUri.Scm.developerConnection, scmDeveloperUrl.toString() ) );
+            }
+
+            //Project Name Inheritance Rule
+            //Packaging Inheritance Rule
+            //Profiles not inherited rule
+            for ( ModelProperty mp : tmp )
+            {
+                String uri = mp.getUri();
+                if ( domainModels.indexOf( domainModel ) > 0 && ( uri.equals( ProjectUri.name ) ||
+                    uri.equals( ProjectUri.packaging ) || uri.startsWith( ProjectUri.Profiles.xUri ) ) )
+                {
+                    clearedProperties.add( mp );
+                }
+            }
+
+            //Remove Plugin Repository Inheritance Rule
+            //Build Resources Inheritence Rule
+            //Build Test Resources Inheritance Rule
+            //Only inherit IF: the above is contained in super pom (domainModels.size() -1) && the child doesn't has it's own respective field
+            if ( domainModels.indexOf( domainModel ) == 0 )
+            {
+                containsBuildResources = hasProjectUri( ProjectUri.Build.Resources.xUri, tmp );
+                containsTestResources = hasProjectUri( ProjectUri.Build.TestResources.xUri, tmp );
+                containsPluginRepositories = hasProjectUri( ProjectUri.PluginRepositories.xUri, tmp );
+            }
+            for ( ModelProperty mp : tmp )
+            {
+                if ( domainModels.indexOf( domainModel ) > 0 )
+                {
+                    String uri = mp.getUri();
+                    boolean isNotSuperPom = domainModels.indexOf( domainModel ) != ( domainModels.size() - 1 );
+                    if ( isNotSuperPom )
+                    {
+                        if ( uri.startsWith( ProjectUri.Build.Resources.xUri ) ||
+                            uri.startsWith( ProjectUri.Build.TestResources.xUri ) ||
+                            uri.startsWith( ProjectUri.PluginRepositories.xUri ) )
+                        {
+                            clearedProperties.add( mp );
+                        }
+                    }
+                    else
+                    {
+                        if ( containsBuildResources && uri.startsWith( ProjectUri.Build.Resources.xUri ) )
+                        {
+                            clearedProperties.add( mp );
+                        }
+                        else if ( containsTestResources && uri.startsWith( ProjectUri.Build.TestResources.xUri ) )
+                        {
+                            clearedProperties.add( mp );
+                        }
+                        else if ( containsPluginRepositories && uri.startsWith( ProjectUri.PluginRepositories.xUri ) )
+                        {
+                            clearedProperties.add( mp );
+                        }
+                    }
+                }
+            }
+
+            ModelProperty artifactId = getPropertyFor( ProjectUri.artifactId, tmp );
+            if ( artifactId != null )
+            {
+                projectNames.add( 0, artifactId.getResolvedValue() );
+            }
+
+            tmp.removeAll( clearedProperties );
+            modelProperties.addAll( tmp );
+            modelProperties.removeAll( clearedProperties );
+        }
+
+        return modelProperties;
+    }
+
+    public void interpolateModelProperties(List<ModelProperty> modelProperties,
+                                           List<InterpolatorProperty> interpolatorProperties,
+                                           DomainModel domainModel)
+            throws IOException
+    {
+        interpolateModelProperties( modelProperties, interpolatorProperties, (MavenDomainModel) domainModel);
+    }
+
+    private static boolean containsProjectVersion( List<InterpolatorProperty> interpolatorProperties )
+    {
+        InterpolatorProperty versionInterpolatorProperty =
+                new ModelProperty( ProjectUri.version, "").asInterpolatorProperty( ProjectUri.baseUri);
+        for( InterpolatorProperty ip : interpolatorProperties)
+        {
+            if ( ip.equals( versionInterpolatorProperty ) )
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static void interpolateModelProperties(List<ModelProperty> modelProperties,
+                                                   List<InterpolatorProperty> interpolatorProperties,
+                                                   MavenDomainModel domainModel)
+           throws IOException
+    {
+
+        Map<String, String> aliases = new HashMap<String, String>();
+        aliases.put( "project.", "pom.");
+        aliases.put( "\\$\\{project.build.", "\\$\\{build.");
+
+        if(!containsProjectVersion(interpolatorProperties))
+        {
+            aliases.put("\\$\\{project.version\\}", "\\$\\{version\\}");
+        }
+
+        List<ModelProperty> firstPassModelProperties = new ArrayList<ModelProperty>();
+        List<ModelProperty> secondPassModelProperties = new ArrayList<ModelProperty>();
+
+        ModelProperty buildProperty = new ModelProperty(ProjectUri.Build.xUri, null);
+        for(ModelProperty mp : modelProperties)
+        {
+            if( mp.getValue() != null && !mp.getUri().contains( "#property" ) && !mp.getUri().contains( "#collection" ))
+            {
+                if( !buildProperty.isParentOf( mp ) || mp.getUri().equals(ProjectUri.Build.finalName ) )
+                {
+                    firstPassModelProperties.add(mp);
+                }
+                else
+                {
+                    secondPassModelProperties.add(mp);
+                }
+            }
+        }
+
+
+        List<InterpolatorProperty> standardInterpolatorProperties = new ArrayList<InterpolatorProperty>();
+
+        for(ModelProperty mp : modelProperties)
+        {
+            if(mp.getUri().startsWith(ProjectUri.properties) && mp.getValue() != null )
+            {
+                String uri = mp.getUri();
+                standardInterpolatorProperties.add( new InterpolatorProperty( "${" + uri.substring( uri.lastIndexOf( "/" ) + 1,
+                        uri.length() ) + "}", mp.getValue(), PomInterpolatorTag.PROJECT_PROPERTIES.name() ) );
+            }
+        }
+
+        //FIRST PASS - Withhold using build directories as interpolator properties
+        List<InterpolatorProperty> ips1 = new ArrayList<InterpolatorProperty>(interpolatorProperties);
+        ips1.addAll(standardInterpolatorProperties);
+        ips1.addAll(ModelTransformerContext.createInterpolatorProperties(firstPassModelProperties, ProjectUri.baseUri, aliases,
+                        PomInterpolatorTag.PROJECT_PROPERTIES.name(), false, false));
+        Collections.sort(ips1, new Comparator<InterpolatorProperty>()
+        {
+            public int compare(InterpolatorProperty o, InterpolatorProperty o1) {
+                return PomInterpolatorTag.valueOf(o.getTag()).compareTo(PomInterpolatorTag.valueOf(o1.getTag()));
+            }
+        });
+
+        ModelTransformerContext.interpolateModelProperties( modelProperties, ips1 );
+    }
+
+    private static boolean hasExecutionId( ModelContainer executionContainer )
+    {
+        for ( ModelProperty mp : executionContainer.getProperties() )
+        {
+            if ( mp.getUri().equals( ProjectUri.Build.Plugins.Plugin.Executions.Execution.id ) )
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Returns the base uri of all model properties: http://apache.org/maven/project/
+     *
+     * @return Returns the base uri of all model properties: http://apache.org/maven/project/
+     */
+    public String getBaseUri()
+    {
+        return ProjectUri.baseUri;
+    }
+
+    private static boolean hasProjectUri( String projectUri, List<ModelProperty> modelProperties )
+    {
+        for ( ModelProperty mp : modelProperties )
+        {
+            if ( mp.getUri().equals( projectUri ) )
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Returns all model properties containing the specified uri from the specified properties list.
+     *
+     * @param uri        the uri to use in finding the returned model properties
+     * @param properties the model properties list to search
+     * @return all model properties containing the specified uri from the specified properties list
+     */
+    private static List<ModelProperty> getPropertiesFor( String uri, List<ModelProperty> properties )
+    {
+        List<ModelProperty> modelProperties = new ArrayList<ModelProperty>();
+        for ( ModelProperty mp : properties )
+        {
+            if ( uri.equals( mp.getUri() ) )
+            {
+                modelProperties.add( mp );
+            }
+        }
+        return modelProperties;
+    }
+
+
+    /**
+     * Returns the first model property containing the specified uri from the specified properties list.
+     *
+     * @param uri        the uri to use in finding the returned model property
+     * @param properties the model properties list to search
+     * @return the first model property containing the specified uri from the specified properties list.
+     */
+    private static ModelProperty getPropertyFor( String uri, List<ModelProperty> properties )
+    {
+        for ( ModelProperty mp : properties )
+        {
+            if ( uri.equals( mp.getUri() ) )
+            {
+                return mp;
+            }
+        }
+        return null;
+    }
+
+    private static List<ModelProperty> transformDependencyManagement( List<ModelProperty> modelProperties )
+    {
+        List<ModelProperty> transformedProperties = new ArrayList<ModelProperty>();
+        for ( ModelProperty mp : modelProperties )
+        {
+            if ( mp.getUri().startsWith( ProjectUri.DependencyManagement.xUri ) )
+            {
+                transformedProperties.add( new ModelProperty(
+                    mp.getUri().replace( ProjectUri.DependencyManagement.xUri, ProjectUri.xUri ), mp.getResolvedValue() ) );
+            }
+        }
+        return transformedProperties;
+    }
+
+    public static List<ModelProperty> transformPluginManagement( List<ModelProperty> modelProperties )
+    {
+        List<ModelProperty> transformedProperties = new ArrayList<ModelProperty>();
+        for ( ModelProperty mp : modelProperties )
+        {
+            if ( mp.getUri().startsWith( ProjectUri.Build.PluginManagement.xUri ) )
+            {
+                transformedProperties.add( new ModelProperty(
+                    mp.getUri().replace( ProjectUri.Build.PluginManagement.xUri, ProjectUri.Build.xUri ),
+                    mp.getResolvedValue() ) );
+            }
+        }
+        return transformedProperties;
+    }
+}
+

Propchange: maven/components/branches/sisbell-maven-3.0-mercury/maven-mercury/src/main/java/org/apache/maven/mercury/MercuryPomTransformer.java
------------------------------------------------------------------------------
    svn:executable = *

Modified: maven/components/branches/sisbell-maven-3.0-mercury/pom.xml
URL: http://svn.apache.org/viewvc/maven/components/branches/sisbell-maven-3.0-mercury/pom.xml?rev=706486&r1=706485&r2=706486&view=diff
==============================================================================
--- maven/components/branches/sisbell-maven-3.0-mercury/pom.xml (original)
+++ maven/components/branches/sisbell-maven-3.0-mercury/pom.xml Mon Oct 20 18:06:03 2008
@@ -263,6 +263,7 @@
     <module>maven-core</module>
     <module>maven-distribution</module>
     <module>maven-lifecycle</module>
+    <module>maven-mercury</module> 
     <module>maven-model</module>
     <module>maven-plugin-api</module>
     <module>maven-project</module>
@@ -287,6 +288,7 @@
     <plexusUtilsVersion>1.5.5</plexusUtilsVersion>
     <wagonVersion>1.0-beta-4</wagonVersion>
     <mavenSharedModel>1.0-SNAPSHOT</mavenSharedModel>
+    <mercuryVersion>1.0.0-alpha-2-SNAPSHOT</mercuryVersion>      
     <woodstoxVersion>3.2.6</woodstoxVersion>
   </properties>
 
@@ -321,6 +323,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.maven</groupId>
+        <artifactId>maven-mercury</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.maven</groupId>
         <artifactId>maven-model</artifactId>
         <version>${project.version}</version>
       </dependency>
@@ -423,6 +430,16 @@
         <artifactId>wagon-ssh-external</artifactId>
         <version>${wagonVersion}</version>
       </dependency>
+  	<dependency>
+  		<groupId>org.apache.maven.mercury</groupId>
+  		<artifactId>mercury-artifact</artifactId>
+  		<version>${mercuryVersion}</version>
+  	</dependency>
+  	<dependency>
+  		<groupId>org.apache.maven.mercury</groupId>
+  		<artifactId>mercury-external</artifactId>
+  		<version>${mercuryVersion}</version>
+  	</dependency>
       <dependency>
         <groupId>org.apache.maven.artifact</groupId>
         <artifactId>maven-artifact</artifactId>