blob: 1d18048792b8bb5307586a6f8c058ffc9e7d1d4f [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.authoring.ui.actions;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.ui.viewer.IViewerProvider;
import org.eclipse.emf.common.util.BasicDiagnostic;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.DiagnosticChain;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.Diagnostician;
import org.eclipse.emf.ecore.util.EObjectValidator;
import org.eclipse.emf.edit.ui.EMFEditUIPlugin;
import org.eclipse.emf.edit.ui.action.ValidateAction;
import org.eclipse.epf.authoring.ui.providers.MethodElementLabelDecorator;
import org.eclipse.epf.authoring.ui.util.LibraryValidationMarkerHelper;
import org.eclipse.epf.authoring.ui.views.ViewHelper;
import org.eclipse.epf.library.edit.util.LibraryEditUtil;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.library.edit.validation.DependencyValidationMgr;
import org.eclipse.epf.library.services.SafeUpdateController;
import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
import org.eclipse.epf.library.validation.ValidationManager;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.MethodLibrary;
import org.eclipse.epf.uma.NamedElement;
import org.eclipse.epf.uma.util.UmaUtil;
import org.eclipse.epf.validation.LibraryEValidator;
import org.eclipse.epf.validation.constraints.LibraryTraversalStrategy;
import org.eclipse.epf.validation.constraints.LibraryTraversalStrategy.LibraryIterator;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ISetSelectionTarget;
/**
* @author Phong Nguyen Le
* @since 1.0
*/
public class LibraryValidateAction extends ValidateAction {
private HashSet resources;
private boolean success;
private boolean showSuccess = true;
private Map contextData = new HashMap();
private MethodLibrary library;
public LibraryValidateAction() {
super();
eclipseResourcesUtil = new LibraryValidationMarkerHelper();
}
//Called from method editors only
public LibraryValidateAction(boolean showSuccess) {
this();
this.showSuccess = showSuccess;
}
public LibraryValidateAction(MethodLibrary library) {
this();
this.library = library;
}
public void putContextData(Object key, Object value) {
contextData.put(key, value);
}
/* (non-Javadoc)
* @see org.eclipse.emf.edit.ui.action.ValidateAction#validate(org.eclipse.core.runtime.IProgressMonitor)
*/
protected Diagnostic validate(final IProgressMonitor progressMonitor) {
ValidationManager validationMgr = (ValidationManager) LibraryEditUtil.getInstance().getValidationManager();
LibraryUIPreferences.update(validationMgr);
validationMgr.setEmfValidateAction(this);
if (showSuccess) {
SafeUpdateController.syncExec(new Runnable() {
public void run() {
PlatformUI.
getWorkbench().
getActiveWorkbenchWindow().
getActivePage().
closeAllEditors(true);
ViewHelper.checkLibraryHealth(library == null ? selectedObjects : library);
}
});
} else { //called from an method element editing
validationMgr.setNameCheck(true);
validationMgr.setCircularDependancyCheck(true);
validationMgr.setUndeclaredDependancyCheck(false);
}
BasicDiagnostic ret = validate_old(progressMonitor);
// deleteMarkers();
Object scope = library == null ? selectedObjects : library;
validationMgr.validate(ret, scope, progressMonitor);
return ret;
}
private BasicDiagnostic validate_old(final IProgressMonitor progressMonitor) {
if(resources == null) {
resources = new HashSet();
}
else {
resources.clear();
}
boolean dependencyInfoMgrSet = false;
Collection eObjects = new ArrayList();
Iterator it = library == null ? selectedObjects.iterator() : library.getMethodPlugins().iterator();
for ( ; it.hasNext();) {
Object element = TngUtil.unwrap(it.next());
if(element instanceof EObject) {
eObjects.add(element);
Resource resource = ((EObject)element).eResource();
if(resource != null) {
resources.add(resource);
}
if (! dependencyInfoMgrSet && element instanceof MethodElement) {
MethodLibrary lib = UmaUtil.getMethodLibrary((MethodElement) element);
putContextData(LibraryEValidator.CTX_DEPENDENCY_VALIDATION_MGR, new DependencyValidationMgr(lib));
dependencyInfoMgrSet = true;
}
}
}
int count = eObjects.size();
eObjects = LibraryTraversalStrategy.makeTargetsDisjoint(eObjects);
LibraryIterator libIter = new LibraryIterator(eObjects, true, LibraryTraversalStrategy.DEEP, true);
while(libIter.hasNext()) {
Object o = libIter.next();
count++;
if(o instanceof EObject) {
Resource resource = ((EObject)o).eResource();
if(resource != null) {
resources.add(resource);
}
}
}
progressMonitor.beginTask("", count); //$NON-NLS-1$
// final AdapterFactory adapterFactory =
// domain instanceof AdapterFactoryEditingDomain ? ((AdapterFactoryEditingDomain)domain).getAdapterFactory() : null;
Diagnostician diagnostician =
new Diagnostician()
{
public String getObjectLabel(EObject eObject)
{
// if (adapterFactory != null && !eObject.eIsProxy())
// {
// IItemLabelProvider itemLabelProvider = (IItemLabelProvider)adapterFactory.adapt(eObject, IItemLabelProvider.class);
// if (itemLabelProvider != null)
// {
// return itemLabelProvider.getText(eObject);
// }
// }
//
// return super.getObjectLabel(eObject);
return TngUtil.getLabelWithPath(eObject);
}
public boolean validate(EClass eClass, EObject eObject, DiagnosticChain diagnostics, Map context)
{
progressMonitor.worked(1);
if(context == null) {
context = contextData;
}
else {
context.putAll(contextData);
}
return super.validate(eClass, eObject, diagnostics, context);
}
};
List list = new ArrayList(eObjects);
int max = list.size() - 1;
StringBuffer strBuf = new StringBuffer();
for (int i = 0; i < max; i++) {
Object e = list.get(i);
if(e instanceof NamedElement) {
strBuf.append(((NamedElement)e).getName()).append(", "); //$NON-NLS-1$
}
}
Object e = max < 0 ? null : list.get(max);
if(e instanceof NamedElement) {
strBuf.append(((NamedElement)e).getName());
}
BasicDiagnostic diagnostics =
new BasicDiagnostic
(EObjectValidator.DIAGNOSTIC_SOURCE,
0,
EcorePlugin.INSTANCE.getString
("_UI_DiagnosticRoot_diagnostic", //$NON-NLS-1$
new Object [] { strBuf.toString() }),
list.toArray()) {
@Override
public String getMessage() {
String msg = super.getMessage();
if (msg != null && msg.length() > 2000) {
msg = msg.substring(0, 2000) + " ... "; //$NON-NLS-1$
}
return msg;
}
};
for (Iterator iter = eObjects.iterator(); iter.hasNext();) {
EObject eObject = (EObject) iter.next();
progressMonitor.setTaskName
(EMFEditUIPlugin.INSTANCE.getString("_UI_Validating_message", new Object [] {diagnostician.getObjectLabel(eObject)})); //$NON-NLS-1$
diagnostician.validate(eObject, diagnostics);
}
success = diagnostics.getSeverity() == Diagnostic.OK;
return diagnostics;
}
/* (non-Javadoc)
* @see org.eclipse.emf.edit.ui.action.ValidateAction#handleDiagnostic(org.eclipse.emf.common.util.Diagnostic)
*/
protected void handleDiagnostic(Diagnostic diagnostic) {
if(diagnostic != null) {
if(showSuccess || !isSuccessful()) {
// save the reference to EclipseResourcesUtil and set eclipseResourcesUtil to null
// so super method will not try to deal with the markers
//
EclipseResourcesUtil savedRef = eclipseResourcesUtil;
eclipseResourcesUtil = null;
try {
super.handleDiagnostic(diagnostic);
}
finally {
eclipseResourcesUtil = savedRef;
}
}
// dealing with markers
//
if (eclipseResourcesUtil != null)
{
// delete old markers
//
// deleteMakers();
Viewer viewer = null;
if (!diagnostic.getChildren().isEmpty())
{
Map diagnosticToResourceMap = new HashMap();
for (Iterator i = diagnostic.getChildren().iterator(); i.hasNext(); )
{
Diagnostic childDiagnostic = (Diagnostic)i.next();
List data = childDiagnostic.getData();
if (!data.isEmpty()) {
Object o = data.get(0);
if(o instanceof EObject) {
Resource resource = ((EObject)o).eResource();
if(resource != null) {
diagnosticToResourceMap.put(childDiagnostic, resource);
}
}
}
}
// create markers
//
for (Iterator i = diagnosticToResourceMap.entrySet().iterator(); i.hasNext(); )
{
Map.Entry entry = (Entry) i.next();
Diagnostic childDiagnostic = (Diagnostic)entry.getKey();
Resource resource = (Resource) entry.getValue();
eclipseResourcesUtil.createMarkers(resource, childDiagnostic);
}
// select the first object with problem in the viewer if possible
//
List data = ((Diagnostic)diagnostic.getChildren().get(0)).getData();
if (!data.isEmpty())
{
Object part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
Object e = data.get(0);
if (part instanceof ISetSelectionTarget)
{
((ISetSelectionTarget)part).selectReveal(new StructuredSelection(e));
}
else if (part instanceof IViewerProvider)
{
viewer = ((IViewerProvider)part).getViewer();
if (viewer != null)
{
viewer.setSelection(new StructuredSelection(data.get(0)), true);
}
}
}
}
if(viewer == null) {
Object part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
if (part instanceof IViewerProvider)
{
viewer = ((IViewerProvider)part).getViewer();
}
}
if(viewer != null) {
// clear decoration cache
//
MethodElementLabelDecorator.clearDecorationCache();
viewer.refresh();
}
try {
refreshViews();
}
catch(Exception e) {
}
}
}
}
private void deleteMarkers() {
for (Iterator iter = resources.iterator(); iter.hasNext();) {
eclipseResourcesUtil.deleteMarkers((Resource) iter.next());
}
}
protected void refreshViews() {
// no error markers for configuration view
//
// ConfigurationView.getView().getViewer().refresh();
}
public boolean isSuccessful() {
return success;
}
@Override
public boolean updateSelection(IStructuredSelection selection) {
if (selection == null) { //A hack for ValidataionManager to access deleteMarkers through ValidationAction API
deleteMarkers();
return false;
}
return super.updateSelection(selection);
}
}