/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.diagram.ui.editor; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.emf.ecore.EObject; import org.teiid.designer.core.workspace.ModelResource; import org.teiid.designer.core.workspace.ModelWorkspaceManager; import org.teiid.designer.diagram.ui.DiagramUiConstants; import org.teiid.designer.diagram.ui.model.DiagramModelNode; import org.teiid.designer.diagram.ui.util.DiagramUiUtilities; import org.teiid.designer.ui.viewsupport.MarkerUtilities; import org.teiid.designer.ui.viewsupport.ModelUtilities; /** * DiagramDecoratorHandler * This class provides the DiagramEditor a way to maintain a map of applicable IMarkers (errors and warnings) * for the current diagram. This is needed because when IMarkers go away (errors and warnings are fixed), * there is no easy way to tell which ones were fixed. * * @since 8.0 */ public class DiagramDecoratorHandler { private DiagramEditor dEditor; private HashMap currentMarkerEObjectMap; /** * Construct an instance of DiagramDecoratorHandler. * */ public DiagramDecoratorHandler(DiagramEditor editor) { super(); dEditor = editor; } public void initialize() { //System.out.println(" DDH: initialize() Refreshing marker list for current diagram ----- START "); currentMarkerEObjectMap = new HashMap(getMarkersForDiagramResource(dEditor.getCurrentModel())); //System.out.println(" DDH: initialize() ------------------------------------------ ----- END "); } public void reset() { initialize(); } public void clear() { currentMarkerEObjectMap = new HashMap(); } // PRIVATE METHODS private HashMap getMarkersForDiagramResource(DiagramModelNode diagram) { //System.out.println(" DDH: getMarkerListForDiagram() --- START --------------------"); HashMap newMap = new HashMap(); if( diagram != null ) { IMarker[] markers = null; IResource resrc = null; ModelResource modelResource = ModelUtilities.getModelResourceForModelObject(diagram.getModelObject()); if (modelResource != null && modelResource.exists() ) { resrc = modelResource.getResource(); } if( resrc != null ) { boolean errorOccurred = false; try { markers = resrc.findMarkers(IMarker.PROBLEM, false, IResource.DEPTH_INFINITE); } catch (CoreException ex) { DiagramUiConstants.Util.log(ex); errorOccurred = true; } if(!errorOccurred) { for (int ndx = markers.length; --ndx >= 0;) { IMarker marker = markers[ndx]; EObject targetEObject = ModelWorkspaceManager.getModelWorkspaceManager().getMarkerManager().getMarkedEObject(resrc, marker); if( targetEObject != null && newMap.get(targetEObject) == null ) { //System.out.println(" --->> Added Marker for EObject = " + ModelerCore.getModelEditor().getName(targetEObject)); newMap.put(targetEObject, marker); } } } } } //System.out.println(" DDH: getMarkerListForDiagram() --- END --------------------"); if( newMap.isEmpty() ) return new HashMap(1); return newMap; } public void handleLabelProviderChanged() { //System.out.println(" DDH: handleLabelProviderChanged() --- END --------------------"); // Get list of new markers HashMap newEObjectMap = getMarkersForDiagramResource(dEditor.getCurrentModel()); HashMap updateableEObjects = new HashMap(newEObjectMap); if( currentMarkerEObjectMap != null && !currentMarkerEObjectMap.isEmpty() ) { Iterator iter = currentMarkerEObjectMap.keySet().iterator(); EObject nextEObject = null; while( iter.hasNext() ) { nextEObject = (EObject)iter.next(); // check vs old marker EObjects if( newEObjectMap.get(nextEObject) == null && updateableEObjects.get(nextEObject) == null) updateableEObjects.put(nextEObject, currentMarkerEObjectMap.get(nextEObject)); } } // reset the current EObject list to the new currentMarkerEObjectMap = new HashMap(newEObjectMap); // Then we call update dEditor.getModelFactory().handleLabelProviderChanged(dEditor.getCurrentModel(), new ArrayList(updateableEObjects.keySet())); //System.out.println(" DDH: handleLabelProviderChanged() --- END --------------------"); } public boolean handleResouceChanged() { //System.out.println(" DDH: handleResouceChanged() --- START --------------------"); DiagramModelNode currentDiagramNode = dEditor.getCurrentModel(); // Check to see if diagram has any errors or warnings boolean hasErrorOrWarning = DiagramUiUtilities.hasEObjectsWithErrorsOrWarnings(currentDiagramNode); // If diagram has decorators, refresh no matter what // if it doesn't have any, and there are markers for this resource, refresh if( hasErrorOrWarning ) { return true; } // If we get this far, check for any new markers // Defect 23570 - DON't call initialize() because we don't want to MUCK with the currentMarkerEObjectMap !!!! // Just get any markers for the current diagram node. HashMap currentMarkers = getMarkersForDiagramResource(currentDiagramNode); if( !currentMarkers.isEmpty()) { //System.out.println(" DDH: handleResouceChanged() --- END --------------------"); return true; } //System.out.println(" DDH: handleResouceChanged() --- END --------------------"); return false; } public int getErrorState(EObject eObj) { int errorState = DiagramUiConstants.NO_ERRORS; if( currentMarkerEObjectMap == null ) initialize(); Object marker = currentMarkerEObjectMap.get(eObj); if( marker != null ) { final Object attr = MarkerUtilities.getMarkerAttribute((IMarker)marker, IMarker.SEVERITY); //((IMarker)marker).getAttribute(IMarker.SEVERITY); if(attr != null) { // Asserting attr is an Integer... final int severity = ((Integer)attr).intValue(); if(severity == IMarker.SEVERITY_ERROR) { errorState = DiagramUiConstants.HAS_ERROR; } else if(errorState == DiagramUiConstants.NO_ERRORS && severity == IMarker.SEVERITY_WARNING) { errorState = DiagramUiConstants.HAS_WARNING; } } else { currentMarkerEObjectMap.remove(eObj); } } return errorState; } }