blob: 18673764288f3b1948efb09f1b2ef63e0d414444 [file] [log] [blame]
package org.eclipse.epf.library.util;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.epf.library.LibraryServiceUtil;
import org.eclipse.epf.library.configuration.ConfigurationHelper;
import org.eclipse.epf.library.configuration.DefaultElementRealizer;
import org.eclipse.epf.library.configuration.ElementRealizer;
import org.eclipse.epf.library.edit.util.DescriptorPropUtil;
import org.eclipse.epf.library.edit.util.LibraryEditUtil;
import org.eclipse.epf.library.edit.util.ProcessPropUtil;
import org.eclipse.epf.persistence.MultiFileXMIResourceImpl;
import org.eclipse.epf.services.ILibraryPersister;
import org.eclipse.epf.uma.Deliverable;
import org.eclipse.epf.uma.Descriptor;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.MethodLibrary;
import org.eclipse.epf.uma.MethodPlugin;
import org.eclipse.epf.uma.Process;
import org.eclipse.epf.uma.Role;
import org.eclipse.epf.uma.RoleDescriptor;
import org.eclipse.epf.uma.Task;
import org.eclipse.epf.uma.TaskDescriptor;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.uma.WorkProduct;
import org.eclipse.epf.uma.WorkProductDescriptor;
public class SynFreeProcessConverter {
private boolean debug = true;
private ElementRealizer realizer;
private MethodConfiguration config;
private ElementRealizer getRealizer() {
return realizer;
}
private void setRealizer(ElementRealizer realizer) {
this.realizer = realizer;
}
private Set<Resource> resouresToSave;
private UmaPackage up = UmaPackage.eINSTANCE;
public SynFreeProcessConverter() {
}
public SynFreeProcessConverter(MethodConfiguration config) {
this.config = config;
}
private MethodConfiguration getConfig() {
return config;
}
public void convertLibrary(MethodLibrary lib) {
if (lib == null) {
return;
}
List<MethodPlugin> plugins = lib.getMethodPlugins();
resouresToSave = new HashSet<Resource>();
for (int i = 0; i < plugins.size(); i++) {
convertPlugin(plugins.get(i), false);
}
save();
}
public void convertPlugin(MethodPlugin plugin, boolean toSave) {
if (plugin == null) {
return;
}
if (debug) {
System.out.println("LD> convertPlugin: " + plugin);
System.out.println("");
}
if (toSave) {
resouresToSave = new HashSet<Resource>();
}
Set<Process> processes = LibraryEditUtil.getInstance().collectProcesses(plugin);
for (Process proc : processes) {
convertProcess(proc, false);
}
if (toSave) {
save();
}
}
public void convertProcess(Process proc, boolean toSave) {
if (proc == null || proc.getDefaultContext() == null) {
return;
}
if (debug) {
System.out.println("LD> convertProcess: " + proc);
System.out.println("");
}
MethodConfiguration c = getConfig();
if (c == null) {
c = proc.getDefaultContext();
}
ElementRealizer r = DefaultElementRealizer.newElementRealizer(c);
setRealizer(r);
Set<Descriptor> descriptors = LibraryEditUtil.getInstance().collectDescriptors(proc);
if (toSave) {
resouresToSave = new HashSet<Resource>();
}
for (Descriptor des : descriptors) {
convert(des);
}
ProcessPropUtil.getProcessPropUtil().setSynFree(proc, true);
if (toSave) {
save();
}
}
private void convert(Descriptor des) {
boolean oldDeliver = des.eDeliver();
try {
if (oldDeliver) {
des.eSetDeliver(false);
}
convert_(des);
} finally {
if (oldDeliver) {
des.eSetDeliver(oldDeliver);
}
}
}
private void convert_(Descriptor des) {
Resource res = des.eResource();
if (res == null) {
return;
}
if (debug) {
System.out.println("LD> convert: " + des);
}
if (des instanceof TaskDescriptor) {
convertTd((TaskDescriptor) des);
} else if (des instanceof RoleDescriptor) {
convertRd((RoleDescriptor) des);
} else if (des instanceof WorkProductDescriptor) {
convertWpd((WorkProductDescriptor) des);
}
convertSimpleTextAttributes(des);
resouresToSave.add(res);
}
private void convertSimpleTextAttributes(Descriptor des) {
DescriptorPropUtil propUtil = DescriptorPropUtil.getDesciptorPropUtil();
MethodElement element = propUtil.getLinkedElement(des);
if (element == null) {
return;
}
if (! propUtil.hasNoValue(des.getName())) {
if (! des.getName().equals(element.getName())) {
propUtil.setNameRepalce(des, true);
}
}
if (! propUtil.hasNoValue(des.getPresentationName())) {
if (! des.getPresentationName().equals(element.getPresentationName())) {
propUtil.setPresentationNameRepalce(des, true);
}
}
if (! propUtil.hasNoValue(des.getBriefDescription())) {
if (! des.getBriefDescription().equals(element.getBriefDescription())) {
propUtil.setBriefDesRepalce(des, true);
}
}
}
private void convertTd(TaskDescriptor td) {
Task task = (Task) getLinkedElement(td);
if (task == null) {
return;
}
convertManyEReference(td, task,
up.getTaskDescriptor_PerformedPrimarilyBy(),
up.getTaskDescriptor_PerformedPrimarilyByExcluded(),
up.getTask_PerformedBy());
convertManyEReference(td, task,
up.getTaskDescriptor_AdditionallyPerformedBy(),
up.getTaskDescriptor_AdditionallyPerformedByExclude(),
up.getTask_AdditionallyPerformedBy());
convertManyEReference(td, task,
up.getTaskDescriptor_MandatoryInput(),
up.getTaskDescriptor_MandatoryInputExclude(),
up.getTask_MandatoryInput());
convertManyEReference(td, task,
up.getTaskDescriptor_OptionalInput(),
up.getTaskDescriptor_OptionalInputExclude(),
up.getTask_OptionalInput());
convertManyEReference(td, task,
up.getTaskDescriptor_Output(),
up.getTaskDescriptor_OutputExclude(),
up.getTask_Output());
// convertManyEReference(td, task,
// up.getTaskDescriptor_SelectedSteps(),
// up.getTaskDescriptor_SelectedStepsExclude(),
// up.getTask_Steps());
}
private void convertManyEReference(Descriptor ownerDescriptor, MethodElement ownerLinkedElement,
EReference dFeature, EReference dFeatureExclude, EReference efeature) {
List<MethodElement> elements = ConfigurationHelper.calc0nFeatureValue(
ownerLinkedElement, efeature, getRealizer());
List<RoleDescriptor> descriptors = ConfigurationHelper.calc0nFeatureValue(
ownerDescriptor, dFeature, getRealizer());
//exclude list and local list
List<MethodElement> excludeList = (List<MethodElement> ) ownerDescriptor.eGet(dFeatureExclude);
List<Descriptor> localList = new ArrayList<Descriptor>();
if (elements != null && !elements.isEmpty()) {
Set<MethodElement> elementSet = new HashSet<MethodElement>(elements);
List<MethodElement> linkedElements = new ArrayList<MethodElement>();
Set<MethodElement> linkedElementSet = new HashSet<MethodElement>();
if (descriptors != null && !descriptors.isEmpty()) {
for (Descriptor des : descriptors) {
MethodElement linkedElement = getLinkedElement(des);
if (linkedElement == null) {
localList.add(des);
} else {
linkedElementSet.add(linkedElement);
if (! elements.contains(linkedElement)) {
localList.add(des);
}
}
}
}
for (MethodElement element : elements) {
if (! linkedElementSet.contains(element)) {
excludeList.add(element);
}
}
}
//Handle localList
DescriptorPropUtil descriptorPropUtil = DescriptorPropUtil.getDesciptorPropUtil();
for (Descriptor des : localList) {
descriptorPropUtil.addLocalUse(des, ownerDescriptor, dFeature);
}
}
private void convertRd(RoleDescriptor rd) {
Role role = (Role) getLinkedElement(rd);
if (role == null) {
return;
}
convertManyEReference(rd, role,
up.getRoleDescriptor_ResponsibleFor(),
up.getRoleDescriptor_ResponsibleForExclude(),
up.getRole_ResponsibleFor());
}
private void convertWpd(WorkProductDescriptor wpd) {
WorkProduct wp = (WorkProduct) getLinkedElement(wpd);
if (wp == null) {
return;
}
if (wp instanceof Deliverable) {
convertManyEReference(wpd, wp, up
.getWorkProductDescriptor_DeliverableParts(), up
.getWorkProductDescriptor_DeliverablePartsExclude(), up
.getDeliverable_DeliveredWorkProducts());
}
}
private void save() {
ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil
.getCurrentPersister().getFailSafePersister();
try {
for (Iterator<Resource> it = resouresToSave.iterator(); it
.hasNext();) {
MultiFileXMIResourceImpl res = (MultiFileXMIResourceImpl) it
.next();
persister.save(res);
}
persister.commit();
} catch (Exception e) {
persister.rollback();
e.printStackTrace();
} finally {
}
}
private MethodElement getLinkedElement(Descriptor des) {
MethodElement element = DescriptorPropUtil.getDesciptorPropUtil().getLinkedElement(des);
if (element == null) {
return null;
}
return ConfigurationHelper.getCalculatedElement(element, getRealizer());
}
}