You are viewing a plain text version of this content. The canonical link for it is here.
Posted to easyant-commits@incubator.apache.org by hi...@apache.org on 2011/02/17 17:01:56 UTC

svn commit: r1071697 [20/42] - in /incubator/easyant: buildtypes/ buildtypes/trunk/ buildtypes/trunk/build-osgi-bundle-java/ buildtypes/trunk/build-osgi-bundle-java/src/ buildtypes/trunk/build-osgi-bundle-java/src/main/ buildtypes/trunk/build-osgi-bund...

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/report/XMLEasyAntReportWriter.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/report/XMLEasyAntReportWriter.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/report/XMLEasyAntReportWriter.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/report/XMLEasyAntReportWriter.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,586 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.report;
+
+import java.io.BufferedWriter;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.easyant.core.descriptor.PropertyDescriptor;
+import org.apache.ivy.Ivy;
+import org.apache.ivy.core.cache.ArtifactOrigin;
+import org.apache.ivy.core.module.descriptor.License;
+import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
+import org.apache.ivy.core.module.id.ModuleId;
+import org.apache.ivy.core.module.id.ModuleRevisionId;
+import org.apache.ivy.core.report.ArtifactDownloadReport;
+import org.apache.ivy.core.report.ConfigurationResolveReport;
+import org.apache.ivy.core.report.MetadataArtifactDownloadReport;
+import org.apache.ivy.core.resolve.IvyNode;
+import org.apache.ivy.core.resolve.IvyNodeCallers.Caller;
+import org.apache.ivy.core.resolve.IvyNodeEviction.EvictionData;
+import org.apache.ivy.util.Message;
+import org.apache.ivy.util.StringUtils;
+import org.apache.ivy.util.XMLHelper;
+
+/**
+ * XmlReportWriter allows to write ResolveReport in an xml format.
+ */
+public class XMLEasyAntReportWriter {
+
+	static final String REPORT_ENCODING = "UTF-8";
+	private boolean displaySubProperties;
+
+	public void output(ConfigurationResolveReport report, OutputStream stream,
+			EasyAntReport easyAntReport) {
+		output(report, new String[] { report.getConfiguration() }, stream,
+				easyAntReport);
+	}
+
+	public void output(ConfigurationResolveReport report, String[] confs,
+			OutputStream stream, EasyAntReport easyAntReport) {
+		OutputStreamWriter encodedOutStream;
+		try {
+			encodedOutStream = new OutputStreamWriter(stream, REPORT_ENCODING);
+		} catch (UnsupportedEncodingException e) {
+			throw new RuntimeException(REPORT_ENCODING
+					+ " is not known on your jvm", e);
+		}
+		PrintWriter out = new PrintWriter(new BufferedWriter(encodedOutStream));
+		ModuleRevisionId mrid = report.getModuleDescriptor()
+				.getModuleRevisionId();
+		// out.println("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>");
+		out.println("<?xml version=\"1.0\" encoding=\"" + REPORT_ENCODING
+				+ "\"?>");
+		out
+				.println("<?xml-stylesheet type=\"text/xsl\" href=\"easyant-report.xsl\"?>");
+		out.println("<ivy-report version=\"1.0\">");
+		out.println("\t<info");
+		out.println("\t\torganisation=\""
+				+ XMLHelper.escape(mrid.getOrganisation()) + "\"");
+		out.println("\t\tmodule=\"" + XMLHelper.escape(mrid.getName()) + "\"");
+		out.println("\t\trevision=\"" + XMLHelper.escape(mrid.getRevision())
+				+ "\"");
+		if (mrid.getBranch() != null) {
+			out.println("\t\tbranch=\"" + XMLHelper.escape(mrid.getBranch())
+					+ "\"");
+		}
+		Map extraAttributes = mrid.getExtraAttributes();
+		for (Iterator it = extraAttributes.entrySet().iterator(); it.hasNext();) {
+			Map.Entry entry = (Entry) it.next();
+			out.println("\t\textra-" + entry.getKey() + "=\""
+					+ XMLHelper.escape(entry.getValue().toString()) + "\"");
+		}
+		out.println("\t\tconf=\"" + XMLHelper.escape(report.getConfiguration())
+				+ "\"");
+		out.println("\t\tconfs=\""
+				+ XMLHelper.escape(StringUtils.join(confs, ", ")) + "\"");
+		out.println("\t\tdate=\"" + Ivy.DATE_FORMAT.format(report.getDate())
+				+ "\"/>");
+
+		out.println("\t<dependencies>");
+
+		// create a list of ModuleRevisionIds indicating the position for each
+		// dependency
+		List dependencies = new ArrayList(report.getModuleRevisionIds());
+
+		for (Iterator iter = report.getModuleIds().iterator(); iter.hasNext();) {
+			ModuleId mid = (ModuleId) iter.next();
+			out.println("\t\t<module organisation=\""
+					+ XMLHelper.escape(mid.getOrganisation()) + "\""
+					+ " name=\"" + XMLHelper.escape(mid.getName()) + "\" >");
+			for (Iterator it2 = report.getNodes(mid).iterator(); it2.hasNext();) {
+				IvyNode dep = (IvyNode) it2.next();
+				ouputRevision(report, out, dependencies, dep, easyAntReport);
+			}
+			out.println("\t\t</module>");
+		}
+		out.println("\t</dependencies>");
+		out.println("</ivy-report>");
+		out.flush();
+	}
+
+	private void ouputRevision(ConfigurationResolveReport report,
+			PrintWriter out, List dependencies, IvyNode dep,
+			EasyAntReport easyAntReport) {
+		Map extraAttributes;
+		ModuleDescriptor md = null;
+		if (dep.getModuleRevision() != null) {
+			md = dep.getModuleRevision().getDescriptor();
+		}
+		StringBuffer details = new StringBuffer();
+		if (dep.isLoaded()) {
+			details.append(" status=\"");
+			details.append(XMLHelper.escape(dep.getDescriptor().getStatus()));
+			details.append("\" pubdate=\"");
+			details.append(Ivy.DATE_FORMAT
+					.format(new Date(dep.getPublication())));
+			details.append("\" resolver=\"");
+			details.append(XMLHelper.escape(dep.getModuleRevision()
+					.getResolver().getName()));
+			details.append("\" artresolver=\"");
+			details.append(XMLHelper.escape(dep.getModuleRevision()
+					.getArtifactResolver().getName()));
+			details.append("\"");
+		}
+		if (dep.isEvicted(report.getConfiguration())) {
+			EvictionData ed = dep.getEvictedData(report.getConfiguration());
+			if (ed.getConflictManager() != null) {
+				details.append(" evicted=\"").append(
+						XMLHelper.escape(ed.getConflictManager().toString()))
+						.append("\"");
+			} else {
+				details.append(" evicted=\"transitive\"");
+			}
+			details.append(" evicted-reason=\"").append(
+					XMLHelper.escape(ed.getDetail() == null ? "" : ed
+							.getDetail())).append("\"");
+		}
+		if (dep.hasProblem()) {
+			details.append(" error=\"").append(
+					XMLHelper.escape(dep.getProblem().getMessage())).append(
+					"\"");
+		}
+		if (md != null && md.getHomePage() != null) {
+			details.append(" homepage=\"").append(
+					XMLHelper.escape(md.getHomePage())).append("\"");
+		}
+		extraAttributes = md != null ? md.getExtraAttributes() : dep
+				.getResolvedId().getExtraAttributes();
+		for (Iterator iterator = extraAttributes.keySet().iterator(); iterator
+				.hasNext();) {
+			String attName = (String) iterator.next();
+			details.append(" extra-").append(attName).append("=\"").append(
+					XMLHelper.escape(extraAttributes.get(attName).toString()))
+					.append("\"");
+		}
+		String defaultValue = dep.getDescriptor() != null ? " default=\""
+				+ dep.getDescriptor().isDefault() + "\"" : "";
+		int position = dependencies.indexOf(dep.getResolvedId());
+		out.println("\t\t\t<revision name=\""
+				+ XMLHelper.escape(dep.getResolvedId().getRevision())
+				+ "\""
+				+ (dep.getResolvedId().getBranch() == null ? "" : " branch=\""
+						+ XMLHelper.escape(dep.getResolvedId().getBranch())
+						+ "\"") + details + " downloaded=\""
+				+ dep.isDownloaded() + "\"" + " searched=\"" + dep.isSearched()
+				+ "\"" + defaultValue + " conf=\""
+				+ toString(dep.getConfigurations(report.getConfiguration()))
+				+ "\"" + " position=\"" + position + "\">");
+		if (md != null) {
+			License[] licenses = md.getLicenses();
+			for (int i = 0; i < licenses.length; i++) {
+				String lurl;
+				if (licenses[i].getUrl() != null) {
+					lurl = " url=\"" + XMLHelper.escape(licenses[i].getUrl())
+							+ "\"";
+				} else {
+					lurl = "";
+				}
+				out.println("\t\t\t\t<license name=\""
+						+ XMLHelper.escape(licenses[i].getName()) + "\"" + lurl
+						+ "/>");
+			}
+		}
+		if (md != null && md.getDescription() != null) {
+			out.println("\t\t\t\t<description>" + md.getDescription()
+					+ "\t\t\t\t</description>");
+		}
+		outputMetadataArtifact(out, dep);
+		outputEvictionInformation(report, out, dep);
+		outputCallers(report, out, dep);
+		outputArtifacts(report, out, dep);
+		outputEasyAntModuleInfos(report, out, dep, easyAntReport);
+		out.println("\t\t\t</revision>");
+	}
+
+	private void outputEasyAntModuleInfos(ConfigurationResolveReport report,
+			PrintWriter out, IvyNode dep, EasyAntReport easyAntReport) {
+		out.println("\t\t\t\t<easyant>");
+		// targets
+		outputTargets(report, out, dep, easyAntReport);
+		outputPhases(report, out, dep, easyAntReport);
+		outputImportedModules(report, out, dep, easyAntReport);
+		outputParameters(report, out, dep, easyAntReport);
+		outputProperties(report, out, dep, easyAntReport);
+		out.println("\t\t\t\t</easyant>");
+
+	}
+	private void outputProperties(ConfigurationResolveReport report,
+			PrintWriter out, IvyNode dep, EasyAntReport easyAntReport) {
+		out.println("\t\t\t\t\t<properties>");
+		Map<String, PropertyDescriptor> properties;
+		if (displaySubProperties)  {
+			properties = easyAntReport.getAvailableProperties();
+		} else {
+			properties = easyAntReport.getPropertyDescriptors();
+		}
+			
+		for (Entry<String, PropertyDescriptor> entry : properties.entrySet()) {
+			PropertyDescriptor propertyDescriptor = entry.getValue();
+			
+			StringBuffer param= new StringBuffer();
+			param.append("\t\t\t\t\t\t<property name=\"");
+			param.append(propertyDescriptor.getName());
+			param.append("\"");
+			if (propertyDescriptor.getDescription() != null) {
+				param.append(" description=\"");
+				param.append(propertyDescriptor.getDescription());
+				param.append("\"");
+			}
+			param.append(" required=\"");
+			param.append(propertyDescriptor.isRequired());
+			param.append("\"");
+			if (propertyDescriptor.getDefaultValue() != null) {
+				param.append(" default=\"");
+				param.append(propertyDescriptor.getDefaultValue());
+				param.append("\"");
+			}
+			if (propertyDescriptor.getValue() != null ) {
+				param.append(" value=\"");
+				param.append(propertyDescriptor.getValue());
+				param.append("\"");
+			}
+			param.append("/>");
+			out.println(param.toString());
+
+		}
+		out.println("\t\t\t\t\t</properties>");
+	}
+
+	private void outputParameters(ConfigurationResolveReport report,
+			PrintWriter out, IvyNode dep, EasyAntReport easyAntReport) {
+		out.println("\t\t\t\t\t<parameters>");
+		for (ParameterReport paramReport : easyAntReport.getParameterReports()) {
+			StringBuffer param = new StringBuffer();
+
+			if (ParameterType.PHASE.equals(paramReport.getType())) {
+				param.append("\t\t\t\t\t\t<phase name=\"");
+				param.append(paramReport.getName());
+				param.append("\"");
+				if (paramReport.getDescription() != null) {
+					param.append(" description=\"");
+					param.append(paramReport.getDescription());
+					param.append("\"");
+				}
+				param.append("/>");
+			} else if (ParameterType.PATH.equals(paramReport.getType())) {
+				param.append("\t\t\t\t\t\t<path name=\"");
+				param.append(paramReport.getName());
+				param.append("\"");
+				if (paramReport.getDescription() != null) {
+					param.append(" description=\"");
+					param.append(paramReport.getDescription());
+					param.append("\"");
+				}
+				if (paramReport.isRequired()) {
+					param.append(" required=\"");
+					param.append(paramReport.isRequired());
+					param.append("\"");
+				}
+				param.append("/>");
+			}
+			out.println(param);
+		}
+
+		out.println("\t\t\t\t\t</parameters>");
+	}
+
+	private void outputImportedModules(ConfigurationResolveReport report,
+			PrintWriter out, IvyNode dep, EasyAntReport easyAntReport) {
+		out.println("\t\t\t\t\t<imports>");
+		for (ImportedModuleReport importedModuleReport : easyAntReport.getImportedModuleReports()) {
+			StringBuffer importedModule = new StringBuffer();
+			try {
+				ModuleRevisionId mrid = ModuleRevisionId
+						.parse(importedModuleReport.getModuleMrid());
+				importedModule.append("\t\t\t\t\t\t<import organisation=\"")
+						.append(mrid.getOrganisation()).append("\" name=\"")
+						.append(mrid.getName()).append("\" revision=\"")
+						.append(mrid.getRevision()).append("\" type=\"")
+						.append(importedModuleReport.getType()).append("\"");
+
+			} catch (IllegalArgumentException e) {
+				Message.debug("Unable to parse "
+						+ importedModuleReport.getModuleMrid());
+				importedModule.append("\t\t\t\t\t\t<import organisation=\"")
+						.append(importedModuleReport.getModuleMrid()).append(
+								"\" name=\"").append("null").append(
+								"\" revision=\"").append("null").append(
+								"\" type=\"").append(
+								importedModuleReport.getType()).append("\"");
+
+			}
+			importedModule.append(" mandatory=\"");
+			importedModule.append(importedModuleReport.isMandatory());
+			importedModule.append("\"");
+			if (importedModuleReport.getAs() != null) {
+				importedModule.append(" as=\"");
+				importedModule.append(importedModuleReport.getAs());
+				importedModule.append("\"");
+			}
+			importedModule.append(">");
+			out.println(importedModule.toString());
+			if (importedModuleReport.getEasyantReport() != null) {
+				outputEasyAntModuleInfos(report, out, dep, importedModuleReport
+						.getEasyantReport());
+			}
+			out.println("\t\t\t\t\t\t</import>");
+
+		}
+		out.println("\t\t\t\t\t</imports>");
+
+	}
+
+	private void outputPhases(ConfigurationResolveReport report,
+			PrintWriter out, IvyNode dep, EasyAntReport easyAntReport) {
+		out.println("\t\t\t\t\t<phases>");
+		for (PhaseReport phaseReport : easyAntReport.getPhaseReports()) {
+			StringBuffer phase = new StringBuffer();
+			phase.append("\t\t\t\t\t\t<phase name=\"").append(
+					phaseReport.getName()).append("\"");
+			if (phaseReport.getDescription() != null) {
+				phase.append(" description=\"");
+				phase.append(phaseReport.getDescription());
+				phase.append("\"");
+			}
+			if (phaseReport.getDepends() != null) {
+				phase.append(" depends=\"");
+				phase.append(phaseReport.getDepends());
+				phase.append("\"");
+			}
+			phase.append("/>");
+			out.println(phase.toString());
+		}
+		out.println("\t\t\t\t\t</phases>");
+	}
+
+	private void outputTargets(ConfigurationResolveReport report,
+			PrintWriter out, IvyNode dep, EasyAntReport easyAntReport) {
+		out.println("\t\t\t\t\t<targets>");
+		for (TargetReport targetReport : easyAntReport.getTargetReports()) {
+			StringBuffer target = new StringBuffer();
+			target.append("\t\t\t\t\t\t<target name=\"").append(
+					targetReport.getName()).append("\"");
+			if (targetReport.getDescription() != null) {
+				target.append(" description=\"");
+				target.append(targetReport.getDescription());
+				target.append("\"");
+			}
+			if (targetReport.getDepends() != null) {
+				target.append(" depends=\"");
+				target.append(targetReport.getDepends());
+				target.append("\"");
+			}
+			if (targetReport.getIfCase() != null) {
+				target.append(" if=\"");
+				target.append(targetReport.getIfCase());
+				target.append("\"");
+			}
+			if (targetReport.getPhase() != null) {
+				target.append(" phase=\"");
+				target.append(targetReport.getPhase());
+				target.append("\"");
+			}
+			if (targetReport.getUnlessCase() != null) {
+				target.append(" unless=\"");
+				target.append(targetReport.getUnlessCase());
+				target.append("\"");
+			}
+			target.append("/>");
+			out.println(target.toString());
+		}
+		out.println("\t\t\t\t\t</targets>");
+	}
+
+	private void outputEvictionInformation(ConfigurationResolveReport report,
+			PrintWriter out, IvyNode dep) {
+		if (dep.isEvicted(report.getConfiguration())) {
+			EvictionData ed = dep.getEvictedData(report.getConfiguration());
+			Collection selected = ed.getSelected();
+			if (selected != null) {
+				for (Iterator it3 = selected.iterator(); it3.hasNext();) {
+					IvyNode sel = (IvyNode) it3.next();
+					out.println("\t\t\t\t<evicted-by rev=\""
+							+ XMLHelper.escape(sel.getResolvedId()
+									.getRevision()) + "\"/>");
+				}
+			}
+		}
+	}
+
+	private void outputMetadataArtifact(PrintWriter out, IvyNode dep) {
+		if (dep.getModuleRevision() != null) {
+			MetadataArtifactDownloadReport madr = dep.getModuleRevision()
+					.getReport();
+			out.print("\t\t\t\t<metadata-artifact");
+			out.print(" status=\""
+					+ XMLHelper.escape(madr.getDownloadStatus().toString())
+					+ "\"");
+			out.print(" details=\""
+					+ XMLHelper.escape(madr.getDownloadDetails()) + "\"");
+			out.print(" size=\"" + madr.getSize() + "\"");
+			out.print(" time=\"" + madr.getDownloadTimeMillis() + "\"");
+			if (madr.getLocalFile() != null) {
+				out.print(" location=\""
+						+ XMLHelper.escape(madr.getLocalFile()
+								.getAbsolutePath()) + "\"");
+			}
+
+			out.print(" searched=\"" + madr.isSearched() + "\"");
+			if (madr.getOriginalLocalFile() != null) {
+				out.print(" original-local-location=\""
+						+ XMLHelper.escape(madr.getOriginalLocalFile()
+								.getAbsolutePath()) + "\"");
+			}
+
+			ArtifactOrigin origin = madr.getArtifactOrigin();
+			if (origin != null) {
+				out.print(" origin-is-local=\""
+						+ String.valueOf(origin.isLocal()) + "\"");
+				out.print(" origin-location=\""
+						+ XMLHelper.escape(origin.getLocation()) + "\"");
+			}
+			out.println("/>");
+
+		}
+	}
+
+	private void outputCallers(ConfigurationResolveReport report,
+			PrintWriter out, IvyNode dep) {
+		Caller[] callers = dep.getCallers(report.getConfiguration());
+		for (int i = 0; i < callers.length; i++) {
+			StringBuffer callerDetails = new StringBuffer();
+			Map callerExtraAttributes = callers[i].getDependencyDescriptor()
+					.getExtraAttributes();
+			for (Iterator iterator = callerExtraAttributes.keySet().iterator(); iterator
+					.hasNext();) {
+				String attName = (String) iterator.next();
+				callerDetails.append(" extra-").append(attName).append("=\"")
+						.append(
+								XMLHelper.escape(callerExtraAttributes.get(
+										attName).toString())).append("\"");
+			}
+
+			out.println("\t\t\t\t<caller organisation=\""
+					+ XMLHelper.escape(callers[i].getModuleRevisionId()
+							.getOrganisation())
+					+ "\""
+					+ " name=\""
+					+ XMLHelper.escape(callers[i].getModuleRevisionId()
+							.getName())
+					+ "\""
+					+ " conf=\""
+					+ XMLHelper.escape(toString(callers[i]
+							.getCallerConfigurations()))
+					+ "\""
+					+ " rev=\""
+					+ XMLHelper.escape(callers[i].getAskedDependencyId(
+							dep.getData()).getRevision())
+					+ "\""
+					+ " rev-constraint-default=\""
+					+ XMLHelper.escape(callers[i].getDependencyDescriptor()
+							.getDependencyRevisionId().getRevision())
+					+ "\""
+					+ " rev-constraint-dynamic=\""
+					+ XMLHelper.escape(callers[i].getDependencyDescriptor()
+							.getDynamicConstraintDependencyRevisionId()
+							.getRevision())
+					+ "\""
+					+ " callerrev=\""
+					+ XMLHelper.escape(callers[i].getModuleRevisionId()
+							.getRevision()) + "\"" + callerDetails + "/>");
+		}
+	}
+
+	private void outputArtifacts(ConfigurationResolveReport report,
+			PrintWriter out, IvyNode dep) {
+		Map extraAttributes;
+		ArtifactDownloadReport[] adr = report.getDownloadReports(dep
+				.getResolvedId());
+		out.println("\t\t\t\t<artifacts>");
+		for (int i = 0; i < adr.length; i++) {
+			out.print("\t\t\t\t\t<artifact name=\""
+					+ XMLHelper.escape(adr[i].getName()) + "\" type=\""
+					+ XMLHelper.escape(adr[i].getType()) + "\" ext=\""
+					+ XMLHelper.escape(adr[i].getExt()) + "\"");
+			extraAttributes = adr[i].getArtifact().getExtraAttributes();
+			for (Iterator iterator = extraAttributes.keySet().iterator(); iterator
+					.hasNext();) {
+				String attName = (String) iterator.next();
+				out.print(" extra-"
+						+ attName
+						+ "=\""
+						+ XMLHelper.escape(extraAttributes.get(attName)
+								.toString()) + "\"");
+			}
+			out.print(" status=\""
+					+ XMLHelper.escape(adr[i].getDownloadStatus().toString())
+					+ "\"");
+			out.print(" details=\""
+					+ XMLHelper.escape(adr[i].getDownloadDetails()) + "\"");
+			out.print(" size=\"" + adr[i].getSize() + "\"");
+			out.print(" time=\"" + adr[i].getDownloadTimeMillis() + "\"");
+			if (adr[i].getLocalFile() != null) {
+				out.print(" location=\""
+						+ XMLHelper.escape(adr[i].getLocalFile()
+								.getAbsolutePath()) + "\"");
+			}
+
+			ArtifactOrigin origin = adr[i].getArtifactOrigin();
+			if (origin != null) {
+				out.println(">");
+				out.println("\t\t\t\t\t\t<origin-location is-local=\""
+						+ String.valueOf(origin.isLocal()) + "\""
+						+ " location=\""
+						+ XMLHelper.escape(origin.getLocation()) + "\"/>");
+				out.println("\t\t\t\t\t</artifact>");
+			} else {
+				out.println("/>");
+			}
+		}
+		out.println("\t\t\t\t</artifacts>");
+	}
+
+	private String toString(String[] strs) {
+		StringBuffer buf = new StringBuffer();
+		for (int i = 0; i < strs.length; i++) {
+			buf.append(strs[i]);
+			if (i + 1 < strs.length) {
+				buf.append(", ");
+			}
+		}
+		return XMLHelper.escape(buf.toString());
+	}
+
+	public void setDisplaySubProperties(boolean displaySubProperties) {
+		this.displaySubProperties= displaySubProperties;
+		
+	}
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/report/XMLEasyAntReportWriter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/report/XMLEasyAntReportWriter.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/report/XMLEasyAntReportWriter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/report/XmlEasyAntReportOutputter.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/report/XmlEasyAntReportOutputter.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/report/XmlEasyAntReportOutputter.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/report/XmlEasyAntReportOutputter.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,87 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.report;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.apache.ivy.core.cache.ResolutionCacheManager;
+import org.apache.ivy.core.report.ConfigurationResolveReport;
+import org.apache.ivy.core.report.ResolveReport;
+import org.apache.ivy.core.resolve.ResolveOptions;
+import org.apache.ivy.plugins.report.XmlReportWriter;
+import org.apache.ivy.util.FileUtil;
+import org.apache.ivy.util.Message;
+
+/**
+ * A Report outputter implementation using {@link XmlReportWriter} to write xml reports to the
+ * resolution cache.
+ */
+public class XmlEasyAntReportOutputter {
+	
+    public static final String CONSOLE = "console";
+
+    public static final String XML = "xml";
+
+    private XMLEasyAntReportWriter writer = new XMLEasyAntReportWriter();
+    
+    public String getName() {
+        return XML;
+    }
+
+    public void output(
+            ResolveReport report, ResolutionCacheManager cacheMgr, ResolveOptions options,EasyAntReport easyAntReport, boolean displaySubProperties) 
+            throws IOException {
+        String[] confs = report.getConfigurations();
+        for (int i = 0; i < confs.length; i++) {
+            output(report.getConfigurationReport(confs[i]), report.getResolveId(), confs, cacheMgr,easyAntReport,displaySubProperties);
+        }
+    }
+
+    public void output(ConfigurationResolveReport report, String resolveId, 
+            String[] confs, ResolutionCacheManager cacheMgr, EasyAntReport easyAntReport , boolean displaySubProperties) 
+            throws IOException {
+    	writer.setDisplaySubProperties(displaySubProperties);
+        File reportFile = cacheMgr.getConfigurationResolveReportInCache(
+            resolveId, report.getConfiguration());
+        File reportParentDir = reportFile.getParentFile();
+        reportParentDir.mkdirs();
+        OutputStream stream = new FileOutputStream(reportFile);
+        writer.output(report, confs, stream,easyAntReport);
+        stream.close();
+
+        Message.verbose("\treport for " + report.getModuleDescriptor().getModuleRevisionId()
+            + " " + report.getConfiguration() + " produced in " + reportFile);
+
+        File reportXsl = new File(reportParentDir, "ivy-report.xsl");
+        File reportCss = new File(reportParentDir, "ivy-report.css");
+        if (!reportXsl.exists()) {
+            FileUtil.copy(XmlEasyAntReportOutputter.class.getResource("ivy-report.xsl"), reportXsl,
+                null);
+        }
+        if (!reportCss.exists()) {
+            FileUtil.copy(XmlEasyAntReportOutputter.class.getResource("ivy-report.css"), reportCss,
+                null);
+        }
+    }
+}
+

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/report/XmlEasyAntReportOutputter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/report/XmlEasyAntReportOutputter.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/report/XmlEasyAntReportOutputter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/PluginService.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/PluginService.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/PluginService.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/PluginService.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,188 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.services;
+
+import java.io.File;
+
+import org.apache.easyant.core.descriptor.EasyAntModuleDescriptor;
+import org.apache.easyant.core.report.EasyAntReport;
+import org.apache.ivy.core.module.id.ModuleRevisionId;
+
+public interface PluginService {
+
+	/**
+	 * Generate an easyantReport for a given moduleRevisionID
+	 * 
+	 * @param moduleRevisionId
+	 *            a given moduleRevisionID
+	 * @return an easyantReport an easyantReport
+	 * @throws Exception
+	 */
+	EasyAntReport getPluginInfo(ModuleRevisionId moduleRevisionId)
+			throws Exception;
+
+	/**
+	 * Generate an easyantReport for a given string representing a plugin
+	 * moduleRevisionID mrid should be with the following format :
+	 * organisation#moduleName;revision If no organisation is specified, this
+	 * method will use the default one, then you could use the shorter form like
+	 * myPlugin;0.1
+	 * 
+	 * @param moduleRevisionId
+	 *            a given moduleRevisionID
+	 * @return an easyantReport an easyantReport
+	 * @throws Exception
+	 */
+	EasyAntReport getPluginInfo(String moduleRevisionId) throws Exception;
+
+	/**
+	 * Generate an easyantReport for a given string representing a buildtype
+	 * moduleRevisionID mrid should be with the following format :
+	 * organisation#moduleName;revision If no organisation is specified, this
+	 * method will use the default one, then you could use the shorter form like
+	 * myPlugin;0.1
+	 * 
+	 * @param moduleRevisionId
+	 *            a given moduleRevisionID
+	 * @return an easyantReport an easyantReport
+	 * @throws Exception
+	 */
+	EasyAntReport getBuildTypeInfo(String moduleRevisionId) throws Exception;
+
+	/**
+	 * Generate an easyantReport for a given moduleRevisionID
+	 * 
+	 * @param moduleRevisionId
+	 *            a given moduleRevisionID
+	 * @param conf
+	 *            a configuration name
+	 * @return an easyantReport an easyantReport
+	 * @throws Exception
+	 */
+	EasyAntReport getPluginInfo(ModuleRevisionId moduleRevisionId, String conf)
+			throws Exception;
+
+	/**
+	 * Return an array of moduleRevisionId that match with given criteria.
+	 * Equivalent to {@link #search(String, String, String, String, String, String)
+	 *   search(organisation, moduleName, null, null, PatternMatcher.EXACT_OR_REGEXP, null)}
+	 * 
+	 * @param organisation
+	 *            the organisation name
+	 * @param moduleName
+	 *            the module name
+	 * @return an array of moduleRevisionId
+	 * @throws Exception
+	 * @see org.apache.ivy.plugins.matcher.PatternMatcher
+	 */
+	ModuleRevisionId[] search(String organisation, String moduleName)
+			throws Exception;
+
+	/**
+	 * Return an array of moduleRevisionId that match with given criteria.  Null values are unconstrained
+	 * (any value is matched).
+	 * 
+	 * @param organisation
+	 *            the organisation name as it appears in the module descriptor
+	 * @param moduleName
+	 *            the module name as it appears in the module descriptor
+	 * @param revision
+	 *            the revision as it appears in the module descriptor
+	 * @param branch
+	 *            the branch as it appears in the module descriptor
+	 * @param matcher
+	 *            an Ivy pattern matcher types, see {@link org.apache.ivy.plugins.matcher.PatternMatcher}
+     * @param resolver
+	 *            the name of the Ivy resolver.  null matches the default resolver; "*" searches all resolvers.
+	 * @return an array of matching moduleRevisionId
+	 * @throws Exception
+	 */
+	ModuleRevisionId[] search(String organisation, String moduleName,
+			String revision, String branch, String matcher, String resolver) throws Exception;
+
+	/**
+	 * Generate an easyantReport for a given moduleDescriptor. Using this report
+	 * you should have all properties / plugins / targets loaded in your module
+	 * descriptor
+	 * 
+	 * @param moduleDescriptor
+	 *            a file that represent the module descriptor
+	 * @return an easyantReport for a given moduleDescriptor
+	 * @throws Exception
+	 */
+	EasyAntReport generateEasyAntReport(File moduleDescriptor) throws Exception;
+
+	/**
+	 * Return the EasyAnt model containing all data of the module described in
+	 * given file.
+	 * 
+	 * @param moduleDescriptor
+	 *            a file that represent the module descriptor
+	 * @return an EasyAnt module descriptor
+	 * @throws Exception
+	 */
+	EasyAntModuleDescriptor getEasyAntModuleDescriptor(File moduleDescriptor)
+			throws Exception;
+
+	/**
+	 * Return an array of string representing the fully qualified named matching
+	 * with given criterias
+	 * 
+	 * @param organisation
+	 *            the organisation name
+	 * @param moduleName
+	 *            the module name
+	 * @return an array of moduleRevisionId
+	 * @throws Exception
+	 */
+	String[] searchModule(String organisation, String moduleName)
+			throws Exception;
+	
+	/**
+	 * Return the description of a module descriptor 
+	 * Useful for IDE's integration
+	 * @param mrid the module revision id to check
+	 * @return a string representing the description of the module descriptor
+	 */
+	String getDescription(ModuleRevisionId mrid);
+	
+	/**
+	 * Return the description of a module descriptor 
+	 * Useful for IDE's integration
+	 * The module revision id parameter should be with the following format 
+	 * organisation#moduleName;revision 
+	 * If no organisation is specified, this method will use the default one, 
+	 * then you could use the shorter form like myPlugin;0.1
+	 * @param moduleRevisionId a string representing a buildtype
+	 * @return a string representing the description of the module descriptor
+	 */
+	String getPluginDescription(String moduleRevisionId);
+	
+	/**
+	 * Return the description of a module descriptor 
+	 * Useful for IDE's integration
+	 * The module revision id parameter should be with the following format 
+	 * organisation#moduleName;revision 
+	 * If no organisation is specified, this method will use the default one, 
+	 * then you could use the shorter form like myBuildType;0.1
+	 * @param moduleRevisionId a string representing a buildtype 
+	 * @return a string representing the description of the module descriptor
+	 */
+	public String getBuildTypeDescription(String moduleRevisionId);
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/PluginService.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/PluginService.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/PluginService.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/impl/DefaultPluginServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/impl/DefaultPluginServiceImpl.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/impl/DefaultPluginServiceImpl.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/impl/DefaultPluginServiceImpl.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,285 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.services.impl;
+
+import java.io.File;
+import java.util.Iterator;
+
+import org.apache.easyant.core.EasyAntConstants;
+import org.apache.easyant.core.descriptor.EasyAntModuleDescriptor;
+import org.apache.easyant.core.descriptor.PluginDescriptor;
+import org.apache.easyant.core.descriptor.PropertyDescriptor;
+import org.apache.easyant.core.parser.DefaultEasyAntXmlModuleDescriptorParser;
+import org.apache.easyant.core.parser.EasyAntModuleDescriptorParser;
+import org.apache.easyant.core.report.EasyAntReport;
+import org.apache.easyant.core.report.EasyAntReportModuleParser;
+import org.apache.easyant.core.report.ImportedModuleReport;
+import org.apache.easyant.core.services.PluginService;
+import org.apache.ivy.Ivy;
+import org.apache.ivy.core.IvyContext;
+import org.apache.ivy.core.module.id.ModuleId;
+import org.apache.ivy.core.module.id.ModuleRevisionId;
+import org.apache.ivy.core.resolve.ResolvedModuleRevision;
+import org.apache.ivy.core.settings.IvySettings;
+import org.apache.ivy.plugins.matcher.PatternMatcher;
+import org.apache.ivy.plugins.parser.ModuleDescriptorParserRegistry;
+import org.apache.ivy.plugins.repository.url.URLResource;
+import org.apache.ivy.plugins.resolver.DependencyResolver;
+import org.apache.ivy.util.Message;
+import org.xml.sax.SAXException;
+
+public class DefaultPluginServiceImpl implements PluginService {
+
+	private final EasyAntModuleDescriptorParser parser;
+
+	private final Ivy ivyInstance;
+
+	/**
+	 * This is the default constructor, the IvyContext should be the IvyContext
+	 * configured to the easyant ivy instance
+	 * @param ivyInstance the easyant ivy instance
+	 */
+	public DefaultPluginServiceImpl(final Ivy ivyInstance) {
+		this(ivyInstance, new DefaultEasyAntXmlModuleDescriptorParser());
+	}
+
+	/**
+	 * A custom constructor if you want to specify your own parser /
+	 * configuration service, you should use this constructor
+	 * the IvyContext should be the IvyContext
+	 * configured to the easyant ivy instance
+	 * @param ivyInstance the easyant ivy instance
+	 * @param parser
+	 *            a valid easyantModuleDescriptor
+	 */
+	public DefaultPluginServiceImpl(final Ivy ivyInstance,
+			EasyAntModuleDescriptorParser parser) {
+		this.ivyInstance = ivyInstance;
+		if (parser == null) {
+			throw new IllegalArgumentException(
+					"You must set a valid easyant module descriptor parser");
+		}
+		this.parser = parser;
+		ModuleDescriptorParserRegistry.getInstance().addParser(parser);
+	}
+
+	public EasyAntReport getPluginInfo(ModuleRevisionId moduleRevisionId,
+			String conf) throws Exception {
+		try {
+			
+			IvyContext.pushNewContext().setIvy(ivyInstance);
+			EasyAntReport eaReport = EasyAntReportModuleParser.parseEasyAntModule(
+					moduleRevisionId, conf);
+			
+			IvyContext.popContext();
+			return eaReport;
+		} catch (SAXException e) {
+			throw new Exception("Impossible to parse " + moduleRevisionId, e);
+		}
+	}
+
+	public EasyAntReport getPluginInfo(ModuleRevisionId moduleRevisionId)
+			throws Exception {
+		return getPluginInfo(moduleRevisionId, "default");
+	}
+
+	public EasyAntReport getPluginInfo(String moduleRevisionId)
+			throws Exception {
+		String mrid = moduleRevisionId;
+		if (!mrid.matches(".*#.*")) {
+			Message.debug("No organisation specified for plugin " + mrid
+					+ " using the default one");
+			mrid = EasyAntConstants.EASYANT_PLUGIN_ORGANISATION + "#" + mrid;
+		}
+		ModuleRevisionId module = ModuleRevisionId.parse(mrid);
+		return getPluginInfo(module);
+	}
+
+	public EasyAntReport getBuildTypeInfo(String moduleRevisionId)
+			throws Exception {
+		String mrid = moduleRevisionId;
+		if (!mrid.matches(".*#.*")) {
+			Message.debug("No organisation specified for buildtype " + mrid
+					+ " using the default one");
+			mrid = EasyAntConstants.EASYANT_BUILDTYPES_ORGANISATION + "#"
+					+ mrid;
+		}
+		ModuleRevisionId module = ModuleRevisionId.parse(mrid);
+		return getPluginInfo(module);
+	}
+
+	public EasyAntModuleDescriptor getEasyAntModuleDescriptor(
+			File moduleDescriptor) throws Exception {
+		if (moduleDescriptor == null)
+			throw new Exception("moduleDescriptor cannot be null");
+		if (!moduleDescriptor.exists()) {
+			throw new Exception(
+					"imposible to find the specified module descriptor"
+							+ moduleDescriptor.getAbsolutePath());
+		}
+		IvyContext.pushNewContext().setIvy(ivyInstance);
+		// First we need to parse the specified file to retrieve all the easyant
+		// stuff
+		parser.parseDescriptor(ivyInstance.getSettings(),
+				moduleDescriptor.toURL(), new URLResource(moduleDescriptor
+						.toURL()), true);
+		EasyAntModuleDescriptor md = parser.getEasyAntModuleDescriptor();
+		IvyContext.popContext();
+		return md;
+	}
+
+	public EasyAntReport generateEasyAntReport(File moduleDescriptor)
+			throws Exception {
+		EasyAntReport eaReport = new EasyAntReport();
+		try {
+			EasyAntModuleDescriptor md = getEasyAntModuleDescriptor(moduleDescriptor);
+
+			// Then we can Store properties
+			for (Iterator<PropertyDescriptor> iterator = md.getProperties()
+					.values().iterator(); iterator.hasNext();) {
+				PropertyDescriptor property = iterator.next();
+				eaReport.addPropertyDescriptor(property.getName(), property);
+			}
+
+			// Store infos on the buildtype
+			if (md.getBuildType() != null) {
+				ImportedModuleReport buildType = new ImportedModuleReport();
+				buildType.setModuleMrid(md.getBuildType());
+				buildType.setEasyantReport(getPluginInfo(ModuleRevisionId
+						.parse(md.getBuildType())));
+				eaReport.addImportedModuleReport(buildType);
+				// Store infos on plugins
+				for (Iterator iterator = md.getPlugins().iterator(); iterator
+						.hasNext();) {
+					PluginDescriptor plugin = (PluginDescriptor) iterator
+							.next();
+					ImportedModuleReport pluginReport = new ImportedModuleReport();
+					pluginReport.setModuleMrid(plugin.getMrid());
+					pluginReport.setAs(plugin.getAs());
+					pluginReport.setType(plugin.getMode());
+					pluginReport
+							.setEasyantReport(getPluginInfo(ModuleRevisionId
+									.parse(plugin.getMrid())));
+					eaReport.addImportedModuleReport(pluginReport);
+				}
+			}
+
+		} catch (Exception e) {
+			throw new Exception("problem while parsing Ivy module file: "
+					+ e.getMessage(), e);
+		}
+		return eaReport;
+	}
+
+	public ModuleRevisionId[] search(String organisation, String moduleName,
+			String revision, String branch, String matcher, String resolver) throws Exception {
+		IvySettings settings = ivyInstance.getSettings();
+
+		if (moduleName == null && PatternMatcher.EXACT.equals(matcher)) {
+			throw new Exception(
+					"no module name provided for ivy repository graph task: "
+							+ "It can either be set explicitely via the attribute 'module' or "
+							+ "via 'ivy.module' property or a prior call to <resolve/>");
+		} else if (moduleName == null && !PatternMatcher.EXACT.equals(matcher)) {
+			moduleName = PatternMatcher.ANY_EXPRESSION;
+		}
+		ModuleRevisionId mrid = ModuleRevisionId.newInstance(organisation,
+				moduleName, revision);
+
+		ModuleRevisionId criteria = null;
+
+		if ((revision == null) || settings.getVersionMatcher().isDynamic(mrid)) {
+			criteria = new ModuleRevisionId(new ModuleId(organisation,
+					moduleName), branch, "*");
+		} else {
+			criteria = new ModuleRevisionId(new ModuleId(organisation,
+					moduleName), branch, revision);
+		}
+
+		PatternMatcher patternMatcher = settings.getMatcher(matcher);
+		if ("*".equals(resolver)) {
+			//search in all resolvers.  this can be quite slow for complex repository configurations
+			//with ChainResolvers, since resolvers in chains will be searched multiple times.
+			return ivyInstance.listModules(criteria, patternMatcher);
+		} else {
+			//limit search to the specified resolver.
+			DependencyResolver dependencyResolver =
+					resolver == null ? settings.getDefaultResolver()
+									 : settings.getResolver(resolver);
+			if (dependencyResolver == null) {
+				throw new IllegalArgumentException("Unknown dependency resolver for search: " + resolver);
+			}
+
+			ivyInstance.pushContext();
+			try {
+				return ivyInstance.getSearchEngine().listModules(dependencyResolver, criteria, patternMatcher);
+			} finally {
+				ivyInstance.popContext();
+			}
+		}
+	}
+
+	public ModuleRevisionId[] search(String organisation, String moduleName)
+			throws Exception {
+		return search(organisation, moduleName, null, null,
+				PatternMatcher.EXACT_OR_REGEXP, null);
+	}
+
+	public String[] searchModule(String organisation, String moduleName)
+			throws Exception {
+		ModuleRevisionId[] mrids = search(organisation, moduleName);
+		String[] result = new String[mrids.length];
+		for (int i = 0; i < mrids.length; i++) {
+			result[i] = mrids[i].toString();
+		}
+		return result;
+	}
+	
+	public String getDescription(ModuleRevisionId mrid) {
+		ResolvedModuleRevision rmr = ivyInstance.findModule(mrid);
+		return rmr.getDescriptor().getDescription();
+	}
+	
+	
+	public String getPluginDescription(String moduleRevisionId) {
+		String mrid = moduleRevisionId;
+		if (!mrid.matches(".*#.*")) {
+			Message.debug("No organisation specified for plugin " + mrid
+					+ " using the default one");
+			mrid = EasyAntConstants.EASYANT_PLUGIN_ORGANISATION + "#" + mrid;
+		}
+		ModuleRevisionId module = ModuleRevisionId.parse(mrid);
+
+		return getDescription(module);
+	}
+	
+	public String getBuildTypeDescription(String moduleRevisionId) {
+		String mrid = moduleRevisionId;
+		if (!mrid.matches(".*#.*")) {
+			Message.debug("No organisation specified for buildtype " + mrid
+					+ " using the default one");
+			mrid = EasyAntConstants.EASYANT_BUILDTYPES_ORGANISATION + "#" + mrid;
+		}
+		ModuleRevisionId module = ModuleRevisionId.parse(mrid);
+
+		return getDescription(module);
+	}
+
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/impl/DefaultPluginServiceImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/impl/DefaultPluginServiceImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/impl/DefaultPluginServiceImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/Describe.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/Describe.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/Describe.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/Describe.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,91 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.man;
+
+import org.apache.easyant.core.descriptor.PropertyDescriptor;
+import org.apache.easyant.core.report.EasyAntReport;
+import org.apache.easyant.core.report.PhaseReport;
+import org.apache.easyant.core.report.TargetReport;
+import org.apache.tools.ant.Project;
+
+/**
+ * Implements support for -describe easyant switch.
+ * 
+ * This command searches for a phase, target, and properties by the 
+ * supplied search name and returns result for each of these sequentially. 
+ */
+public class Describe implements ManCommand {
+	private String target;
+	
+	// convenient string constants
+	private static final String TAB = "\t";
+	private static final String NONE = "NONE";
+	
+	public void addParam(String param) {
+		this.target = param;
+	}
+
+	public void execute(EasyAntReport earep, Project project) {
+		String lineSep = System.getProperty("line.separator");
+		
+		if(target == null || target.length() == 0) {
+			throw new IllegalArgumentException("No parameter specified for -describe parameter.");
+		}
+		
+		project.log(lineSep + "--- Available references for: " + target +
+				" in current project: " + project.getName() + " ---" + lineSep);
+		
+		PhaseReport phaseRep = earep.getPhaseReport(target, true);
+		if(phaseRep != null) {
+			project.log(TAB + "Phase: " + target);
+			project.log(TAB + TAB + "Description: " + (phaseRep.getDescription() == null ? NONE : phaseRep.getDescription()));
+			project.log(TAB + TAB + "Depends: " + (phaseRep.getDepends() == null ? NONE : phaseRep.getDepends()));
+			project.log(lineSep + TAB + TAB + "For information on targets attached to this phase, run:");
+			project.log(TAB + TAB + "easyant -listTargets " + target);
+		} else {
+			project.log(TAB + "No Phase found for name: " + target);
+		}
+		TargetReport targetRep = earep.getTargetReport(target, true);
+		if(targetRep != null) {
+			project.log(TAB + "Target: " + target);
+			project.log(TAB + TAB + "Phase: " + (targetRep.getPhase() == null ? NONE : targetRep.getPhase()));
+			project.log(TAB + TAB + "Description: " + (targetRep.getDescription() == null ? NONE : targetRep.getDescription()));
+			project.log(TAB + TAB + "Depends: " + (targetRep.getDepends() == null ? NONE : targetRep.getDepends()));
+			project.log(TAB + TAB + "IF: " + (targetRep.getIfCase() == null ? NONE : targetRep.getIfCase()));
+			project.log(TAB + TAB + "UNLESS: " + (targetRep.getUnlessCase() == null ? NONE : targetRep.getUnlessCase()));
+		} else {
+			project.log(TAB + "No Target found for name: " + target);
+		}
+		PropertyDescriptor prop = earep.getAvailableProperties().get(target);
+		if(prop != null) {
+			project.log(TAB + "Property: " + target);
+			project.log(TAB + TAB + "Description: " + (prop.getDescription() == null ? NONE : prop.getDescription()));
+			String defaultValue = prop.getDefaultValue() == null ? NONE : prop.getDefaultValue();
+			project.log(TAB + TAB + "Default: " + defaultValue);
+			project.log(TAB + TAB + "Required: " + prop.isRequired());
+			String currentValue = prop.getValue() == null ? defaultValue : prop.getValue();
+			project.log(TAB + TAB + "Current value: " + currentValue);
+		} else {
+			project.log(TAB + "No Property found for name: " + target);
+		}
+		
+		project.log(lineSep + "--- End Of (Describe) ---");
+	}
+
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/Describe.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/Describe.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/Describe.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListPhases.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListPhases.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListPhases.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListPhases.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,54 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.man;
+
+import java.util.List;
+
+import org.apache.easyant.core.report.EasyAntReport;
+import org.apache.easyant.core.report.PhaseReport;
+import org.apache.tools.ant.Project;
+
+/**
+ * ManCommand implementation to list all phases associated with specified 
+ * build module.
+ * 
+ * Supports the -listPhases switch.
+ */
+public class ListPhases implements ManCommand {
+	// convenient string constant for formatting
+	private static String TAB = "\t";
+	
+	public void addParam(String param) {
+		// this command does not make use of params
+	}
+
+	public void execute(EasyAntReport earep, Project project) {
+		String lineSep = System.getProperty("line.separator");
+		project.log(lineSep + "--- Available Phases for current project: " + project.getName() + " ---" + lineSep);
+		
+		List<PhaseReport> phases = earep.getAvailablePhases();
+		for(int i = 0; i<phases.size(); i++) {
+			project.log(TAB + phases.get(i).getName());
+		}
+		
+		project.log(lineSep + lineSep + "For more information on a Phase, run:" + lineSep + "\t easyant -describe <PHASE>");
+		project.log(lineSep + "--- End Of (Phases Listing) ---");
+	}
+
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListPhases.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListPhases.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListPhases.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListPlugins.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListPlugins.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListPlugins.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListPlugins.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,52 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.man;
+
+import java.util.List;
+
+import org.apache.easyant.core.report.EasyAntReport;
+import org.apache.easyant.core.report.ImportedModuleReport;
+import org.apache.tools.ant.Project;
+
+/**
+ * Lists all available plugins (imported modules) for the specified 
+ * build module.
+ */
+public class ListPlugins implements ManCommand {
+	private static String TAB = "\t";
+
+	public void addParam(String param) {
+		// DO NOTHING - NOT REQUIRED, SINCE THIS IS A 'LIST-ALL' COMMAND
+	}
+
+	public void execute(EasyAntReport earep, Project project) {
+		String lineSep = System.getProperty("line.separator");
+		project.log(lineSep + "--- Available Plugins for current project: " + project.getName() + " ---" + lineSep);
+		
+		List<ImportedModuleReport> moduleReps = earep.getImportedModuleReports();
+		for(int i = 0; i<moduleReps.size(); i++) {
+			project.log(TAB + moduleReps.get(i).getModuleMrid() + (moduleReps.get(i).getAs() == null ? 
+					"" : ": Known as " + moduleReps.get(i).getAs()));
+		}
+		
+		project.log(lineSep + lineSep + "For more information on a Plugin, run:" + lineSep + "\t easyant -describe <PLUGIN>");
+		project.log(lineSep + "--- End Of (Plugins Listing) ---");
+	}
+
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListPlugins.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListPlugins.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListPlugins.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListProps.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListProps.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListProps.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListProps.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,84 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.man;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.easyant.core.descriptor.PropertyDescriptor;
+import org.apache.easyant.core.report.EasyAntReport;
+import org.apache.easyant.core.report.ImportedModuleReport;
+import org.apache.tools.ant.Project;
+
+/**
+ * Lists all properties (deep search - includes all imported modules)
+ * available in the specified build module.
+ */
+public class ListProps implements ManCommand {
+	private String plugin = null;
+	
+	/*
+	 * defining some convenient string constants
+	 */
+	private static final String TAB = "\t";
+
+	public void addParam(String param) {
+		this.plugin = param;
+	}
+
+	public void execute(EasyAntReport earep, Project project) {
+		String lineSep = System.getProperty("line.separator");
+
+		/*
+		 * the plugin specified to this class through the addParam method
+		 * needs to be searched for all properties, and those
+		 * properties will be displayed by this class.
+		 */
+		
+		if(plugin == null || plugin.trim().length() == 0) {
+			throw new IllegalArgumentException("No plugin found to list properties for.");
+		}
+
+		project.log(lineSep + "--- Available Properties for current project: " + project.getName() + 
+				":: Plugin: " + plugin + " ---" + lineSep);
+
+		ImportedModuleReport moduleRep = earep.getImportedModuleReport(plugin);
+		if(moduleRep == null) {
+			project.log(TAB + "No Module / Plugin found by given name: " + plugin);
+		} else {
+			Map<String, PropertyDescriptor> allprops = moduleRep.getEasyantReport().getPropertyDescriptors();
+			
+			if(allprops.size() > 0) {
+				for(Iterator<Entry<String, PropertyDescriptor>> it = allprops.entrySet().iterator(); it.hasNext(); ) {
+					Entry<String, PropertyDescriptor> entry = it.next();
+					PropertyDescriptor prop = entry.getValue();
+					project.log(TAB + "Property: " + prop.getName());
+				}
+		
+				project.log(lineSep + lineSep + "For more information on a Property, run:" + lineSep 
+						+ "\t easyant -describe <PROPERTY>");
+			} else {
+				project.log(lineSep + "No property found in the plugin: " + plugin);
+			}
+		}
+		project.log(lineSep + "--- End Of (Properties Listing) ---");
+	}
+
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListProps.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListProps.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListProps.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListTargets.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListTargets.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListTargets.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListTargets.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,125 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.man;
+
+import java.util.List;
+
+import org.apache.easyant.core.report.EasyAntReport;
+import org.apache.easyant.core.report.ImportedModuleReport;
+import org.apache.easyant.core.report.PhaseReport;
+import org.apache.easyant.core.report.TargetReport;
+import org.apache.tools.ant.Project;
+
+/**
+ * Implements the '-listTargets' switch for project Manual.
+ * 
+ * This command lists all targets belonging to the specified 
+ * phase / plugin. 
+ * 
+ * If no phase / plugin name is specified, then this command
+ * lists all targets available in the project (module.ivy)
+ */
+public class ListTargets implements ManCommand {
+	/*
+	 * name of the phase or plugin for which the targets 
+	 * have been requested for.
+	 */
+	private String container = null;
+	
+	/*
+	 * defining some convenient string constants
+	 */
+	private static final String TAB = "\t";
+	private static final String NONE = "NONE";
+	
+	public void addParam(String param) {
+		this.container = param;
+	}
+
+	/*
+	 * simply look up for all targets belonging to a phase named <container>, is such
+	 * a phase exists. then list all targets listed in a module named <container>, is
+	 * such a module exists.
+	 * 
+	 * however, if the this.container variable has not been initialized then simply list
+	 * down all targets in the current module and all imported sub-modules.
+	 */
+	public void execute(EasyAntReport earep, Project project) {
+		String lineSep = System.getProperty("line.separator");
+		
+		project.log(lineSep + "--- Available Targets for current project: " + project.getName() + " ---" + lineSep);
+		
+		if(this.container == null || this.container.trim().length() == 0) {
+			project.log(lineSep + "No Phase / Plugin specified. Listing all targets available in the project.");
+			
+			List<TargetReport> targets = earep.getAvailableTargets();
+			printTargets(targets, project);
+		} else {
+			PhaseReport phase = earep.getPhaseReport(this.container, true);
+			
+			if(phase != null) {
+				project.log("Targets for Phase: " + this.container);
+				List<TargetReport> targets = phase.getTargetReports();
+				printTargets(targets, project);
+			} else {
+				project.log(TAB + "No Phase found by name: " + this.container);
+			}
+			
+			List<ImportedModuleReport> modules = earep.getImportedModuleReports();
+			ImportedModuleReport selected = null;
+			for(int i = 0; i<modules.size(); i++) {
+				selected = modules.get(i);
+				if(container.equals(selected.getModuleMrid())) {
+					break;
+				}
+			}
+			if(selected != null) {
+				project.log(lineSep + "Targets for Module: " + this.container);
+				List<TargetReport> targets = selected.getEasyantReport().getTargetReports();
+				printTargets(targets, project);
+			} else {
+				project.log(lineSep + TAB + "No Module / Plugin found by name: " + this.container);
+			}
+				
+			project.log(lineSep + lineSep + "For more information on a Phase, run:" + lineSep + "\t easyant -describe <PHASE>");
+		}
+		project.log(lineSep + "--- End Of (Phases Listing) ---");
+	}
+
+	/*
+	 * common method to output a list of targets.
+	 * 
+	 * re-used multiple times in this class.
+	 */
+	private void printTargets(List<TargetReport> targets, Project project) {
+		if(targets.size() == 0) {
+			project.log(TAB + "No targets found.");
+			return;
+		}
+		for(int i = 0; i<targets.size(); i++) {
+			TargetReport targetRep = targets.get(i);
+			project.log(TAB + "Target: " + targetRep.getName());
+			project.log(TAB + TAB + "Phase: " + (targetRep.getPhase() == null ? NONE : targetRep.getPhase()));
+			project.log(TAB + TAB + "Description: " + (targetRep.getDescription() == null ? NONE : targetRep.getDescription()));
+			project.log(TAB + TAB + "Depends: " + (targetRep.getDepends() == null ? NONE : targetRep.getDepends()));
+			project.log(TAB + TAB + "IF: " + (targetRep.getIfCase() == null ? NONE : targetRep.getIfCase()));
+			project.log(TAB + TAB + "UNLESS: " + (targetRep.getUnlessCase() == null ? NONE : targetRep.getUnlessCase()));
+		}
+	}
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListTargets.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListTargets.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ListTargets.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ManCommand.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ManCommand.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ManCommand.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ManCommand.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,64 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.man;
+
+import org.apache.easyant.core.report.EasyAntReport;
+import org.apache.tools.ant.Project;
+
+/**
+ * Generic interface for all classes implementing functionality
+ * for all project manual switches that are accepted on command
+ * line when invoking easyant.
+ * 
+ * For example,
+ * <br>
+ * 		easyant -listTargets
+ * 
+ * <p />
+ * The -listTargets and similar switches (like -describe etc.) are
+ * all implemented by classes implementing this interface.
+ * 
+ * For each manual switch that is intended to be supported by easyant,
+ * a new implementing class for this interface must be added that
+ * implements the switch functionality.
+ * 
+ * Additionally, for the addition of any new switch, EasyAntMain needs
+ * to be modified to add the new switch for the new manual functionality.
+ */
+public interface ManCommand {
+	/**
+	 * Add a parameter to the ManCommand instance. The implementing
+	 * class may choose to process or ignore the parameter as need
+	 * may be.
+	 * @param param
+	 */
+	public void addParam(String param);
+	
+	/**
+	 * Provides the ManCommand instance with a context to execute the
+	 * command in.
+	 * 
+	 * The command is provided with an instance of generated EasyAntReport
+	 * with which relevant manual information may be retrieved for implementing
+	 * the switch functionality.
+	 * @param earep
+	 * @param project
+	 */
+	public void execute(EasyAntReport earep, Project project);
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ManCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ManCommand.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ManCommand.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ProjectMan.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ProjectMan.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ProjectMan.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ProjectMan.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,143 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.man;
+
+import java.io.File;
+
+import org.apache.easyant.core.EasyAntMagicNames;
+import org.apache.easyant.core.report.EasyAntReport;
+import org.apache.easyant.core.services.PluginService;
+import org.apache.tools.ant.Project;
+
+// TODO: move the list of supported switches and their implementation
+// classes to easyant-conf.xml
+
+/**
+ * This class controls the Project specific manual / documentation / help
+ * functionality.
+ * 
+ * The getCommand method supports a set of switches, that may be added to.
+ * Each switch must also have a corresponding implementation class, that
+ * is expected to implement the ManCommand interface.
+ */
+public class ProjectMan {
+	private boolean inited = false;
+	private Throwable initErr = null;
+	
+	private Project project = null;
+	private EasyAntReport earep = null;
+	private ManCommand command = null;
+	
+	/**
+	 * Factory method that returns an appropriate ManCommand implementation
+	 * depending on the parameter passed to it.
+	 * 
+	 * @param cmd
+	 * 			Switch name for which ManCommand implementation is required.
+	 * 			Example, -describe etc.
+	 * @return
+	 */
+	private ManCommand getCommand(String cmd) {
+		if("-listPhases".equals(cmd)) {
+			return new ListPhases();
+		} else if("-describe".equals(cmd)) {
+			return new Describe();
+		} else if("-listTargets".equals(cmd)) {
+			return new ListTargets();
+		} else if("-listProps".equals(cmd)) {
+			return new ListProps();
+		} else if("-listPlugins".equals(cmd)) {
+			return new ListPlugins();
+		}
+		throw new IllegalArgumentException("Unknown Manual Command.");
+	}
+	
+	/**
+	 * Sets the context for this ProjectMan instance. Once a coxtext is provided
+	 * this object is in a state to support manual commands / switches.
+	 * 
+	 * The context essentially comprises of:
+	 * <ol>
+	 * 	<li>Configured Project instance</li>
+	 *  <li>The build module itself.</li>
+	 * Assumes the passed project object to be a 
+	 * configured project.
+	 * 
+	 * @param p
+	 * 			Configured project instance.
+	 * @param moduleDescriptor
+	 * 			The build module file. This MUST not be left unspecified. 
+	 * 			This value does not default to module.ivy in current directory.
+	 */
+	public boolean setContext(Project p, File moduleDescriptor) {
+		project = p;
+		try {
+			PluginService pluginService = (PluginService)project.getReference(EasyAntMagicNames.PLUGIN_SERVICE_INSTANCE);
+			earep = pluginService.generateEasyAntReport(moduleDescriptor);
+			inited = true;
+		} catch (Throwable t) {
+			project.log("EasyAntMan could not be initialized. Details: " + t.getMessage());
+			initErr = t;
+		}
+		return inited;
+	}
+
+	/**
+	 * Sets the command to be executed by ProjectMan. ProjectMan only keeps
+	 * track of the last command supplied to it through this method.
+	 * 
+	 * @param command
+	 * 			The switch (e.g. -listTargets) with which easyant was invoked.
+	 */
+	public void setCommand(String command) {
+		// if there are multiple commands specified the last one overrides all the previous ones
+		this.command = getCommand(command);
+	}
+	
+	/**
+	 * Used to add a parameter to ManCommand instance. The ManCommand instance
+	 * will decide how to handle the object.
+	 * 
+	 * @param param
+	 * 			Additional input to the ManCommand. This may be specify the plugin
+	 * 			name if the the command is -listProps, or the phase name if the 
+	 * 			command is -describe.
+	 */
+	public void addParam(String param) {
+		command.addParam(param);
+	}
+	
+	/**
+	 * Executes the Project Manual with the given command name, and supplied
+	 * parameters.
+	 */
+	public void execute() {
+		if(!inited)
+			throw new RuntimeException(initErr);
+		
+		if(command == null)
+			throw new RuntimeException("Available options: -listAll, -describe, -listTargets, -listProps. " +
+					"ProjectHelp can not be run without one of these.");
+		String lineSep = System.getProperty("line.separator");
+		
+		project.log(lineSep + "Project Manual");
+		project.log("--------------");
+		command.execute(earep, project);
+	}
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ProjectMan.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ProjectMan.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/man/ProjectMan.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/AbstractEasyAntTask.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/AbstractEasyAntTask.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/AbstractEasyAntTask.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/AbstractEasyAntTask.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,71 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.tasks;
+
+import org.apache.easyant.core.ivy.IvyInstanceHelper;
+import org.apache.ivy.Ivy;
+import org.apache.ivy.ant.IvyAntSettings;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.Reference;
+
+/**
+ * Base class for easyant tasks
+ * 
+ */
+public class AbstractEasyAntTask extends Task {
+
+	/**
+	 * Get the easyant ivy ant settings.
+	 * Usefull if you want to bind a subtask to easyant ivy instance
+	 * @return an ivyAntSettings
+	 */
+	protected IvyAntSettings getEasyAntIvyAntSettings() {
+		return IvyInstanceHelper.getEasyAntIvyAntSettings(getProject());
+	}
+	
+	/**
+	 * Get the configured ivy instance
+	 * @return a configured ivy instance
+	 */
+	protected Ivy getEasyAntIvyInstance() {
+		return getEasyAntIvyAntSettings().getConfiguredIvyInstance(this);
+	}
+	
+	/**
+	 * Utilitary method to configure a task with the current one
+	 * @param task task to configure
+	 * @return the configured task
+	 */
+	protected Task initTask(Task task) {
+		task.setLocation(getLocation());
+		task.setProject(getProject());
+		task.setTaskName(getTaskName());
+		task.setOwningTarget(getOwningTarget());
+		return task;
+	}
+
+	/**
+	 * Get a reference of the project ivy instance
+	 * @return a reference of the project ivy instance
+	 */
+	protected Reference getProjectIvyReference() {
+		return IvyInstanceHelper.buildProjectIvyReference(getProject());
+	}
+
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/AbstractEasyAntTask.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/AbstractEasyAntTask.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/AbstractEasyAntTask.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/BindTarget.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/BindTarget.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/BindTarget.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/BindTarget.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,140 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.tasks;
+
+import java.util.Enumeration;
+import java.util.Iterator;
+
+import org.apache.easyant.core.BuildConfigurationHelper;
+import org.apache.easyant.core.ant.Phase;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.Task;
+
+public class BindTarget extends Task {
+
+	private String target;
+	private String toPhase;
+
+	private String buildConfigurations;
+
+	public void execute() throws BuildException {
+		StringBuilder message = new StringBuilder();
+		message.append("Phase mapping for target ").append(getTarget()).append(
+				" ");
+		if (!BuildConfigurationHelper.isBuildConfigurationActive(
+				getBuildConfigurations(), getProject(), message.toString())) {
+			log(
+					"no matching build configuration for this phase mapping, this mapping will be ignored",
+					Project.MSG_DEBUG);
+			return;
+		}
+		Target t = (Target) getProject().getTargets().get(getTarget());
+		if (t == null) {
+			throw new BuildException("unable to find target " + getTarget());
+		}
+
+		// unbind current mapping
+		for (Iterator iterator = getProject().getTargets().values().iterator(); iterator
+				.hasNext();) {
+			Target current = (Target) iterator.next();
+			if (current instanceof Phase) {
+				Enumeration dependencies = current.getDependencies();
+				StringBuilder dependsOn = new StringBuilder();
+				boolean requiresUpdates = false;
+				while (dependencies.hasMoreElements()) {
+					String dep = (String) dependencies.nextElement();
+					if (dep.equals(getTarget())) {
+						log("target" + getTarget() + " is registred in phase"
+								+ current.getName(), Project.MSG_VERBOSE);
+						requiresUpdates = true;
+					} else {
+						dependsOn.append(dep);
+						dependsOn.append(",");
+					}
+				}
+				if (requiresUpdates) {
+					log("removing target" + getTarget() + " from phase"
+							+ current.getName(), Project.MSG_VERBOSE);
+
+					Phase p = new Phase();
+					p.setDescription(current.getDescription());
+					p.setIf(current.getIf());
+					p.setLocation(current.getLocation());
+					p.setName(current.getName());
+					p.setProject(current.getProject());
+					p.setUnless(current.getUnless());
+					String depends = dependsOn.toString();
+					if (depends.endsWith(",")) {
+						depends = depends.substring(0, depends.length() - 1);
+					}
+					p.setDepends(depends);
+					getProject().addOrReplaceTarget(p);
+				}
+
+			}
+		}
+
+		if (getToPhase() != null && !getToPhase().equals("")) {
+			if (!getProject().getTargets().containsKey(getToPhase())) {
+				throw new BuildException("can't add target " + getTarget()
+						+ " to phase " + getToPhase() + " because the phase"
+						+ " is unknown.");
+			}
+			Target p = (Target) getProject().getTargets().get(getToPhase());
+
+			if (!(p instanceof Phase)) {
+				throw new BuildException("referenced target " + getToPhase()
+						+ " is not a phase");
+			}
+			p.addDependency(getTarget());
+		}
+
+	}
+
+	public String getToPhase() {
+		return toPhase;
+	}
+
+	public void setToPhase(String toPhase) {
+		this.toPhase = toPhase;
+	}
+
+	public String getTarget() {
+		return target;
+	}
+
+	public void setTarget(String target) {
+		this.target = target;
+	}
+
+	public String getBuildConfigurations() {
+		return buildConfigurations;
+	}
+
+	public void setBuildConfigurations(String buildConfigurations) {
+		this.buildConfigurations = buildConfigurations;
+	}
+
+	public void setConf(String conf) {
+		this.buildConfigurations = conf;
+	}
+
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/BindTarget.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/BindTarget.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/BindTarget.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain