blob: 971fdf0b36f10a94d25f92a0d74267005efacd57 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation and others.
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.export.xml.services;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.sdo.EDataObject;
import org.eclipse.epf.dataexchange.util.ContentProcessor;
import org.eclipse.epf.dataexchange.util.IResourceHandler;
import org.eclipse.epf.export.xml.XmlExportResources;
import org.eclipse.epf.library.edit.util.ModelStructure;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.library.services.LibraryProcessor;
import org.eclipse.epf.library.util.LibraryUtil;
import com.ibm.uma.Diagram;
import com.ibm.uma.MethodElement;
import com.ibm.uma.MethodLibrary;
import com.ibm.uma.MethodPackage;
import com.ibm.uma.MethodPlugin;
import com.ibm.uma.WorkOrder;
import com.ibm.uma.WorkOrderType;
import com.ibm.uma.util.UmaUtil;
/**
* XmlExport service class to process the exporting task
*
* @author Jinhua Xi
* @since 1.0
*
*/
public class XmlExportService {
//String xmlPath;
private XmlExportData data;
private XmlLibrary xmlLib;
private List discardedElements = new ArrayList();
XmlExportLogger logger = null;
// in case we need to mapping the uma objects to xml objects
// such as the content categories
private Map umaIdToXmlIdMap = new HashMap();
public XmlExportService(XmlExportData data)
{
this.data = data;
logger = new XmlExportLogger(new File(this.data.xmlFile).getParentFile());
}
public File getLogPath() {
return logger.getLogPath();
}
public void dispose() {
logger.dispose();
}
public void doExport(IProgressMonitor monitor)
{
try {
IResourceHandler handler = new ExportResourceHandler(
LibraryProcessor.getInstance().getLibraryRootPath(),
new File(data.getFilepathName()).getParentFile());
ContentProcessor contentProc = new ContentProcessor(
handler, this.logger);
//FeatureManager.INSTANCE.printFeatureNameMapping();
// export the current library to the xml file
// get the current library instance and export all to the xml
MethodLibrary src = LibraryProcessor.getInstance().getLibrary();
this.xmlLib = new XmlLibrary(contentProc, logger, data.getFilepathName());
this.xmlLib.createLibrary(src.getGuid(), src.getName());
EDataObject target = this.xmlLib.getRoot();
creatEDataObjectTree(src, target);
iteratEDataObject(src);
this.xmlLib.save();
} catch (Exception e) {
logger.logError(XmlExportResources.getString("XmlExport.XmlExportService.error", e.getMessage()), e); //$NON-NLS-1$
}
}
private boolean isPluginSelected(MethodPlugin plugin) {
if ( data.export_model == XmlExportData.EXPORT_MODEL_LIB ) {
return true;
} else if ( data.export_model == XmlExportData.EXPORT_MODEL_PLUGINS ) {
return (data.selectedPlugins != null) && data.selectedPlugins.contains(plugin);
} else if ( data.export_model == XmlExportData.EXPORT_MODEL_SPECS ) {
return false;
} else {
return true;
}
}
private void creatEDataObjectTree(MethodElement srcObj, EDataObject targetObj) {
// if it's a plugin, skip all the system packages
// and find the top most user packages
if ( srcObj instanceof MethodPlugin ) {
MethodPlugin plugin = (MethodPlugin)srcObj;
if ( !isPluginSelected(plugin) ) {
return;
}
// all system packages are discarded
discardedElements.addAll(TngUtil.getAllSystemPackages(plugin));
List topmostUserPackages = getTopmostUserPackage(plugin);
List categoryPkgs = TngUtil.getContentCategoryPackages(plugin);
org.eclipse.epf.xml.uma.ContentCategoryPackage xmlPkg =
(org.eclipse.epf.xml.uma.ContentCategoryPackage)
this.xmlLib.getContentCategoryPackage(plugin.getGuid());
String contentCategoryPackageId = xmlPkg.getId();
for (Iterator itp = topmostUserPackages.iterator(); itp.hasNext(); ) {
MethodPackage pkg = (MethodPackage)itp.next();
// if it's a category package,
// create all contained elements in the single custom category package
if ( categoryPkgs.contains(pkg)) {
// set the it mapping
setIdMapping(pkg.getGuid(), contentCategoryPackageId);
creatEDataObjectTree(pkg, xmlPkg);
} else {
creatEDataObjectTree(pkg, targetObj);
}
}
} else {
for ( Iterator it = srcObj.eContents().iterator(); it.hasNext(); ) {
MethodElement child = (MethodElement)it.next();
// in uma model, WorkOrder is contained in package
// in xml model, WorkOrder is contained by the owning WorkBreakdownElement,
// so delay the creation if the owner is a package
if ( child instanceof WorkOrder && srcObj instanceof MethodPackage ) {
continue;
}
if ( (child instanceof MethodPlugin) && !isPluginSelected((MethodPlugin)child) ) {
continue;
}
if ( !isDiscarded(child) ) {
createXmlObject(child, targetObj);
}
}
}
}
private void setIdMapping(String umaId, String xmlId) {
if ( !umaIdToXmlIdMap.containsKey(umaId) ) {
umaIdToXmlIdMap.put(umaId, xmlId);
}
}
private String getXmlId(String umaId) {
if ( umaIdToXmlIdMap.containsKey(umaId)) {
return (String)umaIdToXmlIdMap.get(umaId);
}
return umaId;
}
private boolean isDiscarded(Object o) {
if ( o instanceof Diagram ) {
return true;
}
return discardedElements.contains(o);
}
private EDataObject getXmlObject(MethodElement srcObj) {
String id = srcObj.getGuid();
if ( umaIdToXmlIdMap.containsKey(id)) {
id = (String)umaIdToXmlIdMap.get(id);
}
return this.xmlLib.getElement(id);
}
/**
* create an xml element for the container, based on the uma element
* @param umaElement
* @param targetContainer
*/
private void createXmlObject(MethodElement umaElement, EDataObject targetContainer) {
EStructuralFeature feature = umaElement.eContainmentFeature();
createXmlObject(umaElement, targetContainer, feature.getName());
}
/**
* create an xml element for the container, based on the uma element
* @param umaElement
* @param targetContainer
*/
private void createXmlObject(MethodElement umaElement, EDataObject targetContainer, String containmentFeature) {
try {
if ( umaElement == null ) {
return;
}
// get the containment feature so we can create the object of the same type
String elementType = umaElement.getType().getName();
EDataObject xmlElement = xmlLib.createElement(targetContainer,
containmentFeature, umaElement.eClass().getName(),
elementType, umaElement.getGuid());
if ( xmlElement != null ) {
// recursive
creatEDataObjectTree(umaElement, xmlElement);
}
} catch (Exception e) {
// log the error and continue???
e.printStackTrace();
}
}
private void iteratEDataObject(MethodElement srcObj) {
if ( srcObj instanceof MethodPlugin ) {
MethodPlugin plugin = (MethodPlugin)srcObj;
if ( !isPluginSelected(plugin) ) {
return;
}
}
if ( isProcessed(srcObj.getGuid()) ) {
return;
}
setProcessed(srcObj.getGuid());
EDataObject targetObj = getXmlObject(srcObj);
// if object is not created,
// which means it's either a system package or something wrong
if ( targetObj == null ) {
if ( srcObj instanceof MethodPackage ) {
// iterate the child packages
for (Iterator it = ((MethodPackage)srcObj).getChildPackages().iterator(); it.hasNext(); ) {
iteratEDataObject((MethodElement)it.next());
}
}
// // elements can be reference in other plugins
// // don't need to care about this
// else if (!isDiscarded(srcObj) ) {
// logger.logWarning("Warning: xml object not created for " + LibraryUtil.getTypeName(srcObj) );
// }
return;
}
EClass eClass = srcObj.eClass();
EList features = eClass.getEAllStructuralFeatures();
for ( Iterator it = features.iterator(); it.hasNext(); ) {
EStructuralFeature feature = (EStructuralFeature)it.next();
Object value = srcObj.eGet(feature);
try {
if ( value instanceof List ) {
for (Iterator itv = ((List)value).iterator(); itv.hasNext(); ) {
MethodElement src_value = (MethodElement)itv.next();
// handle the UmaPackage#getWorkBreakdownElement_LinkToPredecessor feature value
// the WorkOrder in uma is a process element in a package
// in xml model, it's an EDataObject contained by the WorkBreakdownElement
if ( src_value instanceof WorkOrder ) {
// get the owner of the WorkOrder
EDataObject workOrder = getXmlObject(src_value);
if ( workOrder == null ) {
createXmlObject(src_value, targetObj, feature.getName());
}
//System.out.println("workorder value");
}
// set the reference
String xmlId = getXmlId(src_value.getGuid());
xmlLib.setReferenceValue(targetObj, feature.getName(), xmlId, src_value.getType());
iteratEDataObject(src_value);
}
} else if ( value instanceof MethodElement) {
// get the xml object and iterate again
MethodElement src_value = (MethodElement)value;
// if ( src_value instanceof WorkOrder ) {
// System.out.println("workorder value");
// }
// elements like Presentation may not have a Content Description
// the one returned may not have a container
if ( src_value.eContainer() != null ) {
String xmlId = getXmlId(src_value.getGuid());
xmlLib.setReferenceValue(targetObj, feature.getName(), xmlId, src_value.getType());
iteratEDataObject(src_value);
}
} else if ( !isDiscarded(srcObj) ) {
// if ( targetObj instanceof ContentCategoryPackage) {
// System.out.println("hrre");
// }
if ( value instanceof WorkOrderType ) {
value = ((WorkOrderType)value).getName();
}
xmlLib.setAtributeFeatureValue(targetObj, feature.getName(), value);
}
} catch (Exception e) {
String msg = XmlExportResources.getString("XmlExport.XmlExportService.feature_error", //$NON-NLS-1$
LibraryUtil.getTypeName(srcObj),
feature.getName());
logger.logError(msg, e);
}
}
}
// goid of processed element
private List processedElements = new ArrayList();
private boolean isProcessed(String guid) {
return processedElements.contains(guid);
}
private void setProcessed(String guid) {
if ( !processedElements.contains(guid) ) {
processedElements.add(guid);
}
}
private List getTopmostUserPackage(MethodPlugin plugin) {
MethodPackage pkg_core_content =
UmaUtil.findMethodPackage(plugin, ModelStructure.DEFAULT.coreContentPath);
MethodPackage pkg_custom_categories =
UmaUtil.findMethodPackage(plugin, ModelStructure.DEFAULT.customCategoryPath);
MethodPackage pkg_disciplines =
UmaUtil.findMethodPackage(plugin, ModelStructure.DEFAULT.disciplineDefinitionPath);
MethodPackage pkg_domains =
UmaUtil.findMethodPackage(plugin, ModelStructure.DEFAULT.domainPath);
MethodPackage pkg_rolesets =
UmaUtil.findMethodPackage(plugin, ModelStructure.DEFAULT.roleSetPath);
MethodPackage pkg_tools =
UmaUtil.findMethodPackage(plugin, ModelStructure.DEFAULT.toolPath);
MethodPackage pkg_wptypes =
UmaUtil.findMethodPackage(plugin, ModelStructure.DEFAULT.workProductTypePath);
MethodPackage pkg_cp =
UmaUtil.findMethodPackage(plugin, ModelStructure.DEFAULT.capabilityPatternPath);
MethodPackage pkg_dp =
UmaUtil.findMethodPackage(plugin, ModelStructure.DEFAULT.deliveryProcessPath);
MethodPackage pkg_proc_contribution =
UmaUtil.findMethodPackage(plugin, ModelStructure.DEFAULT.processContributionPath);
List pkgs = new ArrayList();
pkgs.add(pkg_core_content);
pkgs.add(pkg_custom_categories);
pkgs.add(pkg_disciplines);
pkgs.add(pkg_domains);
pkgs.add(pkg_rolesets);
pkgs.add(pkg_tools);
pkgs.add(pkg_wptypes);
pkgs.add(pkg_cp);
pkgs.add(pkg_dp);
pkgs.add(pkg_proc_contribution);
return pkgs;
// List systemPkgs = TngUtil.getAllSystemPackages(plugin);
//
// List unprocessedPkgs = new ArrayList(plugin.getMethodPackages());
// while (unprocessedPkgs.size() > 0 ) {
// MethodPackage pkg = (MethodPackage) unprocessedPkgs.remove(0);
// if ( !systemPkgs.contains(pkg) ) {
// if ( !pkgs.contains(pkg) ) {
// pkgs.add(pkg);
// }
// continue;
// }
//
// for ( Iterator it = pkg.getChildPackages().iterator(); it.hasNext(); ) {
// MethodPackage p = (MethodPackage)it.next();
// if ( systemPkgs.contains(p) )
// {
// if ( !unprocessedPkgs.contains(p) ) {
// unprocessedPkgs.add(p);
// }
// } else {
// if ( !pkgs.contains(p) ) {
// pkgs.add(p);
// }
// }
// }
//
// if ( unprocessedPkgs.size() == 0 ) {
// break;
// }
// }
//
// // need to include the content packages
// pkgs.addAll(TngUtil.getContentCategoryPackages(plugin));
}
// private boolean isSystemPackage(EDataObject element) {
//
// if ( !(element instanceof MethodPackage) ) {
// return false;
// }
//
// MethodPlugin plugin = LibraryUtil.getMethodPlugin(element);
// if ( plugin == null ) {
// return false;
// }
//
// return TngUtil.getAllSystemPackages(plugin).contains(element);
//
// }
}