blob: f41259d59e864301a7421f0eb8de4309956c3864 [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.util;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.InternalEList;
import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
import org.eclipse.epf.authoring.ui.AuthoringUIResources;
import org.eclipse.epf.authoring.ui.views.LibraryView;
import org.eclipse.epf.library.LibraryServiceUtil;
import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
import org.eclipse.epf.persistence.refresh.RefreshJob;
import org.eclipse.epf.persistence.util.PersistenceUtil;
import org.eclipse.epf.persistence.util.UnresolvedProxyMarkerManager;
import org.eclipse.epf.services.ILibraryPersister;
import org.eclipse.epf.uma.ContentDescription;
import org.eclipse.epf.uma.ContentElement;
import org.eclipse.epf.uma.ContentPackage;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.MethodPlugin;
import org.eclipse.epf.uma.ProcessComponent;
import org.eclipse.epf.uma.ProcessPackage;
import org.eclipse.epf.uma.util.UmaUtil;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IMarkerResolution;
import org.eclipse.ui.IMarkerResolutionGenerator;
import org.eclipse.ui.views.markers.WorkbenchMarkerResolution;
/**
* Create resolutions for the given marker
*
* @author Phong Nguyen Le
* @since 1.0
*/
public class MarkerResolutionGenerator implements IMarkerResolutionGenerator {
private static final IMarkerResolution[] EMPTY_RESOLUTIONS = new IMarkerResolution[0];
private static class ShowOwnerInLibraryView implements IMarkerResolution {
private Object owner;
/**
* @param owner
*/
private ShowOwnerInLibraryView(Object owner) {
super();
this.owner = owner;
}
/**
* @see org.eclipse.ui.IMarkerResolution#getLabel()
*/
public String getLabel() {
return AuthoringUIResources.MarkerResolutionGenerator_showOwnerInLibraryView;
}
/**
* @see org.eclipse.ui.IMarkerResolution#run(org.eclipse.core.resources.IMarker)
*/
public void run(IMarker marker) {
LibraryView.getView().setSelectionToViewer(owner);
}
}
private static class MarkerResolution extends WorkbenchMarkerResolution {
private IMarker currentMarker;
private ReferenceInfo referenceInfo;
public MarkerResolution(IMarker currentMarker, ReferenceInfo referenceInfo) {
this.currentMarker = currentMarker;
this.referenceInfo = referenceInfo;
}
/**
* @see org.eclipse.ui.IMarkerResolution#getLabel()
*/
public String getLabel() {
return AuthoringUIResources.MarkerResolutionGenerator_removeUnresolvedReference;
}
/**
* @see org.eclipse.ui.IMarkerResolution#run(org.eclipse.core.resources.IMarker)
*/
public void run(IMarker marker) {
ReferenceInfo refInfo = currentMarker.equals(marker) ? referenceInfo : getReferenceInfo(marker);
if(refInfo == null) {
return;
}
if(refInfo.reference.isMany()) {
((List<?>)refInfo.owner.eGet(refInfo.reference)).remove(refInfo.index);
}
else {
refInfo.owner.eSet(refInfo.reference, null);
}
boolean validate = false;
Resource resource = refInfo.owner.eResource();
ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil
.getPersisterFor(resource).getFailSafePersister();
try {
persister.save(resource);
persister.commit();
validate = true;
}
catch(Exception e) {
AuthoringUIPlugin.getDefault().getLogger().logError(e);
persister.rollback();
}
if(validate) {
ResourceSet resourceSet = resource.getResourceSet();
if(resourceSet instanceof MultiFileResourceSetImpl) {
((MultiFileResourceSetImpl)resourceSet).getMarkerMananger().doValidateMarkers(resource);
}
}
}
@Override
public IMarker[] findOtherMarkers(IMarker[] markers) {
ArrayList<IMarker> similarMarkerList = new ArrayList<IMarker>();
for (int i = 0; i < markers.length; i++) {
IMarker marker = markers[i];
if(!currentMarker.equals(marker)) {
try {
if(UnresolvedProxyMarkerManager.MARKER_ID.equals(marker.getType())) {
similarMarkerList.add(marker);
}
} catch (CoreException e) {
//
}
}
}
IMarker[] similarMarkers = new IMarker[similarMarkerList.size()];
similarMarkerList.toArray(similarMarkers);
return similarMarkers;
}
public String getDescription() {
// TODO provide detailed description
return null;
}
public Image getImage() {
// TODO provide image
return null;
}
}
private static class ReferenceInfo {
private EObject owner;
private EReference reference;
private int index;
public ReferenceInfo(EObject owner, EReference reference, int index) {
super();
this.owner = owner;
this.reference = reference;
this.index = index;
}
}
private static ReferenceInfo getReferenceInfo(IMarker marker) {
try {
String proxyURI = (String) marker.getAttribute(UnresolvedProxyMarkerManager.PROXY_URI);
String ownerGUID = (String) marker.getAttribute(UnresolvedProxyMarkerManager.OWNER_GUID);
if(proxyURI != null && ownerGUID != null) {
Resource resource = RefreshJob.getInstance().getResource(marker.getResource());
if(resource != null) {
EObject owner = resource.getEObject(ownerGUID);
if(owner != null) {
URI uri = URI.createURI(proxyURI);
// find the proxy
//
int index = -1;
EReference reference = null;
find_proxy_loop:
for (EReference ref : owner.eClass().getEAllReferences()) {
if(ref.isChangeable() && !ref.isDerived()) {
if(ref.isMany()) {
InternalEList list = (InternalEList) owner.eGet(ref);
int id = 0;
for (Iterator iterator = list.basicIterator(); iterator
.hasNext();) {
InternalEObject o = (InternalEObject) iterator.next();
if(o.eIsProxy() && uri.equals(o.eProxyURI())) {
index = id;
reference = ref;
break find_proxy_loop;
}
id++;
}
}
else {
InternalEObject o = (InternalEObject) owner.eGet(ref, false);
if(o != null && o.eIsProxy() && uri.equals(o.eProxyURI())) {
reference = ref;
break find_proxy_loop;
}
}
}
}
if(reference != null) {
return new ReferenceInfo(owner, reference, index);
}
}
}
}
} catch (Exception e) {
AuthoringUIPlugin.getDefault().getLogger().logError(e);
}
return null;
}
/**
* @see org.eclipse.ui.IMarkerResolutionGenerator#getResolutions(org.eclipse.core.resources.IMarker)
*/
public IMarkerResolution[] getResolutions(IMarker marker) {
ReferenceInfo refInfo = getReferenceInfo(marker);
if(refInfo != null) {
Object selectableOwner = getSelectableObject(refInfo.owner);
IMarkerResolution markerResolution = new MarkerResolution(marker, refInfo);
if(selectableOwner != null) {
return new IMarkerResolution[] {
markerResolution,
new ShowOwnerInLibraryView(selectableOwner)
};
}
else {
return new IMarkerResolution[] {
markerResolution
};
}
}
return EMPTY_RESOLUTIONS;
}
/**
* Get selectable object
* @param owner
* @return
* object itself
*/
private static Object getSelectableObject(EObject owner) {
if(owner instanceof MethodPlugin || owner instanceof ContentElement || owner instanceof ContentPackage
|| owner instanceof ProcessComponent) {
return owner;
}
if(owner instanceof MethodElement) {
ProcessComponent procComp = UmaUtil.getProcessComponent((MethodElement) owner);
if(procComp != null) {
return procComp;
}
}
if(owner instanceof ProcessPackage) {
return owner;
}
if(owner instanceof ContentDescription && owner.eContainer() instanceof ContentElement) {
return owner.eContainer();
}
Resource resource = owner.eResource();
MethodElement e = PersistenceUtil.getMethodElement(resource);
if(e != owner) {
return getSelectableObject(e);
}
return null;
}
}