blob: 5db0ccfd2d7586090fce8ec95c9e568631fb01bc [file] [log] [blame]
/* Copyright (c) 2000 The Apache Software Foundation */
package org.apache.tools.ant.xml;
import java.io.*;
import java.net.*;
import java.util.*;
import javax.xml.parsers.*;
import org.apache.tools.ant.*;
import org.xml.sax.*;
/**
* This class knows how to locate xml project files
* and import them into the workspace.
*/
public class XmlImporter implements Importer {
private URL[] path;
/**
* Constructs an importer for a workspace.
*/
public XmlImporter() {
this.path = getProjectPath();
}
/**
* Imports the project with the specified name.
*/
public void importProject(Project project) throws BuildException {
// Locate the project file
URLConnection conn = findProjectFile(project);
// Parse the xml
parseProjectFile(project, conn);
}
/**
* Find the .ant file for this project. Searches each directory and
* jar in the project path.
*/
private URLConnection findProjectFile(Project project) throws BuildException {
String fileName = project.getName() + ".ant";
for (int i = 0; i < path.length; i++) {
try {
URL url = new URL(path[i], fileName);
URLConnection conn = url.openConnection();
conn.connect();
project.setBase(path[i]);
project.setLocation(url.toString());
return conn;
}
catch(FileNotFoundException exc) {
// The file ins't in this directory/jar, keep looking
}
catch(IOException exc) {
// Not sure what to do here...
exc.printStackTrace();
}
}
throw new BuildException("Project \"" + project.getName() + "\" not found");
}
/**
* Parse the xml file.
*/
private void parseProjectFile(Project project, URLConnection conn) throws BuildException {
ProjectHandler handler = new ProjectHandler(project);
try {
InputSource source = new InputSource(conn.getInputStream());
source.setPublicId(conn.getURL().toString());
SAXParser parser = parserFactory.newSAXParser();
/* parser.getXMLReader().setProperty("http://xml.org/sax/properties/lexical-handler", handler); */
parser.parse(source, handler);
}
catch(SAXParseException exc) {
if (exc.getException() instanceof BuildException) {
throw (BuildException) exc.getException();
}
throw new BuildException(exc.getMessage(), exc.getPublicId() + ":" + exc.getLineNumber());
}
catch(SAXException exc) {
if (exc.getException() instanceof BuildException) {
throw (BuildException) exc.getException();
}
else {
throw new AntException("Parse error", exc);
}
}
catch(ParserConfigurationException exc) {
throw new AntException("Parser configuration error", exc);
}
catch(FileNotFoundException exc) {
// This should never happen, since conn.connect()
// has already been called successfully
throw new AntException("Project file not found", exc);
}
catch(IOException exc) {
throw new AntException("Error reading project file", exc);
}
return;
}
/**
* Parses the project path (specified using the "ant.project.path"
* system propertyinto URL objects.
*/
private static URL[] getProjectPath() {
String s = System.getProperty("ant.project.path", ".");
StringTokenizer tokens = new StringTokenizer(s, System.getProperty("path.separator"));
int i = 0;
URL[] path = new URL[tokens.countTokens()];
while (tokens.hasMoreTokens()) {
String token = tokens.nextToken();
try {
if (token.endsWith(".jar")) {
path[i] = new URL("jar:file:" + token + "!/");
}
else if (token.endsWith("/")) {
path[i] = new URL("file:" + token);
}
else {
path[i] = new URL("file:" + token + "/");
}
}
catch(MalformedURLException exc) {
exc.printStackTrace();
}
i++;
}
return path;
}
/**
* JAXP stuff.
*/
private static SAXParserFactory parserFactory;
static {
parserFactory = SAXParserFactory.newInstance();
parserFactory.setValidating(false);
parserFactory.setNamespaceAware(true);
}
}