Hi Hervé I implemented p4maven the java scm provider for Perforce which stores client info at server side. As long as user follow same artifactId/folder convention, it works great. However most of the time, it is not the case, I have to go thru some hook to get it just barely behave.
Great to see this feature taking shape Thanks -Dan On Wed, Aug 26, 2015 at 6:32 PM, Hervé BOUTEMY <[email protected]> wrote: > it is currently not merged to master, just in a MNG-5878 branch for review: > for such a code change, I chose Review Then Commit process (instead of our > classical Commit Then Review) > > But I'm happy that you are interested > > For years, I heard many people (I can name a few I know personnally :) ) > who > called that convention "undocumented rigidity" from Maven, without really > knowing about why this convention was the only solution before someone > imagine > a meaningfull configuration: then there was no proposal associated until > MNG-5878 > > Now it's time to see if my (implemented) proposal is ok both from usability > point of view and from code point of view > > Regards, > > Hervé > > Le mercredi 26 août 2015 17:55:48 Dan Tran a écrit : > > Very excited to see how I can use this property. Good stuff > > > > Thanks > > > > -Dan > > > > On Wed, Aug 26, 2015 at 1:50 PM, Hervé BOUTEMY <[email protected]> > > > > wrote: > > > I think I have found a way to support module directory in SCM & site > that > > > is > > > not artifactId > > > AFAIK, it's a long awaited feature that was until now feared to wreck > > > havock > > > > > > please review and tell what you think about it > > > > > > Regards, > > > > > > Hervé > > > > > > Le mercredi 26 août 2015 20:26:37 [email protected] a écrit : > > > > Repository: maven > > > > > > > > Updated Branches: > > > > refs/heads/MNG-5878 [created] 812e1e9d5 > > > > > > > > MNG-5878 added project.directory property to configure module > directory > > > > when not equals to artifactId > > > > > > > > Project: http://git-wip-us.apache.org/repos/asf/maven/repo > > > > Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/812e1e9d > > > > Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/812e1e9d > > > > Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/812e1e9d > > > > > > > > Branch: refs/heads/MNG-5878 > > > > Commit: 812e1e9d5b7d15a3b206371fc18110193f83cc1f > > > > Parents: 6b6e9bf > > > > Author: Hervé Boutemy <[email protected]> > > > > Authored: Wed Aug 26 22:26:17 2015 +0200 > > > > Committer: Hervé Boutemy <[email protected]> > > > > Committed: Wed Aug 26 22:26:17 2015 +0200 > > > > > > > > > ---------------------------------------------------------------------- > > > > > > > > .../DefaultInheritanceAssembler.java | 60 > > > > > > ++++++++++++++++---- > > > > > > > maven-model-builder/src/site/apt/index.apt | 2 +- > > > > .../DefaultInheritanceAssemblerTest.java | 27 ++++++++- > > > > .../module-path-not-artifactId-child.xml | 43 ++++++++++++++ > > > > .../module-path-not-artifactId-expected.xml | 44 ++++++++++++++ > > > > .../module-path-not-artifactId-parent.xml | 37 ++++++++++++ > > > > 6 files changed, 199 insertions(+), 14 deletions(-) > > > > > > > > > ---------------------------------------------------------------------- > > > > > > > http://git-wip-us.apache.org/repos/asf/maven/blob/812e1e9d/maven-model-bui > > > ld > > > > > > > er/src/main/java/org/apache/maven/model/inheritance/DefaultInheritanceAsse > > > mb> > > > > ler.java > > > > > ---------------------------------------------------------------------- > > > > > > diff > > > > > > > --git > > > > > > > a/maven-model-builder/src/main/java/org/apache/maven/model/inheritance/Def > > > a > > > > > > > ultInheritanceAssembler.java > > > > > > > b/maven-model-builder/src/main/java/org/apache/maven/model/inheritance/Def > > > a > > > > > > > ultInheritanceAssembler.java index 48fdad5..7c2a3b4 100644 > > > > --- > > > > > > > a/maven-model-builder/src/main/java/org/apache/maven/model/inheritance/Def > > > a > > > > > > > ultInheritanceAssembler.java +++ > > > > > > > b/maven-model-builder/src/main/java/org/apache/maven/model/inheritance/Def > > > a > > > > > > > ultInheritanceAssembler.java @@ -19,14 +19,16 @@ package > > > > org.apache.maven.model.inheritance; > > > > > > > > * under the License. > > > > */ > > > > > > > > -import java.io.File; > > > > > > > > import java.util.ArrayList; > > > > import java.util.HashMap; > > > > import java.util.LinkedHashMap; > > > > import java.util.List; > > > > import java.util.Map; > > > > > > > > +import java.util.Properties; > > > > > > > > +import org.apache.maven.model.InputLocation; > > > > > > > > import org.apache.maven.model.Model; > > > > > > > > +import org.apache.maven.model.ModelBase; > > > > > > > > import org.apache.maven.model.Plugin; > > > > import org.apache.maven.model.PluginContainer; > > > > import org.apache.maven.model.ReportPlugin; > > > > > > > > @@ -48,12 +50,18 @@ public class DefaultInheritanceAssembler > > > > > > > > private InheritanceModelMerger merger = new > > > > > > InheritanceModelMerger(); > > > > > > > + private final static String CHILD_DIRECTORY = "child-directory"; > > > > + > > > > + private final static String CHILD_DIRECTORY_PROPERTY = > > > > "project.directory"; + > > > > > > > > @Override > > > > public void assembleModelInheritance( Model child, Model parent, > > > > > > > > ModelBuildingRequest request, ModelProblemCollector problems ) { > > > > > > > > Map<Object, Object> hints = new HashMap<>(); > > > > > > > > - hints.put( MavenModelMerger.CHILD_PATH_ADJUSTMENT, > > > > getChildPathAdjustment( child, parent ) ); + String childPath > = > > > > child.getProperties().getProperty( CHILD_DIRECTORY_PROPERTY, > > > > child.getArtifactId() ); + hints.put( CHILD_DIRECTORY, > childPath > > > > > > ); > > > > > > > + hints.put( MavenModelMerger.CHILD_PATH_ADJUSTMENT, > > > > getChildPathAdjustment( child, parent, childPath ) ); merger.merge( > > > > > > child, > > > > > > > parent, false, hints ); > > > > > > > > } > > > > > > > > @@ -75,7 +83,7 @@ public class DefaultInheritanceAssembler > > > > > > > > * @param parent The parent model, may be <code>null</code>. > > > > * @return The path adjustment, can be empty but never > > > > > > > > <code>null</code>. */ > > > > - private String getChildPathAdjustment( Model child, Model > parent ) > > > > + private String getChildPathAdjustment( Model child, Model > parent, > > > > String childDirectory ) { > > > > > > > > String adjustment = ""; > > > > > > > > @@ -90,10 +98,9 @@ public class DefaultInheritanceAssembler > > > > > > > > * repository. In other words, modules where artifactId > != > > > > > > > > moduleDirName will see different effective URLs * depending on how > the > > > > model was constructed (from filesystem or from repository). */ > > > > - File childDirectory = child.getProjectDirectory(); > > > > - if ( childDirectory != null ) > > > > + if ( child.getProjectDirectory() != null ) > > > > > > > > { > > > > > > > > - childName = childDirectory.getName(); > > > > + childName = child.getProjectDirectory().getName(); > > > > > > > > } > > > > > > > > for ( String module : parent.getModules() ) > > > > > > > > @@ -115,7 +122,7 @@ public class DefaultInheritanceAssembler > > > > > > > > moduleName = moduleName.substring( lastSlash + 1 ); > > > > > > > > - if ( moduleName.equals( childName ) && lastSlash >= > 0 ) > > > > + if ( ( moduleName.equals( childName ) || ( > > > > moduleName.equals( childDirectory ) ) ) && lastSlash >= 0 ) { > > > > > > > > adjustment = module.substring( 0, lastSlash ); > > > > break; > > > > > > > > @@ -133,13 +140,13 @@ public class DefaultInheritanceAssembler > > > > > > > > @Override > > > > protected String extrapolateChildUrl( String parentUrl, > > > > > > Map<Object, > > > > > > > Object> context ) { > > > > - Object artifactId = context.get( ARTIFACT_ID ); > > > > + Object childDirectory = context.get( CHILD_DIRECTORY ); > > > > > > > > Object childPathAdjustment = context.get( > > > > > > CHILD_PATH_ADJUSTMENT > > > > > > > ); > > > > > > > > - if ( artifactId != null && childPathAdjustment != null ) > > > > + if ( childDirectory != null && childPathAdjustment != > null > > > > ) > > > > > > > > { > > > > > > > > - // append childPathAdjustment and artifactId to > parent > > > > > > url > > > > > > > - return appendPath( parentUrl, artifactId.toString(), > > > > childPathAdjustment.toString() ); + // append > > > > childPathAdjustment and childDirectory to parent url + > > > > return appendPath( parentUrl, childDirectory.toString(), > > > > childPathAdjustment.toString() ); } > > > > > > > > else > > > > { > > > > > > > > @@ -185,6 +192,37 @@ public class DefaultInheritanceAssembler > > > > > > > > } > > > > > > > > @Override > > > > > > > > + protected void mergeModelBase_Properties( ModelBase target, > > > > ModelBase source, boolean sourceDominant, + > > > > > > > > Map<Object, Object> context ) + { > > > > > > > > + Properties merged = new Properties(); > > > > + if ( sourceDominant ) > > > > + { > > > > + merged.putAll( target.getProperties() ); > > > > + putAll( merged, source.getProperties(), > > > > CHILD_DIRECTORY_PROPERTY ); + } > > > > + else > > > > + { > > > > + merged.putAll( source.getProperties() ); > > > > + putAll( merged, target.getProperties(), > > > > CHILD_DIRECTORY_PROPERTY ); + } > > > > + target.setProperties( merged ); > > > > + target.setLocation( "properties", InputLocation.merge( > > > > target.getLocation( "properties" ), + > > > > > > > > source.getLocation( "properties" ), > > > > > > > > sourceDominant ) ); + } > > > > + > > > > + private void putAll( Map<Object, Object> s, Map<Object, > Object> > > > > > > t, > > > > > > > Object excludeKey ) + { > > > > + for ( Map.Entry<Object, Object> e : t.entrySet() ) > > > > + { > > > > + if ( !e.getKey().equals( excludeKey ) ) > > > > + { > > > > + s.put( e.getKey(), e.getValue() ); > > > > + } > > > > + } > > > > + } > > > > + > > > > + @Override > > > > > > > > protected void mergePluginContainer_Plugins( PluginContainer > > > > > > > > target, PluginContainer source, boolean sourceDominant, Map<Object, > > > > > > Object> > > > > > > > context ) { > > > > > > > http://git-wip-us.apache.org/repos/asf/maven/blob/812e1e9d/maven-model-bui > > > ld> > > > > er/src/site/apt/index.apt > > > > > ---------------------------------------------------------------------- > > > > > > diff > > > > > > > --git a/maven-model-builder/src/site/apt/index.apt > > > > b/maven-model-builder/src/site/apt/index.apt index 9a645f4..764f8c6 > > > > > > 100644 > > > > > > > --- a/maven-model-builder/src/site/apt/index.apt > > > > +++ b/maven-model-builder/src/site/apt/index.apt > > > > @@ -62,7 +62,7 @@ Maven Model Builder > > > > > > > ({{{./xref/org/apache/maven/model/inheritance/DefaultInheritanceAssembler. > > > h > > > > > > > tml}source}}). Notice that <<<project.url>>>, > > > > > > <<<project.scm.connection>>>, > > > > > > > <<<project.scm.developerConnection>>>, <<<project.scm.url>>> and > > > > > > > <<<project.distributionManagement.site.url>>> have a special > treatment: > > > if > > > > > > > not overridden in child, the default value is parent's one - with > > > > child > > > > artifact id appended > > > > + with child artifact id appended, or <<<project.directory>>> > property > > > > value if directory is not equals to artifact id > > > > > > > > ** model interpolation (see below) > > > > > > > http://git-wip-us.apache.org/repos/asf/maven/blob/812e1e9d/maven-model-bui > > > ld > > > > > > > er/src/test/java/org/apache/maven/model/inheritance/DefaultInheritanceAsse > > > mb> > > > > lerTest.java > > > > > ---------------------------------------------------------------------- > > > > > > diff > > > > > > > --git > > > > > > > a/maven-model-builder/src/test/java/org/apache/maven/model/inheritance/Def > > > a > > > > > > > ultInheritanceAssemblerTest.java > > > > > > > b/maven-model-builder/src/test/java/org/apache/maven/model/inheritance/Def > > > a > > > > > > > ultInheritanceAssemblerTest.java index f9e95ec..e3a2d50 100644 > > > > --- > > > > > > > a/maven-model-builder/src/test/java/org/apache/maven/model/inheritance/Def > > > a > > > > > > > ultInheritanceAssemblerTest.java +++ > > > > > > > b/maven-model-builder/src/test/java/org/apache/maven/model/inheritance/Def > > > a > > > > > > > ultInheritanceAssemblerTest.java @@ -88,12 +88,35 @@ public class > > > > DefaultInheritanceAssemblerTest > > > > > > > > try ( Reader control = new InputStreamReader( new > > > > > > FileInputStream( > > > > > > > expected ), "UTF-8" ); Reader test = new InputStreamReader( new > > > > FileInputStream( actual ), "UTF-8" ) ) { > > > > - > > > > > > > > XMLUnit.setIgnoreComments( true ); > > > > XMLUnit.setIgnoreWhitespace( true ); > > > > XMLAssert.assertXMLEqual( control, test ); > > > > > > > > } > > > > > > > > - > > > > > > > > } > > > > > > > > + public void testModulePathNotArtifactId() > > > > + throws Exception > > > > + { > > > > + Model parent = getModel( > "module-path-not-artifactId-parent" ); > > > > + > > > > + Model child = getModel( "module-path-not-artifactId-child" > ); > > > > + > > > > + SimpleProblemCollector problems = new > SimpleProblemCollector(); > > > > + > > > > + assembler.assembleModelInheritance( child, parent, null, > > > > > > problems > > > > > > > ); + > > > > + File actual = getTestFile( > > > > > > > "target/test-classes/poms/inheritance/module-path-not-artifactId-actual.xm > > > l > > > > > > > " ); + > > > > + writer.write( actual, null, child ); > > > > + > > > > + // check with getPom( > "module-path-not-artifactId-effective" ) > > > > + File expected = getPom( > "module-path-not-artifactId-expected" > > > > ); > > > > + try ( Reader control = new InputStreamReader( new > > > > > > FileInputStream( > > > > > > > expected ), "UTF-8" ); + Reader test = new > > > > > > InputStreamReader( > > > > > > > new FileInputStream( actual ), "UTF-8" ) ) + { > > > > + XMLUnit.setIgnoreComments( true ); > > > > + XMLUnit.setIgnoreWhitespace( true ); > > > > + XMLAssert.assertXMLEqual( control, test ); > > > > + } > > > > + } > > > > > > > > } > > > > > > > http://git-wip-us.apache.org/repos/asf/maven/blob/812e1e9d/maven-model-bui > > > ld > > > > > > > er/src/test/resources/poms/inheritance/module-path-not-artifactId-child.xm > > > l > > > > > > > > ---------------------------------------------------------------------- > > > > > > diff > > > > > > > --git > > > > > > > a/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > > a > > > > > > > rtifactId-child.xml > > > > > > > b/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > > a > > > > > > > rtifactId-child.xml new file mode 100644 > > > > index 0000000..7031f44 > > > > --- /dev/null > > > > +++ > > > > > > > b/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > > a > > > > > > > rtifactId-child.xml @@ -0,0 +1,43 @@ > > > > +<?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/xsd/maven-4.0.0.xsd"> + > > > > <modelVersion>4.0.0</modelVersion> > > > > + > > > > + <parent> > > > > + <groupId>inheritance</groupId> > > > > + <artifactId>parent</artifactId> > > > > + <version>11-SNAPSHOT</version> > > > > + </parent> > > > > + > > > > + <artifactId>child-artifact-id</artifactId> > > > > + <name>Model inheritance test parent: module directory != > > > > artifactId</name> + <description> > > > > + artifactId == "child-artifact-id" > > > > + but expect path on SCM and site == "child" > > > > + feature: support "project.directory" property, ressembling > future > > > > > > model > > > > > > > addition of "directory" element along "artifactId" + </description> > > > > + > > > > + <properties> > > > > + <project.directory>child</project.directory> > > > > + </properties> > > > > +</project> > > > > \ No newline at end of file > > > > > > > http://git-wip-us.apache.org/repos/asf/maven/blob/812e1e9d/maven-model-bui > > > ld > > > > > > > er/src/test/resources/poms/inheritance/module-path-not-artifactId-expected > > > .x> > > > > ml > > > > > ---------------------------------------------------------------------- > > > > diff --git > > > > > > > a/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > > a > > > > > > > rtifactId-expected.xml > > > > > > > b/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > > a > > > > > > > rtifactId-expected.xml new file mode 100644 > > > > index 0000000..38d9406 > > > > --- /dev/null > > > > +++ > > > > > > > b/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > > a > > > > > > > rtifactId-expected.xml @@ -0,0 +1,44 @@ > > > > +<?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/xsd/maven-4.0.0.xsd"> + > > > > <modelVersion>4.0.0</modelVersion> > > > > + > > > > + <parent> > > > > + <groupId>inheritance</groupId> > > > > + <artifactId>parent</artifactId> > > > > + <version>11-SNAPSHOT</version> > > > > + </parent> > > > > + > > > > + <groupId>inheritance</groupId> > > > > + <artifactId>child-artifact-id</artifactId> > > > > + <version>11-SNAPSHOT</version> > > > > + <name>Model inheritance test parent: module directory != > > > > artifactId</name> + <description> > > > > + artifactId == "child-artifact-id" > > > > + but expect path on SCM and site == "child" > > > > + feature: support "project.directory" property, ressembling > future > > > > > > model > > > > > > > addition of "directory" element along "artifactId" + </description> > > > > + > > > > + <url>http://www.apache.org/child/</url> > > > > + > > > > +</project> > > > > > > > http://git-wip-us.apache.org/repos/asf/maven/blob/812e1e9d/maven-model-bui > > > ld > > > > > > > er/src/test/resources/poms/inheritance/module-path-not-artifactId-parent.x > > > ml> > > > > > ---------------------------------------------------------------------- > > > > > > diff > > > > > > > --git > > > > > > > a/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > > a > > > > > > > rtifactId-parent.xml > > > > > > > b/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > > a > > > > > > > rtifactId-parent.xml new file mode 100644 > > > > index 0000000..d29d78c > > > > --- /dev/null > > > > +++ > > > > > > > b/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > > a > > > > > > > rtifactId-parent.xml @@ -0,0 +1,37 @@ > > > > +<?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/xsd/maven-4.0.0.xsd"> + > > > > <modelVersion>4.0.0</modelVersion> > > > > + > > > > + <groupId>inheritance</groupId> > > > > + <artifactId>parent</artifactId> > > > > + <version>11-SNAPSHOT</version> > > > > + > > > > + <name>Model inheritance test parent: module path != > artifactId</name> > > > > + <url>http://www.apache.org/</url> > > > > + > > > > + <modules> > > > > + <module>child</module> > > > > + </modules> > > > > + > > > > +</project> > > > > \ No newline at end of file > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: [email protected] > > > For additional commands, e-mail: [email protected] > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > >
