You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by "Kevin Brockhoff (JIRA)" <ji...@apache.org> on 2008/09/09 22:59:44 UTC
[jira] Updated: (IVY-900) Parsing of m2 pom does not handle
properties correctly.
[ https://issues.apache.org/jira/browse/IVY-900?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Kevin Brockhoff updated IVY-900:
--------------------------------
Description:
There are a bunch of issues (IVY-512, IVY-550, IVY-620, IVY-637) that are makred fixed that not fixed. The attached file will actually fix these issues.
/*
* 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.
*
*/
package org.apache.ivy.plugins.parser.m2;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.ivy.core.IvyPatternHelper;
import org.apache.ivy.core.module.id.ModuleId;
import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.plugins.repository.Resource;
import org.apache.ivy.util.XMLHelper;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
/**
* Provides the method to read some data out of the DOM tree of a pom
* file.
*/
public class PomReader {
private static final String PACKAGING = "packaging";
private static final String DEPENDENCY = "dependency";
private static final String DEPENDENCIES = "dependencies";
private static final String DEPENDENCY_MGT = "dependencyManagement";
private static final String PROJECT = "project";
private static final String GROUP_ID = "groupId";
private static final String ARTIFACT_ID = "artifactId";
private static final String VERSION = "version";
private static final String PARENT = "parent";
private static final String SCOPE = "scope";
private static final String CLASSIFIER = "classifier";
private static final String OPTIONAL = "optional";
private static final String EXCLUSIONS = "exclusions";
private static final String EXCLUSION = "exclusion";
private static final String DISTRIBUTION_MGT = "distributionManagement";
private static final String RELOCATION = "relocation";
private static final String PROPERTIES = "properties";
private HashMap properties = new HashMap();
private final Element projectElement;
private final Element parentElement;
public PomReader(URL descriptorURL, Resource res) throws IOException, SAXException {
Document pomDomDoc = XMLHelper.parseToDom(descriptorURL, res);
projectElement = pomDomDoc.getDocumentElement();
if (!PROJECT.equals(projectElement.getNodeName())) {
throw new SAXParseException("project must be the root tag" , res.getName() ,
res.getName(), 0, 0);
}
parentElement = getFirstChildElement(projectElement , PARENT);
properties.putAll(getPomProperties());
}
public boolean hasParent() {
return parentElement != null;
}
/**
* Add a property if not yet set and value is not null.
* This garantee that property keep the first value that is put on it and that the properties
* are never null.
*/
public void setProperty(String prop, String val) {
if (!properties.containsKey(prop) && val != null) {
properties.put(prop, val);
}
}
public String getGroupId() {
String groupId = getFirstChildText(projectElement , GROUP_ID);
if (groupId == null) {
groupId = getFirstChildText(parentElement, GROUP_ID);
}
return replaceProps(groupId);
}
public String getParentGroupId() {
String groupId = getFirstChildText(parentElement , GROUP_ID);
if (groupId == null) {
groupId = getFirstChildText(projectElement, GROUP_ID);
}
return replaceProps(groupId);
}
public String getArtifactId() {
String val = getFirstChildText(projectElement , ARTIFACT_ID);
if (val == null) {
val = getFirstChildText(parentElement, ARTIFACT_ID);
}
return replaceProps(val);
}
public String getParentArtifactId() {
String val = getFirstChildText(parentElement , ARTIFACT_ID);
if (val == null) {
val = getFirstChildText(projectElement, ARTIFACT_ID);
}
return replaceProps(val);
}
public String getVersion() {
String val = getFirstChildText(projectElement , VERSION);
if (val == null) {
val = getFirstChildText(parentElement, VERSION);
}
return replaceProps(val);
}
public String getParentVersion() {
String val = getFirstChildText(parentElement , VERSION);
if (val == null) {
val = getFirstChildText(projectElement, VERSION);
}
return replaceProps(val);
}
public String getPackaging() {
String val = getFirstChildText(projectElement , PACKAGING);
if (val == null) {
val = "jar";
}
return val;
}
public ModuleRevisionId getRelocation() {
Element distrMgt = getFirstChildElement(projectElement, DISTRIBUTION_MGT);
Element relocation = getFirstChildElement(distrMgt , RELOCATION);
if (relocation == null) {
return null;
} else {
String relocGroupId = getFirstChildText(relocation, GROUP_ID);
String relocArtId = getFirstChildText(relocation, ARTIFACT_ID);
String relocVersion = getFirstChildText(relocation, VERSION);
relocGroupId = relocGroupId == null ? getGroupId() : relocGroupId;
relocArtId = relocArtId == null ? getArtifactId() : relocArtId;
relocVersion = relocVersion == null ? getVersion() : relocVersion;
return ModuleRevisionId.newInstance(relocGroupId, relocArtId, relocVersion);
}
}
public List /* <PomDependencyData> */ getDependencies() {
Element dependenciesElement = getFirstChildElement(projectElement, DEPENDENCIES);
LinkedList dependencies = new LinkedList();
if (dependenciesElement != null) {
NodeList childs = dependenciesElement.getChildNodes();
for (int i = 0; i < childs.getLength(); i++) {
Node node = childs.item(i);
if (node instanceof Element && DEPENDENCY.equals(node.getNodeName())) {
dependencies.add(new PomDependencyData((Element) node));
}
}
}
return dependencies;
}
public List /* <PomDependencyMgt> */ getDependencyMgt() {
Element dependenciesElement = getFirstChildElement(projectElement, DEPENDENCY_MGT);
dependenciesElement = getFirstChildElement(dependenciesElement, DEPENDENCIES);
LinkedList dependencies = new LinkedList();
if (dependenciesElement != null) {
NodeList childs = dependenciesElement.getChildNodes();
for (int i = 0; i < childs.getLength(); i++) {
Node node = childs.item(i);
if (node instanceof Element && DEPENDENCY.equals(node.getNodeName())) {
dependencies.add(new PomDependencyMgt((Element) node));
}
}
}
return dependencies;
}
public class PomDependencyMgt {
private final Element depElement;
PomDependencyMgt(Element depElement) {
this.depElement = depElement;
}
public String getGroupId() {
String val = getFirstChildText(depElement , GROUP_ID);
return replaceProps(val);
}
public String getArtifaceId() {
String val = getFirstChildText(depElement , ARTIFACT_ID);
return replaceProps(val);
}
public String getVersion() {
String val = getFirstChildText(depElement , VERSION);
return replaceProps(val);
}
}
public class PomDependencyData extends PomDependencyMgt {
private final Element depElement;
PomDependencyData(Element depElement) {
super(depElement);
this.depElement = depElement;
}
public String getScope() {
String val = getFirstChildText(depElement , SCOPE);
if (val == null) {
return "compile";
} else {
return replaceProps(val);
}
}
public String getClassifier() {
String val = getFirstChildText(depElement , CLASSIFIER);
return replaceProps(val);
}
public boolean isOptional() {
return getFirstChildElement(depElement, OPTIONAL) != null;
}
public List /*<ModuleId>*/ getExcludedModules() {
Element exclusionsElement = getFirstChildElement(depElement, EXCLUSIONS);
LinkedList exclusions = new LinkedList();
if (exclusionsElement != null) {
NodeList childs = exclusionsElement.getChildNodes();
for (int i = 0; i < childs.getLength(); i++) {
Node node = childs.item(i);
if (node instanceof Element && EXCLUSION.equals(node.getNodeName())) {
String groupId = getFirstChildText((Element) node, GROUP_ID);
String arteficatId = getFirstChildText((Element) node, ARTIFACT_ID);
exclusions.add(ModuleId.newInstance(groupId, arteficatId));
}
}
}
return exclusions;
}
}
/**
* @return the content of the properties tag into the pom.
*/
public Map/* <String,String> */getPomProperties() {
Map pomProperties = new HashMap();
Element propsEl = getFirstChildElement(projectElement, PROPERTIES);
if (propsEl != null) {
propsEl.normalize();
}
for (Iterator it = getAllChilds(propsEl).iterator(); it.hasNext();) {
Element prop = (Element) it.next();
pomProperties.put(prop.getNodeName(), getTextContent(prop));
}
// add default Maven properties
pomProperties.put("groupId", getGroupId());
pomProperties.put("artifactId", getArtifactId());
pomProperties.put("version", getVersion());
pomProperties.put("pom.groupId", getGroupId());
pomProperties.put("pom.artifactId", getArtifactId());
pomProperties.put("pom.version", getVersion());
pomProperties.put("parent.groupId", getParentGroupId());
pomProperties.put("parent.artifactId", getParentArtifactId());
pomProperties.put("parent.version", getParentVersion());
pomProperties.put("pom.parent.groupId", getParentGroupId());
pomProperties.put("pom.parent.artifactId", getParentArtifactId());
pomProperties.put("pom.parent.version", getParentVersion());
return pomProperties;
}
private String replaceProps(String val) {
if (val == null) {
return null;
} else {
return IvyPatternHelper.substituteVariables(val, properties).trim();
}
}
private static String getTextContent(Element element) {
StringBuffer result = new StringBuffer();
NodeList childNodes = element.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node child = childNodes.item(i);
switch (child.getNodeType()) {
case Node.CDATA_SECTION_NODE:
case Node.TEXT_NODE:
result.append(child.getNodeValue());
break;
}
}
return result.toString();
}
private static String getFirstChildText(Element parentElem, String name) {
Element node = getFirstChildElement(parentElem, name);
if (node != null) {
return getTextContent(node);
} else {
return null;
}
}
private static Element getFirstChildElement(Element parentElem, String name) {
if (parentElem == null) {
return null;
}
NodeList childs = parentElem.getChildNodes();
for (int i = 0; i < childs.getLength(); i++) {
Node node = childs.item(i);
if (node instanceof Element && name.equals(node.getNodeName())) {
return (Element) node;
}
}
return null;
}
private static List/* <Element> */getAllChilds(Element parent) {
List r = new LinkedList();
if (parent != null) {
NodeList childs = parent.getChildNodes();
for (int i = 0; i < childs.getLength(); i++) {
Node node = childs.item(i);
if (node instanceof Element) {
r.add(node);
}
}
}
return r;
}
}
was:
There are a bunch of issues (IVY-512, IVY-550, IVY-620, IVY-637) that are makred fixed that not fixed. The attached file will actually fix these issues.
> Parsing of m2 pom does not handle properties correctly.
> -------------------------------------------------------
>
> Key: IVY-900
> URL: https://issues.apache.org/jira/browse/IVY-900
> Project: Ivy
> Issue Type: Bug
> Components: Core
> Affects Versions: 2.0.0-beta-2
> Reporter: Kevin Brockhoff
>
> There are a bunch of issues (IVY-512, IVY-550, IVY-620, IVY-637) that are makred fixed that not fixed. The attached file will actually fix these issues.
> /*
> * 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.
> *
> */
> package org.apache.ivy.plugins.parser.m2;
> import java.io.IOException;
> import java.net.URL;
> import java.util.HashMap;
> import java.util.Iterator;
> import java.util.LinkedList;
> import java.util.List;
> import java.util.Map;
> import org.apache.ivy.core.IvyPatternHelper;
> import org.apache.ivy.core.module.id.ModuleId;
> import org.apache.ivy.core.module.id.ModuleRevisionId;
> import org.apache.ivy.plugins.repository.Resource;
> import org.apache.ivy.util.XMLHelper;
> import org.w3c.dom.Document;
> import org.w3c.dom.Element;
> import org.w3c.dom.Node;
> import org.w3c.dom.NodeList;
> import org.xml.sax.SAXException;
> import org.xml.sax.SAXParseException;
> /**
> * Provides the method to read some data out of the DOM tree of a pom
> * file.
> */
> public class PomReader {
>
> private static final String PACKAGING = "packaging";
> private static final String DEPENDENCY = "dependency";
> private static final String DEPENDENCIES = "dependencies";
> private static final String DEPENDENCY_MGT = "dependencyManagement";
> private static final String PROJECT = "project";
> private static final String GROUP_ID = "groupId";
> private static final String ARTIFACT_ID = "artifactId";
> private static final String VERSION = "version";
> private static final String PARENT = "parent";
> private static final String SCOPE = "scope";
> private static final String CLASSIFIER = "classifier";
> private static final String OPTIONAL = "optional";
> private static final String EXCLUSIONS = "exclusions";
> private static final String EXCLUSION = "exclusion";
> private static final String DISTRIBUTION_MGT = "distributionManagement";
> private static final String RELOCATION = "relocation";
> private static final String PROPERTIES = "properties";
>
>
>
> private HashMap properties = new HashMap();
>
> private final Element projectElement;
> private final Element parentElement;
>
> public PomReader(URL descriptorURL, Resource res) throws IOException, SAXException {
> Document pomDomDoc = XMLHelper.parseToDom(descriptorURL, res);
> projectElement = pomDomDoc.getDocumentElement();
> if (!PROJECT.equals(projectElement.getNodeName())) {
> throw new SAXParseException("project must be the root tag" , res.getName() ,
> res.getName(), 0, 0);
> }
> parentElement = getFirstChildElement(projectElement , PARENT);
> properties.putAll(getPomProperties());
> }
> public boolean hasParent() {
> return parentElement != null;
> }
>
> /**
> * Add a property if not yet set and value is not null.
> * This garantee that property keep the first value that is put on it and that the properties
> * are never null.
> */
> public void setProperty(String prop, String val) {
> if (!properties.containsKey(prop) && val != null) {
> properties.put(prop, val);
> }
> }
>
> public String getGroupId() {
> String groupId = getFirstChildText(projectElement , GROUP_ID);
> if (groupId == null) {
> groupId = getFirstChildText(parentElement, GROUP_ID);
> }
> return replaceProps(groupId);
> }
> public String getParentGroupId() {
> String groupId = getFirstChildText(parentElement , GROUP_ID);
> if (groupId == null) {
> groupId = getFirstChildText(projectElement, GROUP_ID);
> }
> return replaceProps(groupId);
> }
>
> public String getArtifactId() {
> String val = getFirstChildText(projectElement , ARTIFACT_ID);
> if (val == null) {
> val = getFirstChildText(parentElement, ARTIFACT_ID);
> }
> return replaceProps(val);
> }
> public String getParentArtifactId() {
> String val = getFirstChildText(parentElement , ARTIFACT_ID);
> if (val == null) {
> val = getFirstChildText(projectElement, ARTIFACT_ID);
> }
> return replaceProps(val);
> }
> public String getVersion() {
> String val = getFirstChildText(projectElement , VERSION);
> if (val == null) {
> val = getFirstChildText(parentElement, VERSION);
> }
> return replaceProps(val);
> }
> public String getParentVersion() {
> String val = getFirstChildText(parentElement , VERSION);
> if (val == null) {
> val = getFirstChildText(projectElement, VERSION);
> }
> return replaceProps(val);
> }
>
> public String getPackaging() {
> String val = getFirstChildText(projectElement , PACKAGING);
> if (val == null) {
> val = "jar";
> }
> return val;
> }
>
> public ModuleRevisionId getRelocation() {
> Element distrMgt = getFirstChildElement(projectElement, DISTRIBUTION_MGT);
> Element relocation = getFirstChildElement(distrMgt , RELOCATION);
> if (relocation == null) {
> return null;
> } else {
> String relocGroupId = getFirstChildText(relocation, GROUP_ID);
> String relocArtId = getFirstChildText(relocation, ARTIFACT_ID);
> String relocVersion = getFirstChildText(relocation, VERSION);
> relocGroupId = relocGroupId == null ? getGroupId() : relocGroupId;
> relocArtId = relocArtId == null ? getArtifactId() : relocArtId;
> relocVersion = relocVersion == null ? getVersion() : relocVersion;
> return ModuleRevisionId.newInstance(relocGroupId, relocArtId, relocVersion);
> }
> }
>
> public List /* <PomDependencyData> */ getDependencies() {
> Element dependenciesElement = getFirstChildElement(projectElement, DEPENDENCIES);
> LinkedList dependencies = new LinkedList();
> if (dependenciesElement != null) {
> NodeList childs = dependenciesElement.getChildNodes();
> for (int i = 0; i < childs.getLength(); i++) {
> Node node = childs.item(i);
> if (node instanceof Element && DEPENDENCY.equals(node.getNodeName())) {
> dependencies.add(new PomDependencyData((Element) node));
> }
> }
> }
> return dependencies;
> }
>
> public List /* <PomDependencyMgt> */ getDependencyMgt() {
> Element dependenciesElement = getFirstChildElement(projectElement, DEPENDENCY_MGT);
> dependenciesElement = getFirstChildElement(dependenciesElement, DEPENDENCIES);
> LinkedList dependencies = new LinkedList();
> if (dependenciesElement != null) {
> NodeList childs = dependenciesElement.getChildNodes();
> for (int i = 0; i < childs.getLength(); i++) {
> Node node = childs.item(i);
> if (node instanceof Element && DEPENDENCY.equals(node.getNodeName())) {
> dependencies.add(new PomDependencyMgt((Element) node));
> }
> }
> }
> return dependencies;
> }
>
> public class PomDependencyMgt {
> private final Element depElement;
>
> PomDependencyMgt(Element depElement) {
> this.depElement = depElement;
> }
>
> public String getGroupId() {
> String val = getFirstChildText(depElement , GROUP_ID);
> return replaceProps(val);
> }
> public String getArtifaceId() {
> String val = getFirstChildText(depElement , ARTIFACT_ID);
> return replaceProps(val);
> }
> public String getVersion() {
> String val = getFirstChildText(depElement , VERSION);
> return replaceProps(val);
> }
>
> }
>
>
> public class PomDependencyData extends PomDependencyMgt {
> private final Element depElement;
> PomDependencyData(Element depElement) {
> super(depElement);
> this.depElement = depElement;
> }
>
> public String getScope() {
> String val = getFirstChildText(depElement , SCOPE);
> if (val == null) {
> return "compile";
> } else {
> return replaceProps(val);
> }
> }
>
> public String getClassifier() {
> String val = getFirstChildText(depElement , CLASSIFIER);
> return replaceProps(val);
> }
> public boolean isOptional() {
> return getFirstChildElement(depElement, OPTIONAL) != null;
> }
>
> public List /*<ModuleId>*/ getExcludedModules() {
> Element exclusionsElement = getFirstChildElement(depElement, EXCLUSIONS);
> LinkedList exclusions = new LinkedList();
> if (exclusionsElement != null) {
> NodeList childs = exclusionsElement.getChildNodes();
> for (int i = 0; i < childs.getLength(); i++) {
> Node node = childs.item(i);
> if (node instanceof Element && EXCLUSION.equals(node.getNodeName())) {
> String groupId = getFirstChildText((Element) node, GROUP_ID);
> String arteficatId = getFirstChildText((Element) node, ARTIFACT_ID);
> exclusions.add(ModuleId.newInstance(groupId, arteficatId));
> }
> }
> }
> return exclusions;
> }
> }
>
> /**
> * @return the content of the properties tag into the pom.
> */
> public Map/* <String,String> */getPomProperties() {
> Map pomProperties = new HashMap();
> Element propsEl = getFirstChildElement(projectElement, PROPERTIES);
> if (propsEl != null) {
> propsEl.normalize();
> }
> for (Iterator it = getAllChilds(propsEl).iterator(); it.hasNext();) {
> Element prop = (Element) it.next();
> pomProperties.put(prop.getNodeName(), getTextContent(prop));
> }
> // add default Maven properties
> pomProperties.put("groupId", getGroupId());
> pomProperties.put("artifactId", getArtifactId());
> pomProperties.put("version", getVersion());
> pomProperties.put("pom.groupId", getGroupId());
> pomProperties.put("pom.artifactId", getArtifactId());
> pomProperties.put("pom.version", getVersion());
> pomProperties.put("parent.groupId", getParentGroupId());
> pomProperties.put("parent.artifactId", getParentArtifactId());
> pomProperties.put("parent.version", getParentVersion());
> pomProperties.put("pom.parent.groupId", getParentGroupId());
> pomProperties.put("pom.parent.artifactId", getParentArtifactId());
> pomProperties.put("pom.parent.version", getParentVersion());
>
> return pomProperties;
> }
>
>
> private String replaceProps(String val) {
> if (val == null) {
> return null;
> } else {
> return IvyPatternHelper.substituteVariables(val, properties).trim();
> }
> }
> private static String getTextContent(Element element) {
> StringBuffer result = new StringBuffer();
>
> NodeList childNodes = element.getChildNodes();
> for (int i = 0; i < childNodes.getLength(); i++) {
> Node child = childNodes.item(i);
>
> switch (child.getNodeType()) {
> case Node.CDATA_SECTION_NODE:
> case Node.TEXT_NODE:
> result.append(child.getNodeValue());
> break;
> }
> }
>
> return result.toString();
> }
>
> private static String getFirstChildText(Element parentElem, String name) {
> Element node = getFirstChildElement(parentElem, name);
> if (node != null) {
> return getTextContent(node);
> } else {
> return null;
> }
> }
> private static Element getFirstChildElement(Element parentElem, String name) {
> if (parentElem == null) {
> return null;
> }
> NodeList childs = parentElem.getChildNodes();
> for (int i = 0; i < childs.getLength(); i++) {
> Node node = childs.item(i);
> if (node instanceof Element && name.equals(node.getNodeName())) {
> return (Element) node;
> }
> }
> return null;
> }
>
> private static List/* <Element> */getAllChilds(Element parent) {
> List r = new LinkedList();
> if (parent != null) {
> NodeList childs = parent.getChildNodes();
> for (int i = 0; i < childs.getLength(); i++) {
> Node node = childs.item(i);
> if (node instanceof Element) {
> r.add(node);
> }
> }
> }
> return r;
> }
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.