blob: 64ecfd220dff919e8b8d111f85afb17b2c740b85 [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.importing.xml.services;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.epf.common.service.versioning.VersionUtil;
import org.eclipse.epf.common.ui.util.MsgBox;
import org.eclipse.epf.common.ui.util.MsgDialog;
import org.eclipse.epf.common.utils.ExtensionHelper;
import org.eclipse.epf.dataexchange.util.ContentProcessor;
import org.eclipse.epf.dataexchange.util.IResourceHandler;
import org.eclipse.epf.export.services.DiagramHandler;
import org.eclipse.epf.export.xml.ExportXMLResources;
import org.eclipse.epf.export.xml.services.FeatureManager;
import org.eclipse.epf.export.xml.services.XMLLibrary;
import org.eclipse.epf.importing.ImportPlugin;
import org.eclipse.epf.importing.ImportResources;
import org.eclipse.epf.importing.services.ConfigurationImportService;
import org.eclipse.epf.importing.services.FileModifyChecker;
import org.eclipse.epf.importing.services.LibraryImportManager;
import org.eclipse.epf.importing.wizards.PluginModifyInfo;
import org.eclipse.epf.importing.wizards.SelectImportConfigurationSource;
import org.eclipse.epf.importing.xml.ImportXMLPlugin;
import org.eclipse.epf.importing.xml.ImportXMLResources;
import org.eclipse.epf.library.LibraryService;
import org.eclipse.epf.library.edit.util.DescriptorPropUtil;
import org.eclipse.epf.library.edit.util.MethodLibraryPropUtil;
import org.eclipse.epf.library.edit.util.MethodPluginPropUtil;
import org.eclipse.epf.library.services.SafeUpdateController;
import org.eclipse.epf.library.util.LibraryUtil;
import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
import org.eclipse.epf.persistence.migration.IMigrator;
import org.eclipse.epf.persistence.migration.MappingUtil;
import org.eclipse.epf.persistence.refresh.RefreshJob;
import org.eclipse.epf.services.IFileBasedLibraryPersister;
import org.eclipse.epf.services.ILibraryPersister;
import org.eclipse.epf.uma.UmaFactory;
import org.eclipse.epf.uma.ecore.IModelObject;
import org.eclipse.epf.xml.uma.Activity;
import org.eclipse.epf.xml.uma.BreakdownElement;
import org.eclipse.epf.xml.uma.CapabilityPattern;
import org.eclipse.epf.xml.uma.ContentCategory;
import org.eclipse.epf.xml.uma.ContentCategoryPackage;
import org.eclipse.epf.xml.uma.ContentPackage;
import org.eclipse.epf.xml.uma.DeliveryProcess;
import org.eclipse.epf.xml.uma.Discipline;
import org.eclipse.epf.xml.uma.Domain;
import org.eclipse.epf.xml.uma.Guidance;
import org.eclipse.epf.xml.uma.MethodElement;
import org.eclipse.epf.xml.uma.MethodElementProperty;
import org.eclipse.epf.xml.uma.MethodLibrary;
import org.eclipse.epf.xml.uma.MethodPackage;
import org.eclipse.epf.xml.uma.MethodPlugin;
import org.eclipse.epf.xml.uma.ProcessComponent;
import org.eclipse.epf.xml.uma.ProcessPackage;
import org.eclipse.epf.xml.uma.TaskDescriptor;
import org.eclipse.epf.xml.uma.UmaPackage;
import org.eclipse.epf.xml.uma.WorkOrder;
import org.eclipse.epf.xml.uma.WorkOrderType;
import org.eclipse.osgi.util.NLS;
/**
* Xml import service class to process the importing task
*
* @author Jinhua Xi
* @since 1.0
*/
public class ImportXMLService {
private List unlockedPlugins;
private boolean error = false;
private Map renameElementMap = new HashMap();
private boolean overwrite = false;
private int mergeLevel = 0;
private IStatus fileCheckedOutStatus = null;
private String xmlPath;
protected XMLLibrary xmlLib;
private UmaLibrary umaLib;
private ImportXMLogger logger = new ImportXMLogger();
private List discardedElements = new ArrayList();
private DiagramHandler diagramHandler;
//tds with steps
private Map<String, TaskDescriptor> tdMap;
// map xml WorkOrder to uma WorkOrder
Map workOrderMap = new HashMap();
private IMigrator migrator;
private boolean checkBasePlugins = true;
private boolean isBaseLibSynFree = false;
/**
* The constructor
*/
public ImportXMLService() {
}
public static ImportXMLService newInstance() {
Object obj = ExtensionHelper.create(ImportXMLService.class, null);
if (obj instanceof ImportXMLService) {
return (ImportXMLService) obj;
}
return new ImportXMLService();
}
/**
* Loads the xml file.
* @param xmlPath
* @return true if succeeds.
*/
public boolean loadXml(final String xmlPath) {
String versionError = versionCheck(xmlPath, ImportXMLResources.importXMLWizard_title);
if (versionError != null) {
return false;
}
this.xmlPath = xmlPath;
logger.logMessage("Loading xml library ..."); //$NON-NLS-1$
boolean ret = false;
try {
this.xmlLib = new XMLLibrary(null, logger, xmlPath);
this.xmlLib.load();
ret = checkOldPlugins();
} catch (Exception e) {
logger.logError(NLS.bind(
ExportXMLResources.xmlLibrary_error_load_xml, xmlPath), e);
final String errStr = e.toString();
SafeUpdateController.syncExec(new Runnable() {
public void run() {
ImportXMLPlugin.getDefault().getMsgDialog().displayError(
NLS.bind(ExportXMLResources.xmlLibrary_error_load_xml, xmlPath), errStr);
}
});
}
return ret;
}
private boolean checkOldPlugins() {
unlockedPlugins = new ArrayList();
List fileNameToCheck = new ArrayList();
Map map = new HashMap();
Map guidMap = new HashMap();
List basePlugins = LibraryService.getInstance().getCurrentMethodLibrary()
.getMethodPlugins();
for (int i = 0; i < basePlugins.size(); i++) {
org.eclipse.epf.uma.MethodPlugin plugin = (org.eclipse.epf.uma.MethodPlugin) basePlugins.get(i);
map.put(plugin.getName(), plugin);
guidMap.put(plugin.getGuid(), plugin);
}
List plugins = ((MethodLibrary) xmlLib.getRoot()).getMethodPlugin();
List guids = new ArrayList();
for (int i=0; i<plugins.size(); i++) {
MethodElement elem = (MethodElement) plugins.get(i);
guids.add(elem.getId());
org.eclipse.epf.uma.MethodPlugin basePlugin =
(org.eclipse.epf.uma.MethodPlugin) map.get(elem.getName());
boolean toAdd = false;
if (basePlugin != null && ! basePlugin.getGuid().equals(elem.getId())
&& ! basePlugin.getUserChangeable()) {
toAdd = true;
} else {
basePlugin =
(org.eclipse.epf.uma.MethodPlugin) guidMap.get(elem.getId());
if (basePlugin != null /*&& ! basePlugin.getName().equals(elem.getName())*/
&& ! basePlugin.getUserChangeable()) {
toAdd = true;
}
}
if (toAdd) {
unlockedPlugins.add(basePlugin.getGuid());
basePlugin.setUserChangeable(new Boolean(true));
Resource res = basePlugin.eResource();
if (res != null && res.getURI() != null) {
String fileName = res.getURI().toFileString();
fileNameToCheck.add(fileName);
}
}
}
if (fileNameToCheck.size() > 0) {
final List modifiedFiles = fileNameToCheck;
SafeUpdateController.syncExec(new Runnable() {
public void run() {
fileCheckedOutStatus = FileModifyChecker.checkModify(modifiedFiles);
}
});
}
if (! unlockedPlugins.isEmpty() && (fileCheckedOutStatus != null)
&& !fileCheckedOutStatus.isOK()) {
// log error
SafeUpdateController.syncExec(new Runnable() {
public void run() {
String title = ImportXMLResources.importXMLWizard_title;
String msg = ImportXMLResources.importXMLService_import_failed;
new MsgDialog(ImportPlugin.getDefault())
.displayError(title, msg, fileCheckedOutStatus);
}
});
return false;
}
final PluginModifyInfo modifyInfo = SelectImportConfigurationSource
.checkModify(guids, MsgBox.getDefaultShell(), false);
// allow user to proceed with locked plugins
if ( modifyInfo.lockedPlugins.size() > 0 ) {
final boolean ret[] = new boolean[1];
SafeUpdateController.syncExec(new Runnable() {
public void run() {
String WIZARD_TITLE = ImportXMLResources.importXMLWizard_title;
String message = modifyInfo.getLockedMessage().toString() +
ImportResources.ImportPluginWizard_confirm_continue;
ret[0] = ImportXMLPlugin
.getDefault().getMsgDialog().displayConfirmation(WIZARD_TITLE, message);
}
});
return ret[0];
}
return true;
}
/**
* @return the log file.
*/
public File getLogPath() {
return logger.getLogPath();
}
/**
* Dispose
*/
public void dispose() {
discardedElements.clear();
workOrderMap.clear();
logger.dispose();
}
/**
* Does XML export.
* @param monitor
* @throws Exception
*/
public void doImport(IProgressMonitor monitor) throws Exception {
isBaseLibSynFree = MethodLibraryPropUtil.getMethodLibraryPropUtil()
.isSynFree(
LibraryService.getInstance().getCurrentMethodLibrary());
boolean refresh = RefreshJob.getInstance().isEnabled();
try {
if (refresh) {
// disable resource refreshing during import
//
RefreshJob.getInstance().setEnabled(false);
}
handleTypeChanges();
IResourceHandler handler = new ImportResourceHandler(new File(
xmlPath).getParentFile(), new File(LibraryService
.getInstance().getCurrentMethodLibraryLocation()));
ContentProcessor contentProc = new ContentProcessor(handler,
this.logger);
diagramHandler = new DiagramHandler(new File(
xmlPath).getParentFile(), new File(LibraryService
.getInstance().getCurrentMethodLibraryLocation())) {
//[0]: sourceFile
//[1]: targetFile
protected File[] getFiles(org.eclipse.epf.uma.MethodElement elem) {
File[] files = super.getFiles(elem, false);
IModelObject xmlObj = xmlLib.getElement(elem.getGuid());
if (xmlObj instanceof org.eclipse.epf.xml.uma.Process) {
org.eclipse.epf.xml.uma.Process proc =
(org.eclipse.epf.xml.uma.Process) xmlObj;
String uri = proc.getDiagramURI();
if (uri != null && uri.length() > 0) {
File file = new File(getSourceLibRoot(), uri);
//System.out.println("LD: file: " + file);
if (file.exists()) {
files[0] = file;
files[1] = new File(getTargetLibRoot(), uri);
} else {
//System.out.println("LD: files[0]: " + files[0]);
}
}
}
return files;
}
};
this.xmlLib.fixLibraryForImport();
// make sure all the dependent plugins are there
List referencedPlugins = xmlLib.getReferencedPlugins();
if (referencedPlugins.size() > 0) {
org.eclipse.epf.uma.MethodLibrary library = org.eclipse.epf.library.LibraryService
.getInstance().getCurrentMethodLibrary();
if (library != null) {
List plugins = library.getMethodPlugins();
for (Iterator it = plugins.iterator(); it.hasNext();) {
String id = ((org.eclipse.epf.uma.MethodPlugin) it
.next()).getGuid();
referencedPlugins.remove(id);
}
}
}
if (isCheckBasePlugins() && referencedPlugins.size() > 0) {
Map<String, String> map = xmlLib.getGuidToPlugNameMap();
for (Iterator it = referencedPlugins.iterator(); it.hasNext();) {
String nameAndId = ""; //$NON-NLS-1$
String id = (String) it.next();
if (map != null) {
String name = map.get(id);
if (name != null) {
nameAndId += name + ", ";//$NON-NLS-1$
}
}
nameAndId += id;
logger.logError(NLS.bind(ImportXMLResources.importXMLService_missing_plugin, nameAndId),
null);
}
throw new Exception(
ImportXMLResources.importXMLService_error_missing_plugins);
}
this.umaLib = new UmaLibrary(renameElementMap, contentProc, logger, overwrite);
this.umaLib.setMergeLevel(mergeLevel);
IModelObject xmlRoot = this.xmlLib.getRoot();
IModelObject umaRoot = this.umaLib.getRoot();
logger.logMessage("create target library elements ..."); //$NON-NLS-1$
creatEDataObjectTree(xmlRoot, umaRoot);
logger
.logMessage("copying all feature values for target library elements ..."); //$NON-NLS-1$
iteratEDataObject((MethodElement) xmlRoot);
logger.logMessage("fix the target library ..."); //$NON-NLS-1$
umaLib.fixLibrary();
umaLib.fixTaskDescriptors(tdMap);
LibraryImportManager.handleNameReplace(renameElementMap);
diagramHandler.postRegisterElements();
// delete the un-needed elements
logger.logMessage("delete unneeded elements ..."); //$NON-NLS-1$
umaLib.deleteElements();
final List modifiedFiles = FileModifyChecker.getModifiedFiles(LibraryService.getInstance().
getCurrentMethodLibrary().eResource().getResourceSet());
modifiedFiles.addAll(diagramHandler.getModifiedFiles());
final IStatus fileCheckedOutStatus = FileModifyChecker.syncExecCheckModify(modifiedFiles);
if (fileCheckedOutStatus.isOK()) {
logger.logMessage("saving target library ..."); //$NON-NLS-1$
List configs = LibraryService.getInstance()
.getCurrentMethodLibrary().getPredefinedConfigurations();
int configSz = configs == null ? 0 : configs.size();
for (int i=0; i<configSz; i++) {
org.eclipse.epf.uma.MethodConfiguration config =
(org.eclipse.epf.uma.MethodConfiguration ) configs.get(i);
LibraryUtil.validateMethodConfiguration(null, config);
}
if (configSz != 0) {
org.eclipse.epf.uma.MethodLibrary currLib = LibraryService.getInstance().getCurrentMethodLibrary();
ILibraryPersister persister = ((MultiFileResourceSetImpl) currLib.eResource().getResourceSet()).getPersister();
if (persister instanceof IFileBasedLibraryPersister) {
IFileBasedLibraryPersister ip = (IFileBasedLibraryPersister) persister;
File configFolder = ip.getDefaultMethodConfigurationFolder(currLib);
if (configFolder != null) {
ip.setDefaultMethodConfigurationFolder(currLib, configFolder);
} else {
throw new Exception(
ImportXMLResources.importXMLService_import_failed);
}
}
}
// don't refresh the workspace
if (unlockedPlugins != null && ! unlockedPlugins.isEmpty()) {
LibraryImportManager.lockUnlockedPlugins(unlockedPlugins);
}
if (isBaseLibSynFree && !isSynFreeLib()) {
MethodLibraryPropUtil libPropUtil = MethodLibraryPropUtil
.getMethodLibraryPropUtil();
org.eclipse.epf.uma.MethodLibrary lib = LibraryService
.getInstance().getCurrentMethodLibrary();
if (!libPropUtil.isSynFree(lib)) {
libPropUtil.setSynFree(lib, true);
}
MethodPluginPropUtil pluginPropUtil = MethodPluginPropUtil
.getMethodPluginPropUtil();
for (org.eclipse.epf.uma.MethodPlugin p : lib
.getMethodPlugins()) {
if (!pluginPropUtil.isSynFree(p)) {
pluginPropUtil.setSynFree(p, true);
}
}
}
LibraryUtil.saveLibrary(LibraryService.getInstance()
.getCurrentMethodLibrary(), false, false);
diagramHandler.execute();
logger.logMessage("re-open target library ..."); //$NON-NLS-1$
// LibraryService.getInstance().reopenCurrentMethodLibrary();
postImportOperation(monitor);
if (migrator != null) {
org.eclipse.epf.uma.MethodLibrary lib = LibraryService.getInstance().getCurrentMethodLibrary();
migrator.migrateXmlImportedLib(lib, monitor);
LibraryService.getInstance().reopenCurrentMethodLibrary();
}
logger.logMessage("import completed successfully ..."); //$NON-NLS-1$
} else {
SafeUpdateController.syncExec(new Runnable() {
public void run() {
String title = ImportXMLResources.importXMLWizard_title;
String msg = ImportXMLResources.importXMLService_import_failed;
new MsgDialog(ImportXMLPlugin.getDefault())
.displayError(title, msg, fileCheckedOutStatus);
}
});
}
//ResourceUtil.refreshResources(LibraryService.getInstance()
// .getCurrentMethodLibrary(), monitor);
} catch (Exception e) {
logger.logError(NLS.bind(ImportXMLResources.importXMLService_import_failed, e.getMessage()), e);
throw e;
} finally {
if (refresh) {
// re-enable resource refreshing
//
RefreshJob.getInstance().setEnabled(true);
}
}
}
protected void postImportOperation(IProgressMonitor monitor) throws Exception {
// Reopen the library.
LibraryService.getInstance().reopenCurrentMethodLibrary();
}
private void creatEDataObjectTree(IModelObject xmlObj, IModelObject umaObj) {
for (Iterator it = xmlObj.eContents().iterator(); it.hasNext();) {
IModelObject child = (IModelObject) it.next();
createRmcObject(child, umaObj);
}
}
private void createRmcObject(IModelObject xmlElement,
IModelObject targetContainer) {
if (xmlElement instanceof MethodElementProperty) {
return;
}
// get the targetContainer's containing feature
EStructuralFeature feature = xmlElement.eContainmentFeature();
createRmcObject(xmlElement, targetContainer, feature.getName());
}
private void createRmcObject(IModelObject xmlElement,
IModelObject targetContainer, String containmentXmlFeature) {
try {
if (xmlElement == null) {
return;
}
IModelObject umaElement = null;
// don't create content category package since in uma, it's
// seperated based on type
if (xmlElement instanceof MethodPlugin) {
MethodPlugin plugin = (MethodPlugin) xmlElement;
umaElement = umaLib.createMethodPlugin(plugin.getId(), plugin
.getName());
} else if (xmlElement instanceof ContentCategoryPackage) {
// don't create, do nothing
// mark as discarded so we don't need to copy it's attributes
setDiscarded(((ContentCategoryPackage) xmlElement).getId());
} else if ((xmlElement instanceof ContentCategory)
&& !(xmlElement.eContainer() instanceof Domain
|| xmlElement.eContainer() instanceof Discipline)
|| (xmlElement.eContainer() instanceof ContentCategoryPackage)) {
// create the content categories for root content categories,
// not for sub-domain and sub-discipline
// 154143 - import xml did not reserve the sub-discipline structure
String pluginId = getPlugin(xmlElement).getId();
umaElement = umaLib.createContentCategory(pluginId, xmlElement
.eClass().getName(), xmlElement.getType().getName(),
xmlLib.getElementId(xmlElement));
} else {
// if this is root level package, find the corresponding
// container for the UMA object
if (xmlElement instanceof MethodPackage
&& xmlElement.eContainer() instanceof MethodPlugin) {
if (xmlElement instanceof ContentPackage) {
targetContainer = umaLib
.getContentRootPackage(targetContainer);
} else if (xmlElement instanceof ProcessComponent) {
Object proc = ((ProcessComponent) xmlElement)
.getProcess();
if (proc instanceof CapabilityPattern) {
targetContainer = umaLib
.getCapabilityPatternRootPackage(targetContainer);
} else if (proc instanceof DeliveryProcess) {
targetContainer = umaLib
.getDeliveryProcessRootPackage(targetContainer);
}
} else if (xmlElement instanceof ProcessPackage) {
List procs = xmlLib
.getAllProcesses((MethodPackage) xmlElement);
if (procs != null && procs.size() > 0) {
Object proc = procs.get(0);
if (proc instanceof CapabilityPattern) {
targetContainer = umaLib
.getCapabilityPatternRootPackage(targetContainer);
} else if (proc instanceof DeliveryProcess) {
targetContainer = umaLib
.getDeliveryProcessRootPackage(targetContainer);
}
}
}
}
if (targetContainer instanceof org.eclipse.epf.uma.TaskDescriptor &&
containmentXmlFeature.equals("step")) { //$NON-NLS-1$
return;
}
// get the containment feature so we can create the object of
// the same type
umaElement = umaLib.createElement(targetContainer,
containmentXmlFeature, xmlElement.eClass().getName(),
xmlElement.getType().getName(), xmlLib
.getElementId(xmlElement));
if (xmlElement instanceof TaskDescriptor) {
TaskDescriptor td = (TaskDescriptor) xmlElement;
if (td.getTask() != null) {
List steps = td.getStep();
if (steps != null && !steps.isEmpty()) {
if (tdMap == null) {
tdMap = new HashMap<String, TaskDescriptor>();
}
tdMap.put(td.getId(), td);
}
}
}
// xml WorkOrder does not have an id, need to map the uma Object
if (xmlElement instanceof WorkOrder) {
workOrderMap.put(xmlElement, umaElement);
}
}
// recursive,
// note, uma element might be null since we can't determine the
// owner of the element yet
creatEDataObjectTree(xmlElement, umaElement);
} catch (Exception e) {
// log the error and continue???
e.printStackTrace();
}
}
private MethodPlugin getPlugin(EObject element) {
while ((element != null) && !(element instanceof MethodPlugin)) {
element = element.eContainer();
}
return (MethodPlugin) element;
}
private IModelObject getRmcObject(MethodElement xmlObj) {
if (xmlObj instanceof MethodLibrary) {
return umaLib.getRoot();
} else {
String id = xmlObj.getId();
return this.umaLib.getElement(id);
}
}
private void iteratEDataObject(MethodElement srcObj) {
iteratEDataObject_(srcObj);
IModelObject targetObj = getRmcObject(srcObj);
if (targetObj instanceof org.eclipse.epf.uma.MethodElement) {
diagramHandler.registerElement((org.eclipse.epf.uma.MethodElement) targetObj);
}
}
private void iteratEDataObject_(MethodElement srcObj) {
logger
.logMessage(" === processing element " + srcObj.getType().getName() + ": " + srcObj.getName()); //$NON-NLS-1$ //$NON-NLS-2$
if (isProcessed(srcObj.getId())) {
return;
}
setProcessed(srcObj.getId());
// if object is not created, it's xml wrapper package
if (srcObj instanceof ContentCategoryPackage) {
// iterate the child packages
for (Iterator it = ((ContentCategoryPackage) srcObj)
.getContentCategory().iterator(); it.hasNext();) {
iteratEDataObject((MethodElement) it.next());
}
return;
}
IModelObject targetObj = getRmcObject(srcObj);
EClass eClass = srcObj.eClass();
handleDescriptorExtraReferences(srcObj, targetObj);
EList features = eClass.getEAllStructuralFeatures();
boolean isNewElement = umaLib.isNewElement(srcObj.getId()) || srcObj instanceof MethodLibrary;
boolean isOldPlugin = !isNewElement && (srcObj instanceof MethodPlugin);
Set<EStructuralFeature> seenRmcFeatures = new HashSet<EStructuralFeature>();
for (Iterator it = features.iterator(); it.hasNext();) {
EStructuralFeature feature = (EStructuralFeature) it.next();
if (FeatureManager.INSTANCE.isUnneededXmlFeature(feature.getName())) {
continue;
}
if (isOldPlugin && UmaPackage.eINSTANCE.getMethodPlugin_UserChangeable() == feature) {
continue;
}
Object value = srcObj.eGet(feature);
try {
if (value == null) {
umaLib.handleNullXmlValue(srcObj, targetObj, feature.getName());
continue;
}
boolean isMep = feature.getName().equals("methodElementProperty"); //$NON-NLS-1$
if (value instanceof List && ! isMep) {
umaLib.initListValueMerge(srcObj, targetObj, feature.getName(),
(List) value, seenRmcFeatures);
for (Iterator itv = ((List) value).iterator(); itv
.hasNext();) {
Object src_value = itv.next();
if (src_value instanceof String) {
// it's an id reference
umaLib.setReferenceValue(targetObj, feature
.getName(), (String) src_value);
} else if (src_value instanceof MethodElement) {
// set the reference
MethodElement e = (MethodElement) src_value;
String guid = e.getId();
// don't set the containment feature value since
// it's already handled
// when creating the library structure
if (!isDiscarded(guid) && e.eContainer() != srcObj) {
umaLib.setReferenceValue(targetObj, feature
.getName(), guid);
}
iteratEDataObject((MethodElement) src_value);
} else if (src_value instanceof WorkOrder) {
// WorkOrder is not method element and does not have
// an id, need special handling
// set the prede
WorkOrder wr = (WorkOrder) src_value;
Object umaWr = workOrderMap.get(wr);
//umaLib.setWorkOrder(umaWr, wr.getValue());
if (umaWr instanceof org.eclipse.epf.uma.WorkOrder) {
umaLib.handleWorkOrder(wr, (org.eclipse.epf.uma.WorkOrder) umaWr);
}
} else {
logger
.logMessage(NLS.bind(ImportXMLResources.importXMLService_element_not_handled, src_value));
}
}
} else if (feature instanceof EReference && ! isMep) {
// get the xml object and iterate again
Object src_value = value;
if (src_value instanceof WorkOrder) {
logger.logMessage("workorder value"); //$NON-NLS-1$
} else if (src_value instanceof String
&& !isDiscarded((String) src_value)) {
// it's an id reference
umaLib.setReferenceValue(targetObj, feature.getName(),
(String) src_value);
} else if (src_value instanceof MethodElement) {
// set the reference
String guid = ((MethodElement) src_value).getId();
if (guid == null) {
logger
.logWarning(NLS.bind(ImportXMLResources.importXMLService_element_without_id, ((MethodElement) src_value)
.getName()));
}
if (!isDiscarded(guid)) {
umaLib.setReferenceValue(targetObj, feature
.getName(), guid);
}
iteratEDataObject((MethodElement) src_value);
} else {
logger
.logWarning(NLS.bind(ImportXMLResources.importXMLService_element_not_handled, src_value));
}
} else {
if (targetObj instanceof ContentCategoryPackage) {
logger.logMessage("hrre"); //$NON-NLS-1$
}
if (value instanceof WorkOrderType) {
value = ((WorkOrderType) value).getName();
}
boolean rename = false;
if (!isNewElement && feature == org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getNamedElement_Name()) {
String oldName = (String)targetObj.eGet(org.eclipse.epf.uma.UmaPackage.eINSTANCE.getNamedElement_Name());
String newName = (String)srcObj.eGet(feature);
if (!newName.equals(oldName)) {
LibraryImportManager.ensureUniqueNameForExistingElement
((org.eclipse.epf.uma.MethodElement) targetObj, oldName, newName, renameElementMap);
rename = true;
}
}
if (!rename) {
umaLib.setAtributeFeatureValue(targetObj,
feature.getName(), value);
}
if (isNewElement && feature == org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getNamedElement_Name()) {
org.eclipse.epf.uma.MethodElement elem = (org.eclipse.epf.uma.MethodElement) targetObj;
EObject ceobj = elem.eContainer();
if (ceobj instanceof org.eclipse.epf.uma.MethodElement &&
! umaLib.isNewElement(((org.eclipse.epf.uma.MethodElement) ceobj).getGuid())) {
LibraryImportManager.ensureUniqueName(ceobj, elem, renameElementMap);
}
}
}
} catch (Exception e) {
// log the error and continue???
e.printStackTrace();
}
}
}
// 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 boolean isDiscarded(String id) {
return discardedElements.contains(id);
}
private void setDiscarded(String id) {
discardedElements.add(id);
}
/**
* Sets overwrite attribute.
* @param b
*/
public void setOverwrite(boolean b) {
overwrite = b;
}
private String versionCheck(final String xmlPath, final String title) {
final String[] ret = new String[1];
ret[0] = null;
SafeUpdateController.syncExec(new Runnable() {
public void run() {
VersionUtil.VersionCheckInfo info = VersionUtil.checkXMLVersion(new File(xmlPath));
if (info == null) {
ret[0] = NLS.bind(ImportXMLResources.versionMismatch_oldData_unknown, new Object[] {
Platform.getProduct().getName()});
} else {
if (info.result < 0) {
try {
migrator = MappingUtil.getMigratorByLibPath(xmlPath);
} catch (Exception e) {
ret[0] = e.toString();
}
if (migrator == null && ret[0] == null) {
if (info.toolID.equals(VersionUtil.getPrimaryToolID())) {
ret[0] = NLS.bind(ImportXMLResources.versionMismatch_oldData, new Object[] {
info.toolVersion, Platform.getProduct().getName()});
} else {
ret[0] = NLS.bind(ImportXMLResources.versionMismatch_oldData_unknown, new Object[] {
Platform.getProduct().getName()});
}
}
} else if (info.result > 0) {
if (info.toolID.equals(VersionUtil.getPrimaryToolID())) {
ret[0] = NLS.bind(ImportXMLResources.versionMismatch_oldTool, new Object[] {
info.toolVersion, Platform.getProduct().getName()});
} else {
ret[0] = NLS.bind(ImportXMLResources.versionMismatch_oldTool_unknown, new Object[] {
Platform.getProduct().getName()});
}
}
}
if (ret[0] != null) {
ImportXMLPlugin.getDefault().getMsgDialog().displayError(title, ret[0]);
}
}
});
return ret[0];
}
public void handleTypeChanges() {
org.eclipse.epf.uma.MethodLibrary baseLib = LibraryService.getInstance()
.getCurrentMethodLibrary();
HashMap baseMap = new HashMap();
ConfigurationImportService.collectPotentialTypeChanged(baseLib, baseMap);
HashMap eClassObjMap = new HashMap();
HashMap importMap = new HashMap();
for (Iterator it = xmlLib.getRoot().eAllContents(); it.hasNext();) {
Object obj = it.next();
if (obj instanceof Guidance ||
obj instanceof Activity) {
MethodElement xmlElement = (MethodElement) obj;
String eClassName = xmlElement.eClass().getName();
Object eClassObj = eClassObjMap.get(eClassName);
if (eClassObj == null) {
EClass objEClass = FeatureManager.INSTANCE.getRmcEClass(eClassName);
if (objEClass != null) {
eClassObj = UmaFactory.eINSTANCE.create(objEClass);
eClassObjMap.put(eClassName, eClassObj);
}
}
if (eClassObj != null) {
importMap.put(xmlElement.getId(), eClassObj);
}
}
}
ConfigurationImportService.handleTypeChanges(baseMap, importMap);
}
private boolean isCheckBasePlugins() {
return checkBasePlugins;
}
public void setCheckBasePlugins(boolean checkBasePlugins) {
this.checkBasePlugins = checkBasePlugins;
}
public void setMergeLevel(int mergeLevel) {
this.mergeLevel = mergeLevel;
}
public boolean isSynFreeLib() {
return xmlLib == null ? false : xmlLib.isSynFreeLib();
}
private void handleDescriptorExtraReferences(MethodElement srcObj,
IModelObject targetObj) {
try {
handleDescriptorExtraReferences_(srcObj, targetObj);
} catch (Exception e) {
logger.logError(e.getMessage(), e);
}
}
private void handleDescriptorExtraReferences_(MethodElement srcObj,
IModelObject targetObj) {
if (!(targetObj instanceof org.eclipse.epf.uma.Descriptor)) {
return;
}
boolean ok = srcObj instanceof org.eclipse.epf.xml.uma.RoleDescriptor
|| srcObj instanceof org.eclipse.epf.xml.uma.WorkProductDescriptor
|| srcObj instanceof org.eclipse.epf.xml.uma.TaskDescriptor;
if (!ok) {
return;
}
org.eclipse.epf.uma.Descriptor tgtDes = (org.eclipse.epf.uma.Descriptor) targetObj;
BreakdownElement srcDes = (BreakdownElement) srcObj;
EList<MethodElementProperty> mepPropList = srcDes.getMethodElementProperty();
if (mepPropList == null || mepPropList.isEmpty()) {
return;
}
for (int i = mepPropList.size() - 1; i >=0; i--) {
MethodElementProperty mep = mepPropList.get(i);
if (mep.getName().startsWith("XML_")) { //$NON-NLS-1$
handleExtraRef(srcDes, tgtDes, mep);
mepPropList.remove(i);
}
}
}
private void handleExtraRef(BreakdownElement srcDes,
org.eclipse.epf.uma.Descriptor tgtDes, MethodElementProperty mep) {
String refName = mep.getName().substring(4);
EStructuralFeature feature = tgtDes.eClass().getEStructuralFeature(
refName);
if (feature instanceof EReference) {
EReference ref = (EReference) feature;
if (ref.isMany()) {
List<org.eclipse.epf.uma.MethodElement> list = (List<org.eclipse.epf.uma.MethodElement>) tgtDes
.eGet(ref);
list.clear();
String[] guidStrList = mep.getValue().split(
DescriptorPropUtil.infoSeperator);
if (guidStrList == null || guidStrList.length == 0) {
return;
}
for (String guid : guidStrList) {
org.eclipse.epf.uma.MethodElement element = (org.eclipse.epf.uma.MethodElement) umaLib
.getElement(guid);
if (element != null) {
list.add(element);
}
}
}
}
}
}