MarkerDelta.java :  » IDE-Eclipse » core » org » eclipse » core » internal » resources » Java Open Source

Java Open Source » IDE Eclipse » core 
core » org » eclipse » core » internal » resources » MarkerDelta.java
/*******************************************************************************
 * Copyright (c) 2000, 2005 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 API and implementation
 *******************************************************************************/
package org.eclipse.core.internal.resources;

import java.util.Iterator;
import java.util.Map;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.IPath;

/**
 * @see IMarkerDelta
 */
public class MarkerDelta implements IMarkerDelta, IMarkerSetElement {
  protected int kind;
  protected IResource resource;
  protected MarkerInfo info;

  /**
   * Creates a new marker delta.
   */
  public MarkerDelta(int kind, IResource resource, MarkerInfo info) {
    this.kind = kind;
    this.resource = resource;
    this.info = info;
  }

  /* (non-Javadoc)
   * @see IMarkerDelta#getAttribute(String)
   */
  public Object getAttribute(String attributeName) {
    return info.getAttribute(attributeName);
  }

  /* (non-Javadoc)
   * @see IMarkerDelta#getAttribute(String, int)
   */
  public int getAttribute(String attributeName, int defaultValue) {
    Object value = info.getAttribute(attributeName);
    if (value instanceof Integer)
      return ((Integer) value).intValue();
    return defaultValue;
  }

  /* (non-Javadoc)
   * @see IMarkerDelta#getAttribute(String, String)
   */
  public String getAttribute(String attributeName, String defaultValue) {
    Object value = info.getAttribute(attributeName);
    if (value instanceof String)
      return (String) value;
    return defaultValue;
  }

  /* (non-Javadoc)
   * @see IMarkerDelta#getAttribute(String, boolean)
   */
  public boolean getAttribute(String attributeName, boolean defaultValue) {
    Object value = info.getAttribute(attributeName);
    if (value instanceof Boolean)
      return ((Boolean) value).booleanValue();
    return defaultValue;
  }

  /* (non-Javadoc)
   * @see IMarkerDelta#getAttributes()
   */
  public Map getAttributes() {
    return info.getAttributes();
  }

  /* (non-Javadoc)
   * @see IMarkerDelta#getAttributes(String[])
   */
  public Object[] getAttributes(String[] attributeNames) {
    return info.getAttributes(attributeNames);
  }

  /* (non-Javadoc)
   * @see IMarkerDelta#getId()
   */
  public long getId() {
    return info.getId();
  }

  /* (non-Javadoc)
   * @see IMarkerDelta#getKind()
   */
  public int getKind() {
    return kind;
  }

  /* (non-Javadoc)
   * @see IMarkerDelta#getMarker()
   */
  public IMarker getMarker() {
    return new Marker(resource, getId());
  }

  /* (non-Javadoc)
   * @see IMarkerDelta#getResource()
   */
  public IResource getResource() {
    return resource;
  }

  /* (non-Javadoc)
   * @see IMarkerDelta#getType()
   */
  public String getType() {
    return info.getType();
  }

  /* (non-Javadoc)
   * @see IMarkerDelta#isSubtypeOf(String)
   */
  public boolean isSubtypeOf(String superType) {
    return ((Workspace) getResource().getWorkspace()).getMarkerManager().isSubtype(getType(), superType);
  }

  /**
   * Merge two Maps of (IPath->MarkerSet) representing changes.  Use the old
   * map to store the result so we don't have to build a new map to return.
   */
  public static Map merge(Map oldChanges, Map newChanges) {
    if (oldChanges == null)
      //don't worry about copying since the new changes are no longer used
      return newChanges;
    if (newChanges == null)
      return oldChanges;
    for (Iterator it = newChanges.keySet().iterator(); it.hasNext();) {
      IPath key = (IPath) it.next();
      MarkerSet oldSet = (MarkerSet) oldChanges.get(key);
      MarkerSet newSet = (MarkerSet) newChanges.get(key);
      if (oldSet == null)
        oldChanges.put(key, newSet);
      else
        merge(oldSet, newSet.elements());
    }
    return oldChanges;
  }

  /**
   * Merge two sets of marker changes.  Both sets must be on the same resource. Use the original set
   * of changes to store the result so we don't have to build a completely different set to return.
   * 
   * add + add = N/A
   * add + remove = nothing (no delta)
   * add + change = add
   * remove + add = N/A
   * remove + remove = N/A
   * remove + change = N/A
   * change + add = N/A
   * change + change = change  (note: info held onto by the marker delta should be that of the oldest change, and not replaced when composed)
   * change + remove = remove (note: info held onto by the marker delta should be that of the oldest change, and not replaced when changed to a remove)
   */
  protected static MarkerSet merge(MarkerSet oldChanges, IMarkerSetElement[] newChanges) {
    if (oldChanges == null) {
      MarkerSet result = new MarkerSet(newChanges.length);
      for (int i = 0; i < newChanges.length; i++)
        result.add(newChanges[i]);
      return result;
    }
    if (newChanges == null)
      return oldChanges;

    for (int i = 0; i < newChanges.length; i++) {
      MarkerDelta newDelta = (MarkerDelta) newChanges[i];
      MarkerDelta oldDelta = (MarkerDelta) oldChanges.get(newDelta.getId());
      if (oldDelta == null) {
        oldChanges.add(newDelta);
        continue;
      }
      switch (oldDelta.getKind()) {
        case IResourceDelta.ADDED :
          switch (newDelta.getKind()) {
            case IResourceDelta.ADDED :
              // add + add = N/A
              break;
            case IResourceDelta.REMOVED :
              // add + remove = nothing
              // Remove the original ADD delta.
              oldChanges.remove(oldDelta);
              break;
            case IResourceDelta.CHANGED :
              // add + change = add
              break;
          }
          break;
        case IResourceDelta.REMOVED :
          switch (newDelta.getKind()) {
            case IResourceDelta.ADDED :
              // remove + add = N/A
              break;
            case IResourceDelta.REMOVED :
              // remove + remove = N/A
              break;
            case IResourceDelta.CHANGED :
              // remove + change = N/A
              break;
          }
          break;
        case IResourceDelta.CHANGED :
          switch (newDelta.getKind()) {
            case IResourceDelta.ADDED :
              // change + add = N/A
              break;
            case IResourceDelta.REMOVED :
              // change + remove = remove
              // Change the delta kind.
              oldDelta.setKind(IResourceDelta.REMOVED);
              break;
            case IResourceDelta.CHANGED :
              // change + change = change
              break;
          }
          break;
      }
    }
    return oldChanges;
  }

  private void setKind(int kind) {
    this.kind = kind;
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.