/* * 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.ui.util; import org.eclipse.core.resources.IResource; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.teiid.designer.core.util.CoreModelObjectNotificationHelper; import org.teiid.designer.core.workspace.ModelResource; import org.teiid.designer.core.workspace.ModelWorkspaceException; import org.teiid.designer.ui.viewsupport.ModelUtilities; /** * This class provides notification analysis and bundling. It will categorize all notifications, collect target objects and * filters out ignorable notifications. * * @since 8.0 */ public class ModelObjectNotificationHelper extends CoreModelObjectNotificationHelper { // private static final String NEW_LINE = "\n"; //$NON-NLS-1$ // // protected Notification primaryNotification = null; // protected HashSet addOrRemoveTargets = null; // protected HashSet changeTargets = null; // protected HashSet changedModels = null; // protected HashSet modifiedResources = null; // protected HashSet addedChildren; // protected boolean modelChildrenChanged = false; // protected List leftoverNotifications = null; // protected boolean handleNotification = false; // protected boolean isDiagramOnlyNotification = true; /** * @since 4.2 */ public ModelObjectNotificationHelper( Notification notification ) { super(notification); // this.primaryNotification = notification; // init(); } // private void init() { // addOrRemoveTargets = new HashSet(); // addedChildren = new HashSet(); // changeTargets = new HashSet(); // changedModels = new HashSet(); // modifiedResources = new HashSet(); // leftoverNotifications = new ArrayList(); // setHandleNotification(); // // filterTargets(); // } // // private void setHandleNotification() { // handleNotification = true; // } // // /** // * @return Returns the handleNotification. // * @since 4.2 // */ // public boolean shouldHandleNotification() { // return this.handleNotification; // } // // protected void filterTargets() { // addOrRemoveTargets.clear(); // changeTargets.clear(); // changedModels.clear(); // modelChildrenChanged = false; // leftoverNotifications.clear(); // // if (primaryNotification instanceof SourcedNotification) { // // Walk through the notifications. // // and determine we need to reconcile target attributes (bail on check if already set) // // determine if any "source" tables need to be reconciled (don't bail on check if already set) // // Add all tables to reconcileTables list // Collection notifications = ((SourcedNotification)primaryNotification).getNotifications(); // Iterator iter = notifications.iterator(); // Notification notification = null; // while (iter.hasNext()) { // // notification = (Notification)iter.next(); // Object targetObject = ModelerCore.getModelEditor().getChangedObject(notification); // if (targetObject instanceof DiagramContainer || targetObject instanceof ModelAnnotation) { // leftoverNotifications.add(notification); // } // // boolean targetIsResource = targetObject instanceof Resource; // // EObject targetEObject = getEObjectTarget(notification); // // if (targetEObject != null) { // addToModifiedResources(targetEObject); // // if (NotificationUtilities.isAdded(notification)) { // // handleAddOrRemove(notification, targetEObject); // EObject[] newValues = NotificationUtilities.getAddedChildren(notification); // if (newValues.length > 0) { // addedChildren.addAll(Arrays.asList(newValues)); // // Check ignorable targets // checkNonDiagramRelatedChange(newValues, false); // } // endif // } else if (NotificationUtilities.isRemoved(notification)) { // handleAddOrRemove(notification, targetEObject); // // Check ignorable target // checkNonDiagramRelatedChange(targetEObject, false); // } else if (NotificationUtilities.isChanged(notification)) { // handleChanged(notification, targetEObject); // // Check ignorable target // checkNonDiagramRelatedChange(targetEObject, true); // } // } else if (targetIsResource) { // if (NotificationUtilities.isAdded(notification)) { // // handleAddOrRemove(notification, targetEObject); // EObject[] newValues = NotificationUtilities.getAddedChildren(notification); // if (newValues.length > 0) { // addedChildren.addAll(Arrays.asList(newValues)); // // Check ignorable targets // checkNonDiagramRelatedChange(newValues, false); // } // endif // } else if (NotificationUtilities.isRemoved(notification)) { // handleAddOrRemove(notification, targetEObject); // // Check ignorable target // checkNonDiagramRelatedChange(targetEObject, false); // } else if (NotificationUtilities.isChanged(notification)) { // handleChanged(notification, targetEObject); // // Check ignorable target // checkNonDiagramRelatedChange(targetEObject, true); // } // // // call findIResource since this does NOT open the model // IResource resource = WorkspaceResourceFinderUtil.findIResource((Resource)targetObject); // // if ((resource != null) && ModelWorkspaceManager.getModelWorkspaceManager().isModelOpen(resource)) { // modelChildrenChanged = true; // changedModels.add(resource); // addToModifiedResources(resource); // } // } // } // } else { // Object targetObject = ModelerCore.getModelEditor().getChangedObject(primaryNotification); // if (targetObject instanceof DiagramContainer || targetObject instanceof ModelAnnotation) { // leftoverNotifications.add(primaryNotification); // } // // EObject targetEObject = getEObjectTarget(primaryNotification); // // if (NotificationUtilities.isAdded(primaryNotification) || NotificationUtilities.isRemoved(primaryNotification)) { // if (targetEObject != null) { // addOrRemoveTargets.add(targetEObject); // // Check ignorable target // checkNonDiagramRelatedChange(targetEObject, false); // } // } else if (NotificationUtilities.isChanged(primaryNotification)) { // if (targetEObject != null) { // changeTargets.add(targetEObject); // // Check ignorable target // checkNonDiagramRelatedChange(targetEObject, true); // } // } // } // } @Override protected void addToModifiedResources( Object someObject ) { IResource iResource = null; try { if (someObject instanceof EObject) { ModelResource mr = ModelUtilities.getModelResourceForModelObject((EObject)someObject); if (mr != null) { iResource = mr.getUnderlyingResource(); } } else if (someObject instanceof Resource) { ModelResource mr = ModelUtilities.getModelResource((Resource)someObject, true); if (mr != null) { iResource = mr.getUnderlyingResource(); } } else if (someObject instanceof IResource) { iResource = (IResource)someObject; } else if (someObject instanceof ModelResource) { iResource = ((ModelResource)someObject).getUnderlyingResource(); } } catch (ModelWorkspaceException error) { } if (iResource != null) { modifiedResources.add(iResource); } } // /** // * @param notification // * @param targetEObject // */ // protected void handleAddOrRemove( Notification notification, // EObject targetEObject ) { // if (targetEObject != null) addOrRemoveTargets.add(targetEObject); // else leftoverNotifications.add(notification); // } // // /** // * @param notification // * @param targetEObject // */ // protected void handleChanged( Notification notification, // EObject targetEObject ) { // if (targetEObject != null) changeTargets.add(targetEObject); // else leftoverNotifications.add(notification); // } // // protected EObject getEObjectTarget( Notification notification ) { // Object targetObject = ModelerCore.getModelEditor().getChangedObject(notification); // if (targetObject instanceof EObject) return (EObject)targetObject; // return null; // } // // /** // * @return List of the addOrRemoveTargets. // * @since 4.2 // */ // public List getAddOrRemoveTargets() { // return new ArrayList(this.addOrRemoveTargets); // } // // /** // * @return List of the changed targets // */ // public List getChangeTargets() { // return new ArrayList(this.changeTargets); // } // // /** // * @return List of the changeModels. // * @since 4.2 // */ // public List getChangeModels() { // return new ArrayList(this.changedModels); // } // // /** // * @return Returns the movedChildrenChanged. // * @since 4.2 // */ // public boolean getModelChildrenChanged() { // return modelChildrenChanged; // } // // /** // * @return List of the leftoverNotifications. // * @since 4.2 // */ // public List getLeftoverNotifications() { // return leftoverNotifications; // } // // /** // * @return Set of the added children // */ // public Set getAddedChildren() { // return addedChildren; // } // // /** // * @return List of the modified resources. // * @since 4.2 // */ // public List getModifiedResources() { // return new ArrayList(this.modifiedResources); // } // // /* // * Method which keeps track of whether or not any non-diagram objects are the "targets" for notifications // * This knowledge can be used by // * @param obj // * @param isSet // */ // private void checkNonDiagramRelatedChange( Object obj, // boolean isSet ) { // // Only do the check if still non-diagram notification // if (isDiagramOnlyNotification && obj != null) { // if (obj instanceof DiagramEntity) { // isDiagramOnlyNotification = true; // } else if (obj instanceof Diagram && isSet) { // // This case is for diagram name change notifications (i.e. Custom Diagrams) // isDiagramOnlyNotification = false; // } else if (obj instanceof List) { // for (Iterator iter = ((List)obj).iterator(); iter.hasNext();) { // Object nextObj = iter.next(); // if (!(nextObj instanceof Diagram || nextObj instanceof DiagramEntity)) { // isDiagramOnlyNotification = false; // } // if (!isDiagramOnlyNotification) { // break; // } // } // } // } // } // // /** // * Assesses whether or not all the changes from the notifications are ignorable. // * // * @return boolean true if ignorable, false if not // */ // public boolean allChangesAreIgnorable() { // if (isDiagramOnlyNotification) { // // Do a check to see if there are any added/removed/changed targets // if (addedChildren.isEmpty() && addOrRemoveTargets.isEmpty() && changeTargets.isEmpty()) { // return true; // } // return false; // } // return isDiagramOnlyNotification; // } // // @Override // public String toString() { // StringBuffer sb = new StringBuffer(); // sb.append(this.getClass().getName() + NEW_LINE); // // sb.append(" # added children = " + this.addedChildren.size() + NEW_LINE); //$NON-NLS-1$ // sb.append(" # add/remove targets = " + this.addOrRemoveTargets.size() + NEW_LINE); //$NON-NLS-1$ // sb.append(" # changed targets = " + this.changeTargets.size() + NEW_LINE); //$NON-NLS-1$ // sb.append(" # changed models = " + this.changedModels.size() + NEW_LINE); //$NON-NLS-1$ // sb.append(" # changed resources = " + this.modifiedResources.size() + NEW_LINE); //$NON-NLS-1$ // sb.append(" Model Children Changed = " + this.modelChildrenChanged + NEW_LINE); //$NON-NLS-1$ // sb.append(" All Changes to Ignorable= " + this.allChangesAreIgnorable() + NEW_LINE); //$NON-NLS-1$ // // return sb.toString(); // } }