/******************************************************************************* * Copyright (c) 2000, 2009 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.Map; import org.eclipse.core.internal.utils.Messages; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.osgi.util.NLS; /** * An abstract marker implementation. Subclasses must implement the <code>clone</code> method, and * are free to declare additional field and method members. * <p> * Note: Marker objects do not store whether they are "standalone" vs. "attached" to the workspace. * This information is maintained by the workspace. * </p> * * @see IMarker */ public class Marker extends PlatformObject implements IMarker { /** Marker identifier. */ protected long id; /** Resource with which this marker is associated. */ protected IResource resource; /** * Constructs a new marker object. */ Marker(IResource resource, long id) { Assert.isLegal(resource != null); this.resource= resource; this.id= id; } /** * Checks the given marker info to ensure that it is not null. Throws an exception if it is. */ private void checkInfo(MarkerInfo info) throws CoreException { if (info == null) { String message= NLS.bind(Messages.resources_markerNotFound, Long.toString(id)); throw new ResourceException(new ResourceStatus(IResourceStatus.MARKER_NOT_FOUND, resource.getFullPath(), message)); } } /** * @see IMarker#delete() */ public void delete() throws CoreException { final ISchedulingRule rule= getWorkspace().getRuleFactory().markerRule(resource); try { getWorkspace().prepareOperation(rule, null); getWorkspace().beginOperation(true); getWorkspace().getMarkerManager().removeMarker(getResource(), getId()); } finally { getWorkspace().endOperation(rule, false, null); } } /** * @see IMarker#equals(Object) */ public boolean equals(Object object) { if (!(object instanceof IMarker)) return false; IMarker other= (IMarker)object; return (id == other.getId() && resource.equals(other.getResource())); } /** * @see IMarker#exists() */ public boolean exists() { return getInfo() != null; } /** * @see IMarker#getAttribute(String) */ public Object getAttribute(String attributeName) throws CoreException { Assert.isNotNull(attributeName); MarkerInfo info= getInfo(); checkInfo(info); return info.getAttribute(attributeName); } /** * @see IMarker#getAttribute(String, int) */ public int getAttribute(String attributeName, int defaultValue) { Assert.isNotNull(attributeName); MarkerInfo info= getInfo(); if (info == null) return defaultValue; Object value= info.getAttribute(attributeName); if (value instanceof Integer) return ((Integer)value).intValue(); return defaultValue; } /** * @see IMarker#getAttribute(String, String) */ public String getAttribute(String attributeName, String defaultValue) { Assert.isNotNull(attributeName); MarkerInfo info= getInfo(); if (info == null) return defaultValue; Object value= info.getAttribute(attributeName); if (value instanceof String) return (String)value; return defaultValue; } /** * @see IMarker#getAttribute(String, boolean) */ public boolean getAttribute(String attributeName, boolean defaultValue) { Assert.isNotNull(attributeName); MarkerInfo info= getInfo(); if (info == null) return defaultValue; Object value= info.getAttribute(attributeName); if (value instanceof Boolean) return ((Boolean)value).booleanValue(); return defaultValue; } /** * @see IMarker#getAttributes() */ public Map getAttributes() throws CoreException { MarkerInfo info= getInfo(); checkInfo(info); return info.getAttributes(); } /** * @see IMarker#getAttributes(String[]) */ public Object[] getAttributes(String[] attributeNames) throws CoreException { Assert.isNotNull(attributeNames); MarkerInfo info= getInfo(); checkInfo(info); return info.getAttributes(attributeNames); } /** * @see IMarker#getCreationTime() */ public long getCreationTime() throws CoreException { MarkerInfo info= getInfo(); checkInfo(info); return info.getCreationTime(); } /** * @see IMarker#getId() */ public long getId() { return id; } protected MarkerInfo getInfo() { return getWorkspace().getMarkerManager().findMarkerInfo(resource, id); } /** * @see IMarker#getResource() */ public IResource getResource() { return resource; } /** * @see IMarker#getType() */ public String getType() throws CoreException { MarkerInfo info= getInfo(); checkInfo(info); return info.getType(); } /** * Returns the workspace which manages this marker. Returns <code>null</code> if this resource * does not have an associated resource. */ private Workspace getWorkspace() { return resource == null ? null : (Workspace)resource.getWorkspace(); } public int hashCode() { return (int)id + resource.hashCode(); } /** * @see IMarker#isSubtypeOf(String) */ public boolean isSubtypeOf(String type) throws CoreException { return getWorkspace().getMarkerManager().isSubtype(getType(), type); } /** * @see IMarker#setAttribute(String, int) */ public void setAttribute(String attributeName, int value) throws CoreException { setAttribute(attributeName, new Integer(value)); } /** * @see IMarker#setAttribute(String, Object) */ public void setAttribute(String attributeName, Object value) throws CoreException { Assert.isNotNull(attributeName); Workspace workspace= getWorkspace(); MarkerManager manager= workspace.getMarkerManager(); try { workspace.prepareOperation(null, null); workspace.beginOperation(true); MarkerInfo markerInfo= getInfo(); checkInfo(markerInfo); //only need to generate delta info if none already boolean needDelta= !manager.hasDelta(resource.getFullPath(), id); MarkerInfo oldInfo= needDelta ? (MarkerInfo)markerInfo.clone() : null; boolean validate= manager.isPersistentType(markerInfo.getType()); markerInfo.setAttribute(attributeName, value, validate); if (manager.isPersistent(markerInfo)) ((Resource)resource).getResourceInfo(false, true).set(ICoreConstants.M_MARKERS_SNAP_DIRTY); if (needDelta) { MarkerDelta delta= new MarkerDelta(IResourceDelta.CHANGED, resource, oldInfo); manager.changedMarkers(resource, new MarkerDelta[] { delta }); } } finally { workspace.endOperation(null, false, null); } } /** * @see IMarker#setAttribute(String, boolean) */ public void setAttribute(String attributeName, boolean value) throws CoreException { setAttribute(attributeName, value ? Boolean.TRUE : Boolean.FALSE); } /** * @see IMarker#setAttributes(String[], Object[]) */ public void setAttributes(String[] attributeNames, Object[] values) throws CoreException { Assert.isNotNull(attributeNames); Assert.isNotNull(values); Workspace workspace= getWorkspace(); MarkerManager manager= workspace.getMarkerManager(); try { workspace.prepareOperation(null, null); workspace.beginOperation(true); MarkerInfo markerInfo= getInfo(); checkInfo(markerInfo); //only need to generate delta info if none already boolean needDelta= !manager.hasDelta(resource.getFullPath(), id); MarkerInfo oldInfo= needDelta ? (MarkerInfo)markerInfo.clone() : null; boolean validate= manager.isPersistentType(markerInfo.getType()); markerInfo.setAttributes(attributeNames, values, validate); if (manager.isPersistent(markerInfo)) ((Resource)resource).getResourceInfo(false, true).set(ICoreConstants.M_MARKERS_SNAP_DIRTY); if (needDelta) { MarkerDelta delta= new MarkerDelta(IResourceDelta.CHANGED, resource, oldInfo); manager.changedMarkers(resource, new MarkerDelta[] { delta }); } } finally { workspace.endOperation(null, false, null); } } /** * @see IMarker#setAttributes(Map) */ public void setAttributes(Map values) throws CoreException { Workspace workspace= getWorkspace(); MarkerManager manager= workspace.getMarkerManager(); try { workspace.prepareOperation(null, null); workspace.beginOperation(true); MarkerInfo markerInfo= getInfo(); checkInfo(markerInfo); //only need to generate delta info if none already boolean needDelta= !manager.hasDelta(resource.getFullPath(), id); MarkerInfo oldInfo= needDelta ? (MarkerInfo)markerInfo.clone() : null; boolean validate= manager.isPersistentType(markerInfo.getType()); markerInfo.setAttributes(values, validate); if (manager.isPersistent(markerInfo)) ((Resource)resource).getResourceInfo(false, true).set(ICoreConstants.M_MARKERS_SNAP_DIRTY); if (needDelta) { MarkerDelta delta= new MarkerDelta(IResourceDelta.CHANGED, resource, oldInfo); manager.changedMarkers(resource, new MarkerDelta[] { delta }); } } finally { workspace.endOperation(null, false, null); } } }