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>