|
|
@@ -1,307 +0,0 @@ |
|
|
|
// ------------------------------------------------------------------------------- |
|
|
|
// Copyright (c)2000 Apache Software Foundation |
|
|
|
// ------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
package org.apache.ant; |
|
|
|
|
|
|
|
import java.io.*; |
|
|
|
import java.util.*; |
|
|
|
import javax.xml.parsers.*; |
|
|
|
import org.xml.sax.*; |
|
|
|
|
|
|
|
/** |
|
|
|
* Helper class to build Project object trees. |
|
|
|
* |
|
|
|
* XXX right now this class only deals with the primary levels (project/target/task) |
|
|
|
* and nothing else. Also, it only supports attributes.... |
|
|
|
* |
|
|
|
* @author James Duncan Davidson (duncan@apache.org) |
|
|
|
*/ |
|
|
|
public class ProjectBuilder { |
|
|
|
|
|
|
|
// ----------------------------------------------------------------- |
|
|
|
// PRIVATE MEMBERS |
|
|
|
// ----------------------------------------------------------------- |
|
|
|
|
|
|
|
/** |
|
|
|
* |
|
|
|
*/ |
|
|
|
private AntFrontEnd frontEnd; |
|
|
|
|
|
|
|
/** |
|
|
|
* |
|
|
|
*/ |
|
|
|
private SAXParserFactory parserFactory; |
|
|
|
|
|
|
|
/** |
|
|
|
* |
|
|
|
*/ |
|
|
|
private TaskManager taskManager; |
|
|
|
|
|
|
|
// ----------------------------------------------------------------- |
|
|
|
// CONSTRUCTORS |
|
|
|
// ----------------------------------------------------------------- |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Creates a new project builder that will build projects for the given |
|
|
|
* Ant. |
|
|
|
*/ |
|
|
|
public ProjectBuilder(AntFrontEnd frontEnd) { |
|
|
|
this.frontEnd = frontEnd; |
|
|
|
taskManager = new TaskManager(frontEnd); |
|
|
|
parserFactory = SAXParserFactory.newInstance(); |
|
|
|
parserFactory.setValidating(false); |
|
|
|
} |
|
|
|
|
|
|
|
// ----------------------------------------------------------------- |
|
|
|
// PUBLIC METHODS |
|
|
|
// ----------------------------------------------------------------- |
|
|
|
|
|
|
|
/** |
|
|
|
* Builds a project from the given file. |
|
|
|
*/ |
|
|
|
public Project buildFromFile(File file) throws AntException { |
|
|
|
try { |
|
|
|
SAXParser parser = parserFactory.newSAXParser(); |
|
|
|
BuilderHandlerBase bhb = new BuilderHandlerBase(); |
|
|
|
bhb.setProjectFileLocation(file); |
|
|
|
parser.parse(file, bhb); |
|
|
|
Project project = bhb.getProject(); |
|
|
|
project.setFrontEnd(frontEnd); |
|
|
|
return project; |
|
|
|
} catch (ParserConfigurationException pce) { |
|
|
|
throw new AntException(pce); |
|
|
|
} catch (SAXException se) { |
|
|
|
Exception e = se.getException(); |
|
|
|
if (e != null && e instanceof AntException) { |
|
|
|
// it's one of our own thrown from inside the parser to stop it |
|
|
|
throw (AntException)e; |
|
|
|
} |
|
|
|
throw new AntException(se); |
|
|
|
} catch (IOException ioe) { |
|
|
|
throw new AntException(ioe); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Returns the TaskManager associated with this ProjectBuilder and |
|
|
|
* the projects that it builds |
|
|
|
*/ |
|
|
|
public TaskManager getTaskManager() { |
|
|
|
return taskManager; |
|
|
|
} |
|
|
|
|
|
|
|
// ----------------------------------------------------------------- |
|
|
|
// INNER CLASSES |
|
|
|
// ----------------------------------------------------------------- |
|
|
|
|
|
|
|
/** |
|
|
|
* Inner class that implements the needed SAX methods to get all the |
|
|
|
* data needed out of a build file. |
|
|
|
*/ |
|
|
|
class BuilderHandlerBase extends HandlerBase { |
|
|
|
|
|
|
|
private static final int STATE_START = 0; |
|
|
|
private static final int STATE_PROJECT = 1; |
|
|
|
private static final int STATE_TARGET = 2; |
|
|
|
private static final int STATE_TASK = 3; |
|
|
|
private static final int STATE_DESCRIPTION = 4; |
|
|
|
private static final int STATE_PROPERTY = 5; |
|
|
|
private static final int STATE_FINISHED = 99; |
|
|
|
|
|
|
|
private int state = STATE_START; |
|
|
|
|
|
|
|
private Vector tagCharDataStack = new Vector(); |
|
|
|
|
|
|
|
private Target currentTarget; |
|
|
|
private Task currentTask; |
|
|
|
|
|
|
|
Project project = new Project(frontEnd, taskManager); |
|
|
|
|
|
|
|
Project getProject() { |
|
|
|
return project; |
|
|
|
} |
|
|
|
|
|
|
|
void setProjectFileLocation(File file) { |
|
|
|
project.setBaseDir(file.getParentFile()); |
|
|
|
} |
|
|
|
|
|
|
|
public void startElement(String name, AttributeList atts) throws SAXException { |
|
|
|
|
|
|
|
StringBuffer tagCharData = new StringBuffer(); |
|
|
|
tagCharDataStack.insertElementAt(tagCharData, 0); |
|
|
|
|
|
|
|
switch (state) { |
|
|
|
|
|
|
|
case STATE_START: |
|
|
|
if (name.equals("project")) { |
|
|
|
state = STATE_PROJECT; |
|
|
|
String projectName = atts.getValue("name"); |
|
|
|
if (projectName != null) { |
|
|
|
project.setName(projectName); |
|
|
|
} else { |
|
|
|
String msg = "Project element doesn't contain a name attribute"; |
|
|
|
AntException ae = new AntException(msg); |
|
|
|
throw new SAXException(ae); |
|
|
|
} |
|
|
|
String defaultTarget = atts.getValue("default"); |
|
|
|
if (defaultTarget != null) { |
|
|
|
project.setDefaultTargetName(defaultTarget); |
|
|
|
} |
|
|
|
String baseDirName = atts.getValue("basedir"); |
|
|
|
if (baseDirName != null) { |
|
|
|
// XXX need to check to see if base dir exists |
|
|
|
project.setBaseDir(new File(baseDirName)); |
|
|
|
} |
|
|
|
} else { |
|
|
|
String msg = "Project file doesn't contain a project element as " + |
|
|
|
"its root node"; |
|
|
|
AntException ae = new AntException(msg); |
|
|
|
throw new SAXException(ae); |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
case STATE_PROJECT: |
|
|
|
|
|
|
|
// valid tags in a project object are: description, property, and target |
|
|
|
|
|
|
|
if (name.equals("description")) { |
|
|
|
state = STATE_DESCRIPTION; |
|
|
|
} else if (name.equals("property")) { |
|
|
|
state = STATE_PROPERTY; |
|
|
|
String propertyName = atts.getValue("name"); |
|
|
|
String propertyValue = atts.getValue("value"); |
|
|
|
if (propertyName == null) { |
|
|
|
String msg = "Name attribute must be present on property"; |
|
|
|
AntException ae = new AntException(msg); |
|
|
|
throw new SAXException(ae); |
|
|
|
} else if (propertyValue == null) { |
|
|
|
String msg = "Value attribute must be present on property"; |
|
|
|
AntException ae = new AntException(msg); |
|
|
|
throw new SAXException(ae); |
|
|
|
} else { |
|
|
|
project.setProperty(propertyName, propertyValue); |
|
|
|
} |
|
|
|
} else if (name.equals("target")) { |
|
|
|
state = STATE_TARGET; |
|
|
|
String targetName = atts.getValue("name"); |
|
|
|
if (targetName != null) { |
|
|
|
currentTarget = new Target(targetName); |
|
|
|
project.addTarget(currentTarget); |
|
|
|
} else { |
|
|
|
// XXX figure out which target we're talking about! |
|
|
|
// Like a location |
|
|
|
String msg = "Target element doesn't contain a name attribute"; |
|
|
|
AntException ae = new AntException(msg); |
|
|
|
throw new SAXException(ae); |
|
|
|
} |
|
|
|
String depends = atts.getValue("depends"); |
|
|
|
if (depends != null) { |
|
|
|
StringTokenizer tok = new StringTokenizer(depends, ",", false); |
|
|
|
while(tok.hasMoreTokens()) { |
|
|
|
currentTarget.addDependancy(tok.nextToken().trim()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// XXX add dependency checks |
|
|
|
} else { |
|
|
|
System.out.println("Expecting target, got: " + name); |
|
|
|
// XXX exception out |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
case STATE_TARGET: |
|
|
|
|
|
|
|
// Valid tags inside target: task |
|
|
|
|
|
|
|
state = STATE_TASK; |
|
|
|
//System.out.println("Getting task: " + name + " for target " + |
|
|
|
// currentTarget); |
|
|
|
// XXX need to validate that task type (name) exists in system |
|
|
|
// else exception out. |
|
|
|
currentTask = new Task(name); |
|
|
|
currentTarget.addTask(currentTask); |
|
|
|
for (int i = 0; i < atts.getLength(); i++) { |
|
|
|
String atName = atts.getName(i); |
|
|
|
String atValue = atts.getValue(i); |
|
|
|
currentTask.addAttribute(atName, atValue); |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
case STATE_TASK: |
|
|
|
|
|
|
|
// data in here needs to be reflected into tasks |
|
|
|
|
|
|
|
System.out.println("Not yet supporting tags inside of tasks!"); |
|
|
|
System.out.println("The project build will probably bust right here"); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
System.out.println("I'm not sure, but we're off base here: " + name); |
|
|
|
// XXX exception out |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public void characters(char ch[], int start, int length) throws SAXException { |
|
|
|
StringBuffer buf = (StringBuffer)tagCharDataStack.elementAt(0); |
|
|
|
buf.append(ch, start, length); |
|
|
|
} |
|
|
|
|
|
|
|
public void endElement(String name) throws SAXException { |
|
|
|
|
|
|
|
StringBuffer elementData = (StringBuffer)tagCharDataStack.elementAt(0); |
|
|
|
tagCharDataStack.removeElementAt(0); |
|
|
|
|
|
|
|
switch (state) { |
|
|
|
|
|
|
|
case STATE_TASK: |
|
|
|
state = STATE_TARGET; |
|
|
|
break; |
|
|
|
|
|
|
|
case STATE_TARGET: |
|
|
|
if (name.equals("target")) { |
|
|
|
state = STATE_PROJECT; |
|
|
|
} else { |
|
|
|
System.out.println("Expecting to get an end of target, got: " + name); |
|
|
|
// XXX exception out. |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
case STATE_DESCRIPTION: |
|
|
|
if (name.equals("description")) { |
|
|
|
state = STATE_PROJECT; |
|
|
|
project.setDescription(elementData.toString().trim()); |
|
|
|
} else { |
|
|
|
System.out.println("Expecting to get an end of description, got: " + |
|
|
|
name); |
|
|
|
// XXX exception out. |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
case STATE_PROPERTY: |
|
|
|
if (name.equals("property")) { |
|
|
|
state = STATE_PROJECT; |
|
|
|
} else { |
|
|
|
System.out.println("Expecting to get end of property, got: " + name); |
|
|
|
// XXX exception out |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
case STATE_PROJECT: |
|
|
|
if (name.equals("project")) { |
|
|
|
state = STATE_FINISHED; |
|
|
|
} else { |
|
|
|
System.out.println("Expecting to get end of project, got: " + name); |
|
|
|
// XXX exception out; |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
System.out.println("I'm not sure what we are ending here: " + name); |
|
|
|
// XXX exception out; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |