blob: 39668ee11daf7dec1c9ece993889d616159ee16b [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.library.util;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.epf.common.serviceability.MsgBox;
import org.eclipse.epf.common.utils.StrUtil;
import org.eclipse.epf.library.LibraryPlugin;
import org.eclipse.epf.library.LibraryResources;
import org.eclipse.epf.library.LibraryServiceUtil;
import org.eclipse.epf.library.edit.LibraryEditPlugin;
import org.eclipse.epf.library.edit.LibraryEditResources;
import org.eclipse.epf.library.edit.command.DeleteMethodElementCommand;
import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.library.edit.validation.IValidator;
import org.eclipse.epf.library.edit.validation.internal.ContentElementNameValidator;
import org.eclipse.epf.library.edit.validation.internal.ValidatorFactory;
import org.eclipse.epf.services.ILibraryPersister;
import org.eclipse.epf.uma.ContentElement;
import org.eclipse.epf.uma.Guidance;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.UmaFactory;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.uma.util.ContentDescriptionFactory;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.ListDialog;
/**
* class to convert guidance types
*
* @author ???
* @sicne 1.0
*
*/
public class ConvertGuidanceType {
static IValidator validator;
private static int[] compatibleGuidances = { UmaPackage.CONCEPT,
// UmaPackage.CHECKLIST,
// UmaPackage.EXAMPLE,
UmaPackage.GUIDELINE,
// UmaPackage.ESTIMATE,
// UmaPackage.ESTIMATING_METRIC,
// UmaPackage.ESTIMATION_CONSIDERATIONS,
// UmaPackage.REPORT,
// UmaPackage.TEMPLATE,
UmaPackage.SUPPORTING_MATERIAL,
// UmaPackage.TOOL_MENTOR,
// UmaPackage.WHITEPAPER,
// UmaPackage.TERM_DEFINITION,
// UmaPackage.PRACTICE,
// UmaPackage.REUSABLE_ASSET
};
private static List compatibleGuidancesList = new ArrayList();
static {
for (int i = 0; i < compatibleGuidances.length; i++)
compatibleGuidancesList.add(new Integer(compatibleGuidances[i]));
}
public static Guidance convertGuidance(Guidance oldGuidance, Shell shell,
DeleteMethodElementCommand command) {
return convertGuidance(oldGuidance, shell, command, null);
}
public static Guidance convertGuidance(Guidance oldGuidance, Shell shell,
DeleteMethodElementCommand command, EClass newType) {
if (newType == null) {
if (shell == null)
shell = Display.getCurrent().getActiveShell();
ListDialog dlg = new ListDialog(shell);
dlg.setHeightInChars(5);
dlg.setContentProvider(new ArrayContentProvider());
dlg.setLabelProvider(new LabelProvider() {
public String getText(Object element) {
switch (((Integer) element).intValue()) {
// TODO: refactor these strings (and this whole dialog) into
// library.ui
case UmaPackage.CONCEPT:
return LibraryResources.concept_text;
case UmaPackage.CHECKLIST:
return LibraryResources.checklist_text;
case UmaPackage.EXAMPLE:
return LibraryResources.example_text;
case UmaPackage.GUIDELINE:
return LibraryResources.guideline_text;
case UmaPackage.ESTIMATION_CONSIDERATIONS:
return LibraryResources.estimationConsiderations_text;
case UmaPackage.REPORT:
return LibraryResources.report_text;
case UmaPackage.TEMPLATE:
return LibraryResources.template_text;
case UmaPackage.SUPPORTING_MATERIAL:
return LibraryResources.supportingMaterial_text;
case UmaPackage.TOOL_MENTOR:
return LibraryResources.toolMentor_text;
case UmaPackage.WHITEPAPER:
return LibraryResources.whitepaper_text;
case UmaPackage.TERM_DEFINITION:
return LibraryResources.termDefinition_text;
case UmaPackage.PRACTICE:
return LibraryResources.practice_text;
case UmaPackage.REUSABLE_ASSET:
return LibraryResources.reusableAsset_text;
default:
return LibraryResources.unknownGuidance_text;
}
}
});
List newGuidanceTypeList = getValidNewGuidanceTypes(oldGuidance);
if (newGuidanceTypeList == null) {
LibraryPlugin
.getDefault()
.getMsgDialog()
.displayError(
LibraryResources.convertGuidanceError_title,
LibraryResources.unsupportedGuidanceTypeError_msg,
NLS.bind(LibraryResources.unsupportedGuidanceTypeError_reason, StrUtil.toLower(TngUtil.getTypeText(oldGuidance))));
return null;
}
dlg.setInput(newGuidanceTypeList);
dlg.setTitle(LibraryResources.convertGuidanceDialog_title);
dlg.setMessage(LibraryResources.convertGuidanceDialog_text);
if (dlg.open() == Dialog.CANCEL)
return null;
Object[] selectionResult = dlg.getResult();
if (selectionResult == null)
return null;
int chosenGuidance = ((Integer) selectionResult[0]).intValue();
// Guidance newGuidance = doConvert(oldGuidance, chosenGuidance, command);
newType = getGuidanceType(chosenGuidance);
}
if(newType == null) {
return null;
}
TypeConverter.TypeConversionCommand cmd = TypeConverter.createTypeConversionCommand(oldGuidance, newType, null, null, true, true);
try {
if(!cmd.getIllegalReferencers().isEmpty()) {
// type conversion will remove some illegal references
// confirm with user before continue
//
MultiStatus multiStatus = new MultiStatus(
LibraryEditPlugin.INSTANCE.getSymbolicName(), 0, "", null); //$NON-NLS-1$
for (Iterator iter = cmd.getIllegalReferencers().iterator(); iter.hasNext();) {
MethodElement e = (MethodElement) iter.next();
// don't show predefined element
//
if(!TngUtil.isPredefined(e)) {
String msg = NLS.bind(LibraryEditResources.elementType_text, e.eClass().getName(), TngUtil.getLabelWithPath(e));
IStatus status = new Status(IStatus.INFO,
LibraryEditPlugin.INSTANCE.getSymbolicName(), 0, msg,
null);
multiStatus.add(status);
}
}
if (multiStatus.getChildren().length > 0 &&
LibraryPlugin
.getDefault()
.getMsgDialog()
.displayConfirmation(
LibraryResources.convertGuidanceDialog_title,
LibraryEditResources.confirm_remove_references_text,
multiStatus) == Dialog.CANCEL) {
return null;
}
}
IStatus status = UserInteractionHelper.checkModify(cmd.getModifiedResources(), shell);
if(!status.isOK()) {
LibraryPlugin.getDefault().getMsgDialog().display(LibraryResources.convertGuidanceDialog_title, status);
return null;
}
cmd.execute();
Guidance newGuidance = (Guidance) cmd.getResult().iterator().next();
// save modified resources
//
ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil.getCurrentPersister().getFailSafePersister();
try {
for (Iterator iter = cmd.getModifiedResources().iterator(); iter.hasNext();) {
Resource resource = (Resource) iter.next();
persister.save(resource);
}
persister.commit();
if(ContentDescriptionFactory.hasPresentation(newGuidance)) {
persister.adjustLocation(newGuidance.getPresentation().eResource());
}
cmd.copyResources();
} catch (Exception e) {
persister.rollback();
LibraryPlugin.getDefault().getMsgDialog().displayError(
LibraryResources.convertGuidanceError_title,
NLS.bind(LibraryResources.saveConvertedGuidanceError_msg,
newGuidance.getName()),
LibraryResources.error_reason, e);
}
return newGuidance;
}
finally {
if(cmd != null) {
try { cmd.dispose(); } catch(Exception e) {}
}
}
}
/**
* @param oldGuidance
* @param newGuidance
* @return
*/
private static String checkName(Guidance oldGuidance, Guidance newGuidance) {
// TODO Auto-generated method stub
validator = new ContentElementNameValidator(oldGuidance.eContainer()
, UmaPackage.eINSTANCE.getContentPackage_ContentElements(),
(ContentElement) newGuidance, new ValidatorFactory.TypeFilter(newGuidance));
String msg = validator.isValid(newGuidance.getName());
if (msg != null) {
String featureTxt = TngUtil.getFeatureText(UmaPackage.eINSTANCE
.getNamedElement_Name());
String title = LibraryEditResources.resolveNameConflictDialog_title; //$NON-NLS-1$
String dlgMsg = NLS.bind(
LibraryEditResources.resolveNameConflictDialog_text,
StrUtil.toLower(featureTxt), newGuidance.getName());
String currentValue = (String) newGuidance.eGet(UmaPackage.eINSTANCE
.getNamedElement_Name());
IInputValidator inputValidator = new IInputValidator() {
public String isValid(String newText) {
return validator.isValid(newText);
}
};
InputDialog inputDlg = new InputDialog(
MsgBox.getDefaultShell(), title, dlgMsg, currentValue,
inputValidator);
if (inputDlg.open() == Window.CANCEL) {
throw new OperationCanceledException();
}
return inputDlg.getValue();
}
return null;
}
private static EClass getGuidanceType(int newGuidanceType) {
switch (newGuidanceType) {
case UmaPackage.CONCEPT:
return UmaPackage.Literals.CONCEPT;
case UmaPackage.CHECKLIST:
return UmaPackage.Literals.CHECKLIST;
case UmaPackage.EXAMPLE:
return UmaPackage.Literals.EXAMPLE;
case UmaPackage.GUIDELINE:
return UmaPackage.Literals.GUIDELINE;
case UmaPackage.ESTIMATION_CONSIDERATIONS:
return UmaPackage.Literals.ESTIMATION_CONSIDERATIONS;
case UmaPackage.REPORT:
return UmaPackage.Literals.REPORT;
case UmaPackage.TEMPLATE:
return UmaPackage.Literals.TEMPLATE;
case UmaPackage.SUPPORTING_MATERIAL:
return UmaPackage.Literals.SUPPORTING_MATERIAL;
case UmaPackage.TOOL_MENTOR:
return UmaPackage.Literals.TOOL_MENTOR;
case UmaPackage.WHITEPAPER:
return UmaPackage.Literals.WHITEPAPER;
case UmaPackage.TERM_DEFINITION:
return UmaPackage.Literals.TERM_DEFINITION;
case UmaPackage.PRACTICE:
return UmaPackage.Literals.PRACTICE;
case UmaPackage.REUSABLE_ASSET:
return UmaPackage.Literals.REUSABLE_ASSET;
default:
return null;
}
}
private static Guidance createNewGuidance(int newGuidanceType) {
switch (newGuidanceType) {
case UmaPackage.CONCEPT:
return UmaFactory.eINSTANCE.createConcept();
case UmaPackage.CHECKLIST:
return UmaFactory.eINSTANCE.createChecklist();
case UmaPackage.EXAMPLE:
return UmaFactory.eINSTANCE.createExample();
case UmaPackage.GUIDELINE:
return UmaFactory.eINSTANCE.createGuideline();
case UmaPackage.ESTIMATION_CONSIDERATIONS:
return UmaFactory.eINSTANCE.createEstimationConsiderations();
case UmaPackage.REPORT:
return UmaFactory.eINSTANCE.createReport();
case UmaPackage.TEMPLATE:
return UmaFactory.eINSTANCE.createTemplate();
case UmaPackage.SUPPORTING_MATERIAL:
return UmaFactory.eINSTANCE.createSupportingMaterial();
case UmaPackage.TOOL_MENTOR:
return UmaFactory.eINSTANCE.createToolMentor();
case UmaPackage.WHITEPAPER:
return UmaFactory.eINSTANCE.createWhitepaper();
case UmaPackage.TERM_DEFINITION:
return UmaFactory.eINSTANCE.createTermDefinition();
case UmaPackage.PRACTICE:
return UmaFactory.eINSTANCE.createPractice();
case UmaPackage.REUSABLE_ASSET:
return UmaFactory.eINSTANCE.createReusableAsset();
default:
return null;
}
}
public static List getValidNewGuidanceTypes(Guidance oldGuidance) {
if (oldGuidance == null)
return null;
Integer oldGuidanceClassID = new Integer(oldGuidance.eClass()
.getClassifierID());
if (!compatibleGuidancesList.contains(oldGuidanceClassID))
return null;
List guidanceList = new ArrayList();
for (int i = 0; i < compatibleGuidances.length; i++) {
Integer compatibleGuidanceTypeClassID = new Integer(
compatibleGuidances[i]);
if (!oldGuidanceClassID.equals(compatibleGuidanceTypeClassID))
guidanceList.add(compatibleGuidanceTypeClassID);
}
return guidanceList;
}
}