blob: d1cd6b73ca021f8ac2773bec18ef76000d1c1b7a [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.List;
import java.util.Set;
import org.netbeans.modules.projectimport.eclipse.core.Workspace.Variable;
import org.netbeans.modules.projectimport.eclipse.core.spi.Facets;
import org.openide.util.Utilities;
import org.openide.xml.XMLUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* Parses given project's .project file and fills up the project with found
* data.
*
* @author mkrauskopf
*/
final class ProjectParser {
public static String parse(File dotProject, Set<String> natures, List<Link> links, Set<Variable> variables) throws IOException {
Document dotProjectXml;
try {
dotProjectXml = XMLUtil.parse(new InputSource(Utilities.toURI(dotProject).toString()), false, true, XMLUtil.defaultErrorHandler(), null);
} catch (SAXException e) {
IOException ioe = (IOException) new IOException(dotProject + ": " + e.toString()).initCause(e); // NOI18N
throw ioe;
}
Element projectDescriptionEl = dotProjectXml.getDocumentElement();
if (!"projectDescription".equals(projectDescriptionEl.getLocalName())) { // NOI18N
throw new IllegalStateException("given file is not eclipse .project file"); // NOI18N
}
Element naturesEl = XMLUtil.findElement(projectDescriptionEl, "natures", null); // NOI18N
if (naturesEl != null) {
List<Element> natureEls = XMLUtil.findSubElements(naturesEl);
if (natureEls != null) {
for (Element nature : natureEls) {
natures.add(nature.getTextContent());
}
}
}
Element linksEl = XMLUtil.findElement(projectDescriptionEl, "linkedResources", null); // NOI18N
if (linksEl != null) {
List<Element> linkEls = XMLUtil.findSubElements(linksEl);
if (linkEls != null) {
for (Element link : linkEls) {
Element locationElement = XMLUtil.findElement(link, "location", null); // NOI18N
String loc;
if (locationElement == null) {
assert XMLUtil.findElement(link, "locationURI", null) != null : XMLUtil.findSubElements(link); // NOI18N
// XXX external source root can be defined using IDE variable. For some reason (in Eclipse)
// these variables are stored/managed separately from variables which can be used
// in classpath. For now these variables are not transfer to NetBeans and normalized
// path will be returned instead.
loc = resolveLink(XMLUtil.findElement(link, "locationURI", null).getTextContent(), variables); // NOI18N
} else {
loc = locationElement.getTextContent();
}
links.add(new Link(XMLUtil.findElement(link, "name", null).getTextContent(), // NOI18N
"1".equals(XMLUtil.findElement(link, "type", null).getTextContent()), // NOI18N
loc));
}
}
}
return XMLUtil.findElement(projectDescriptionEl, "name", null).getTextContent(); //NOI18N
}
public static Facets readProjectFacets(File projectDir, Set<String> natures) throws IOException {
if (!natures.contains("org.eclipse.wst.common.project.facet.core.nature")) { // NOI18N
return null;
}
File f = new File(projectDir, ".settings/org.eclipse.wst.common.project.facet.core.xml"); // NOI18N
if (!f.exists()) {
return null;
}
Document doc;
try {
doc = XMLUtil.parse(new InputSource(Utilities.toURI(f).toString()), false, true, XMLUtil.defaultErrorHandler(), null);
} catch (SAXException e) {
IOException ioe = (IOException) new IOException(f + ": " + e.toString()).initCause(e); // NOI18N
throw ioe;
}
Element root = doc.getDocumentElement();
if (!"faceted-project".equals(root.getLocalName())) { // NOI18N
return null;
}
List<Facets.Facet> facets = new ArrayList<Facets.Facet>();
List<Element> elements = XMLUtil.findSubElements(root);
for (Element element : elements) {
if (!"installed".equals(element.getNodeName())) { // NOI18N
continue;
}
String facet = element.getAttribute("facet"); // NOI18N
String version = element.getAttribute("version"); // NOI18N
if (facet != null && version != null) {
facets.add(new Facets.Facet(facet, version));
}
}
return new Facets(facets);
}
private static String resolveLink(String location, Set<Variable> vars) {
/*
<link>
<name>classes-webapp5</name>
<type>2</type>
<locationURI>SOME_ROOT/WebApplication5/build/web/WEB-INF/classes</locationURI>
</link>
*/
//
// environment variable are stored in
// .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs
// which in this case would contain property:
// pathvariable.SOME_ROOT=/home/david/projs
for (Variable v : vars) {
if (location.startsWith(v.getName())) {
return v.getLocation() + location.substring(v.getName().length());
}
}
return location;
}
}