blob: 7ea1704bca2432b2962085da0df3d4d7c348de21 [file] [log] [blame]
/*
* 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.netbeans.modules.projectimport.eclipse.core;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.netbeans.modules.projectimport.eclipse.core.spi.DotClassPathEntry;
import org.openide.util.Utilities;
import org.openide.xml.XMLUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* Parses a content of the .classpath file.
*
* @author mkrauskopf
*/
final class DotClassPathParser {
private DotClassPathParser() {/* empty constructor */}
public static DotClassPath parse(File dotClasspath, List<Link> links) throws IOException {
Document dotClasspathXml;
try {
dotClasspathXml = XMLUtil.parse(new InputSource(Utilities.toURI(dotClasspath).toString()), false, true, XMLUtil.defaultErrorHandler(), null);
} catch (SAXException e) {
IOException ioe = (IOException) new IOException(dotClasspath + ": " + e.toString()).initCause(e); //NOI18N
throw ioe;
}
Element classpathEl = dotClasspathXml.getDocumentElement();
if (!"classpath".equals(classpathEl.getLocalName())) { // NOI18N
return empty();
}
List<Element> classpathEntryEls;
try {
classpathEntryEls = XMLUtil.findSubElements(classpathEl);
} catch (IllegalArgumentException x) {
throw new IOException(x);
}
if (classpathEntryEls == null) {
return empty();
}
// accessrules are ignored as they are not supported in NB anyway, eg:
/*
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
<accessrules>
<accessrule kind="accessible" pattern="com/sun/management/*"/>
<accessrule kind="nonaccessible" pattern="com/sun/**"/>
</accessrules>
</classpathentry>
*/
List<DotClassPathEntry> classpath = new ArrayList<DotClassPathEntry>();
List<DotClassPathEntry> sources = new ArrayList<DotClassPathEntry>();
DotClassPathEntry output = null;
DotClassPathEntry jre = null;
for (Element classpathEntry : classpathEntryEls) {
Map<String, String> props = new HashMap<String, String>();
NamedNodeMap attrs = classpathEntry.getAttributes();
String linkName = null;
for (int i=0; i <attrs.getLength(); i++) {
Node n = attrs.item(i);
String key = n.getNodeName();
String value = classpathEntry.getAttribute(n.getNodeName());
if (DotClassPathEntry.ATTRIBUTE_PATH.equals(key)) {
String resolvedLink = resolveLink(value, links);
if (resolvedLink != null) {
linkName = value;
value = resolvedLink;
}
}
props.put(key, value);
}
Element entryAttrs = XMLUtil.findElement(classpathEntry, "attributes", null); //NOI18N
if (entryAttrs != null) {
/*
<classpathentry kind="lib" path="/home/dev/hibernate-annotations-3.3.1.GA/lib/hibernate-commons-annotations.jar" sourcepath="/home/dev/hibernate-annotations-3.3.1.GA/src">
<attributes>
<attribute name="javadoc_location" value="file:/home/dev/hibernate-annotations-3.3.1.GA/doc/api/"/>
</attributes>
</classpathentry>
*/
List<Element> attrsList = XMLUtil.findSubElements(entryAttrs);
if (attrsList != null) {
for (Element e : attrsList) {
props.put(e.getAttribute("name"), e.getAttribute("value")); //NOI18N
}
}
}
DotClassPathEntry entry = new DotClassPathEntry(props, linkName);
if (entry.getKind() == DotClassPathEntry.Kind.SOURCE) {
sources.add(entry);
} else if (entry.getKind() == DotClassPathEntry.Kind.OUTPUT) {
assert output == null : "there should be always just one default output"; //NOI18N
output = entry;
} else if (entry.getKind() == DotClassPathEntry.Kind.CONTAINER &&
entry.getRawPath().startsWith(Workspace.DEFAULT_JRE_CONTAINER)) {
jre = entry;
} else {
classpath.add(entry);
}
}
return new DotClassPath(classpath, sources, output, jre);
}
static DotClassPath empty() {
return new DotClassPath(new ArrayList<DotClassPathEntry>(), new ArrayList<DotClassPathEntry>(), null, null);
}
private static String resolveLink(String value, List<Link> links) {
String[] v = EclipseUtils.splitVariable(value);
for (Link l : links) {
if (l.getName().equals(v[0])) {
return l.getLocation() + v[1];
}
}
return null;
}
}