From 04a020ea5a21c3f26667dbb51e467a38d9e7efe2 Mon Sep 17 00:00:00 2001 From: Benjamin Bentmann Date: Fri, 23 Jan 2009 15:35:43 +0000 Subject: [PATCH] o Created UT for MNG-3827 git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@737056 13f79535-47bb-0310-9956-ffa450edef68 --- .../project/builder/PomConstructionTest.java | 22 +++ .../maven/project/harness/PomTestWrapper.java | 6 + .../project/harness/Xpp3DomNodeIterator.java | 161 ++++++++++++++++++ .../project/harness/Xpp3DomNodePointer.java | 149 ++++++++++++++++ .../harness/Xpp3DomPointerFactory.java | 62 +++++++ .../plugin-config-order/w-plugin-mngt/pom.xml | 68 ++++++++ .../wo-plugin-mngt/pom.xml | 59 +++++++ 7 files changed, 527 insertions(+) create mode 100644 maven-project/src/test/java/org/apache/maven/project/harness/Xpp3DomNodeIterator.java create mode 100644 maven-project/src/test/java/org/apache/maven/project/harness/Xpp3DomNodePointer.java create mode 100644 maven-project/src/test/java/org/apache/maven/project/harness/Xpp3DomPointerFactory.java create mode 100644 maven-project/src/test/resources-project-builder/plugin-config-order/w-plugin-mngt/pom.xml create mode 100644 maven-project/src/test/resources-project-builder/plugin-config-order/wo-plugin-mngt/pom.xml diff --git a/maven-project/src/test/java/org/apache/maven/project/builder/PomConstructionTest.java b/maven-project/src/test/java/org/apache/maven/project/builder/PomConstructionTest.java index 7342fa20f2..35b8f7e9c3 100644 --- a/maven-project/src/test/java/org/apache/maven/project/builder/PomConstructionTest.java +++ b/maven-project/src/test/java/org/apache/maven/project/builder/PomConstructionTest.java @@ -470,6 +470,28 @@ public class PomConstructionTest } //*/ + public void testOrderOfPluginConfigurationElementsWithoutPluginManagement() + throws Exception + { + PomTestWrapper pom = buildPom( "plugin-config-order/wo-plugin-mngt" ); + assertEquals( "one", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[1]" ) ); + assertEquals( "two", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[2]" ) ); + assertEquals( "three", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[3]" ) ); + assertEquals( "four", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[4]" ) ); + } + + /* FIXME: cf. MNG-3827 + public void testOrderOfPluginConfigurationElementsWithPluginManagement() + throws Exception + { + PomTestWrapper pom = buildPom( "plugin-config-order/w-plugin-mngt" ); + assertEquals( "one", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[1]" ) ); + assertEquals( "two", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[2]" ) ); + assertEquals( "three", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[3]" ) ); + assertEquals( "four", pom.getValue( "build/plugins[1]/configuration/stringParams/stringParam[4]" ) ); + } + //*/ + private PomArtifactResolver artifactResolver( String basedir ) { return new FileBasedPomArtifactResolver( new File( BASE_POM_DIR, basedir ) ); diff --git a/maven-project/src/test/java/org/apache/maven/project/harness/PomTestWrapper.java b/maven-project/src/test/java/org/apache/maven/project/harness/PomTestWrapper.java index bc090aba57..2074d3f908 100644 --- a/maven-project/src/test/java/org/apache/maven/project/harness/PomTestWrapper.java +++ b/maven-project/src/test/java/org/apache/maven/project/harness/PomTestWrapper.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Map; import org.apache.commons.jxpath.JXPathContext; +import org.apache.commons.jxpath.ri.JXPathContextReferenceImpl; import org.apache.maven.model.Model; import org.apache.maven.project.builder.PomClassicDomainModel; import org.apache.maven.shared.model.ModelProperty; @@ -40,6 +41,11 @@ public class PomTestWrapper private JXPathContext context; + static + { + JXPathContextReferenceImpl.addNodePointerFactory( new Xpp3DomPointerFactory() ); + } + public PomTestWrapper( PomClassicDomainModel domainModel ) throws IOException { diff --git a/maven-project/src/test/java/org/apache/maven/project/harness/Xpp3DomNodeIterator.java b/maven-project/src/test/java/org/apache/maven/project/harness/Xpp3DomNodeIterator.java new file mode 100644 index 0000000000..f3d57786b0 --- /dev/null +++ b/maven-project/src/test/java/org/apache/maven/project/harness/Xpp3DomNodeIterator.java @@ -0,0 +1,161 @@ +package org.apache.maven.project.harness; + +/* + * 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 java.util.ArrayList; +import java.util.List; + +import org.apache.commons.jxpath.ri.Compiler; +import org.apache.commons.jxpath.ri.compiler.NodeNameTest; +import org.apache.commons.jxpath.ri.compiler.NodeTest; +import org.apache.commons.jxpath.ri.compiler.NodeTypeTest; +import org.apache.commons.jxpath.ri.model.NodeIterator; +import org.apache.commons.jxpath.ri.model.NodePointer; +import org.codehaus.plexus.util.StringUtils; +import org.codehaus.plexus.util.xml.Xpp3Dom; + +/** + * A node iterator for JXPath to support Xpp3Dom. + * + * @author Benjamin Bentmann + * @version $Id$ + */ +class Xpp3DomNodeIterator + implements NodeIterator +{ + + private NodePointer parent; + + private NodeTest test; + + private Xpp3Dom node; + + private Xpp3Dom[] children; + + private List filteredChildren = new ArrayList(); + + private int filteredIndex; + + private Xpp3Dom child; + + private int position; + + public Xpp3DomNodeIterator( NodePointer parent, NodeTest test, boolean reverse, NodePointer startWith ) + { + this.parent = parent; + this.node = (Xpp3Dom) parent.getNode(); + this.children = this.node.getChildren(); + if ( startWith != null ) + { + for ( ; filteredIndex < children.length; filteredIndex++ ) + { + if ( startWith.equals( children[filteredIndex] ) ) + { + filteredIndex++; + break; + } + } + } + this.test = test; + if ( reverse ) + { + throw new UnsupportedOperationException(); + } + } + + public NodePointer getNodePointer() + { + if ( position == 0 ) + { + setPosition( 1 ); + } + return ( child == null ) ? null : new Xpp3DomNodePointer( parent, child ); + } + + public int getPosition() + { + return position; + } + + public boolean setPosition( int position ) + { + this.position = position; + filterChildren( position ); + child = ( position > 0 && position <= filteredChildren.size() ) ? filteredChildren.get( position - 1 ) : null; + return child != null; + } + + private void filterChildren( int position ) + { + for ( ; position > filteredChildren.size() && filteredIndex < children.length; filteredIndex++ ) + { + Xpp3Dom child = children[filteredIndex]; + if ( testNode( child ) ) + { + filteredChildren.add( child ); + } + } + } + + private boolean testNode( Xpp3Dom node ) + { + if ( test == null ) + { + return true; + } + if ( test instanceof NodeNameTest ) + { + String nodeName = node.getName(); + if ( StringUtils.isEmpty( nodeName ) ) + { + return false; + } + + NodeNameTest nodeNameTest = (NodeNameTest) test; + String namespaceURI = nodeNameTest.getNamespaceURI(); + boolean wildcard = nodeNameTest.isWildcard(); + String testName = nodeNameTest.getNodeName().getName(); + String testPrefix = nodeNameTest.getNodeName().getPrefix(); + if ( wildcard && testPrefix == null ) + { + return true; + } + if ( wildcard || testName.equals( nodeName ) ) + { + return StringUtils.isEmpty( namespaceURI ) || StringUtils.isEmpty( testPrefix ); + } + return false; + } + if ( test instanceof NodeTypeTest ) + { + switch ( ( (NodeTypeTest) test ).getNodeType() ) + { + case Compiler.NODE_TYPE_NODE: + return true; + case Compiler.NODE_TYPE_TEXT: + return node.getValue() != null; + default: + return false; + } + } + return false; + } + +} diff --git a/maven-project/src/test/java/org/apache/maven/project/harness/Xpp3DomNodePointer.java b/maven-project/src/test/java/org/apache/maven/project/harness/Xpp3DomNodePointer.java new file mode 100644 index 0000000000..2d254d3ebf --- /dev/null +++ b/maven-project/src/test/java/org/apache/maven/project/harness/Xpp3DomNodePointer.java @@ -0,0 +1,149 @@ +package org.apache.maven.project.harness; + +/* + * 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 java.util.ArrayList; +import java.util.List; + +import org.apache.commons.jxpath.ri.QName; +import org.apache.commons.jxpath.ri.compiler.NodeTest; +import org.apache.commons.jxpath.ri.model.NodeIterator; +import org.apache.commons.jxpath.ri.model.NodePointer; +import org.codehaus.plexus.util.xml.Xpp3Dom; + +/** + * A node pointer for JXPath to support Xpp3Dom. + * + * @author Benjamin Bentmann + * @version $Id$ + */ +class Xpp3DomNodePointer + extends NodePointer +{ + + private Xpp3Dom node; + + public Xpp3DomNodePointer( Xpp3Dom node ) + { + super( null ); + this.node = node; + } + + public Xpp3DomNodePointer( NodePointer parent, Xpp3Dom node ) + { + super( parent ); + this.node = node; + } + + @Override + public int compareChildNodePointers( NodePointer pointer1, NodePointer pointer2 ) + { + Xpp3Dom node1 = (Xpp3Dom) pointer1.getBaseValue(); + Xpp3Dom node2 = (Xpp3Dom) pointer2.getBaseValue(); + if ( node1 == node2 ) + { + return 0; + } + for ( int i = 0; i < node.getChildCount(); i++ ) + { + Xpp3Dom child = node.getChild( i ); + if ( child == node1 ) + { + return -1; + } + if ( child == node2 ) + { + return 1; + } + } + return 0; + } + + @Override + public Object getValue() + { + return getValue(node); + } + + private static Object getValue( Xpp3Dom node ) + { + if ( node.getValue() != null ) + { + return node.getValue().trim(); + } + else + { + List children = new ArrayList(); + for ( int i = 0; i < node.getChildCount(); i++ ) + { + children.add( getValue( node.getChild( i ) ) ); + } + return children; + } + } + + @Override + public Object getBaseValue() + { + return node; + } + + @Override + public Object getImmediateNode() + { + return node; + } + + @Override + public int getLength() + { + return 1; + } + + @Override + public QName getName() + { + return new QName( null, node.getName() ); + } + + @Override + public boolean isCollection() + { + return false; + } + + @Override + public boolean isLeaf() + { + return node.getChildCount() <= 0; + } + + @Override + public void setValue( Object value ) + { + throw new UnsupportedOperationException(); + } + + @Override + public NodeIterator childIterator( NodeTest test, boolean reverse, NodePointer startWith ) + { + return new Xpp3DomNodeIterator( this, test, reverse, startWith ); + } +} diff --git a/maven-project/src/test/java/org/apache/maven/project/harness/Xpp3DomPointerFactory.java b/maven-project/src/test/java/org/apache/maven/project/harness/Xpp3DomPointerFactory.java new file mode 100644 index 0000000000..b58c22666c --- /dev/null +++ b/maven-project/src/test/java/org/apache/maven/project/harness/Xpp3DomPointerFactory.java @@ -0,0 +1,62 @@ +package org.apache.maven.project.harness; + +/* + * 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 java.util.Locale; + +import org.apache.commons.jxpath.ri.QName; +import org.apache.commons.jxpath.ri.model.NodePointer; +import org.apache.commons.jxpath.ri.model.NodePointerFactory; +import org.codehaus.plexus.util.xml.Xpp3Dom; + +/** + * A node pointer factory for JXPath to support Xpp3Dom. + * + * @author Benjamin Bentmann + * @version $Id$ + */ +class Xpp3DomPointerFactory + implements NodePointerFactory +{ + + public int getOrder() + { + return 200; + } + + public NodePointer createNodePointer( QName name, Object object, Locale locale ) + { + if ( object instanceof Xpp3Dom ) + { + return new Xpp3DomNodePointer( (Xpp3Dom) object ); + } + return null; + } + + public NodePointer createNodePointer( NodePointer parent, QName name, Object object ) + { + if ( object instanceof Xpp3Dom ) + { + return new Xpp3DomNodePointer( parent, (Xpp3Dom) object ); + } + return null; + } + +} diff --git a/maven-project/src/test/resources-project-builder/plugin-config-order/w-plugin-mngt/pom.xml b/maven-project/src/test/resources-project-builder/plugin-config-order/w-plugin-mngt/pom.xml new file mode 100644 index 0000000000..2b3fd71d03 --- /dev/null +++ b/maven-project/src/test/resources-project-builder/plugin-config-order/w-plugin-mngt/pom.xml @@ -0,0 +1,68 @@ + + + + + + 4.0.0 + + org.apache.maven.its.mng3827 + test2 + 1.0-SNAPSHOT + + Maven Integration Test :: MNG-3827 + + Verify that plain plugin configuration works correctly. + + + + + + + + org.apache.maven.its.plugins + maven-it-plugin-configuration + 2.1-SNAPSHOT + + + + + + org.apache.maven.its.plugins + maven-it-plugin-configuration + + + one + two + three + four + + + + + validate + + config + + + + + + + diff --git a/maven-project/src/test/resources-project-builder/plugin-config-order/wo-plugin-mngt/pom.xml b/maven-project/src/test/resources-project-builder/plugin-config-order/wo-plugin-mngt/pom.xml new file mode 100644 index 0000000000..22a2b810f6 --- /dev/null +++ b/maven-project/src/test/resources-project-builder/plugin-config-order/wo-plugin-mngt/pom.xml @@ -0,0 +1,59 @@ + + + + + + 4.0.0 + + org.apache.maven.its.mng3827 + test1 + 1.0-SNAPSHOT + + Maven Integration Test :: MNG-3827 + + Verify that plain plugin configuration works correctly. + + + + + + + org.apache.maven.its.plugins + maven-it-plugin-configuration + + + one + two + three + four + + + + + validate + + config + + + + + + +