package org.eclipse.epf.toolbox.batch; import java.io.File; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.epf.common.utils.XMLUtil; import org.eclipse.epf.library.util.LibraryUtil; import org.eclipse.epf.toolbox.ToolboxPlugin; import org.eclipse.epf.uma.MethodElement; import org.w3c.dom.Document; import org.w3c.dom.Element; public class EbcReportMgr { private EbcBatchCommandMgr ebcMgr; private File reportFile; private Document reportDocument; private Set<Object> repoptObjectSet; private static String umaPackagePath = "org.eclipse.epf.uma.impl"; private Element rootElement; public EbcReportMgr(EbcBatchCommandMgr ebcMgr) { this.ebcMgr = ebcMgr; getReportDocument(); } public void setReportFile(File reportFile) { this.reportFile = reportFile; } public void saveDocument() { try { XMLUtil.saveDocument(getReportDocument(), reportFile.getAbsolutePath()); } catch (Exception e){ ToolboxPlugin.getDefault().getLogger().logError(e); } } public Document getReportDocument() { if (reportDocument == null) { try { reportDocument = XMLUtil.createDocument(); rootElement = reportDocument.createElement("Report"); reportDocument.appendChild(rootElement); repoptObjectSet = new HashSet<Object>(); } catch (Exception e) { ToolboxPlugin.getDefault().getLogger().logError(e); } } return reportDocument; } public void report(Object obj) { if (repoptObjectSet.contains(obj)) { return; } report_(obj); repoptObjectSet.add(obj); } private void report_(Object obj) { Document doc = getReportDocument(); String tag = null; String clsName = obj.getClass().getName(); if (clsName.startsWith(umaPackagePath)) { tag = clsName.substring(25); if (tag.endsWith("Impl")) { int ix = tag.length() - 4; tag = tag.substring(0, ix); } } Resource res = null; MethodElement me = null; if (obj instanceof MethodElement) { me = (MethodElement) obj; res = me.eResource(); } String path = res == null ? "?" : res.getURI().toFileString(); Element elem = doc.createElement(tag); elem.setAttribute("path", path); String textContent = obj.toString(); int ix = textContent.indexOf("(name:"); if (ix > 0) { textContent = textContent.substring(ix); } elem.setTextContent(textContent); if (me != null) { List features = LibraryUtil.getStructuralFeatures(me); if (features != null) { for (int i = 0; i < features.size(); i++) { EStructuralFeature feature = (EStructuralFeature) features .get(i); if (feature instanceof EReference) { EReference ref = (EReference) feature; if (!ref.isContainment()) { Object value = me.eGet(ref); if (value != null) { if (value instanceof List) { for (Object subValue: (List) value) { addRefElem(doc, elem, ref, subValue); } } else { addRefElem(doc, elem, ref, value); } } } } } } } rootElement.appendChild(elem); } private void addRefElem(Document doc, Element elem, EReference ref, Object value) { Element refElem = doc.createElement(ref .getName()); elem.appendChild(refElem); String str = value.toString(); if (value instanceof MethodElement) { MethodElement me = (MethodElement) value; str = me.getName() + ", " + me.getGuid(); } refElem.setTextContent(str); } }