diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ExclusionInstance.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ExclusionInstance.java new file mode 100644 index 00000000000..01e7559580f --- /dev/null +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ExclusionInstance.java @@ -0,0 +1,193 @@ +/******************************************************************************* + * Copyright (c) 2011 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.cdt.core.resources; + +import java.lang.reflect.Constructor; + +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +/** + * Represents a particular instance of an exclusion. E.g., if an exclusion allowed + * for the exclusion of a list individual resources, there would be one exclusion instance + * per resource. Each exclusion instance is presented in the user interface as a child of the exclusion. + * + * Clients may extend this class to provide custom implementations for their exclusion type. + * + * EXPERIMENTAL. This class or interface has been added as + * part of a work in progress. There is no guarantee that this API will work or + * that it will remain the same. Please do not use this API without consulting + * with the CDT team. + * + * @author crecoskie + * @since 5.3 + * + */ +public class ExclusionInstance { + + public static final String CLASS_ATTRIBUTE_NAME = "class"; //$NON-NLS-1$ + public static final String EXTENSION_DATA_ELEMENT_NAME = "extensionData"; //$NON-NLS-1$ + public static final String CONTRIBUTOR_ID_ATTRIBUTE_NAME = "contributorId"; //$NON-NLS-1$ + public static final String INSTANCE_ELEMENT_NAME = "instance"; //$NON-NLS-1$ + public static final String WORKSPACE_PATH_ATTRIBUTE_NAME = "workspacePath"; //$NON-NLS-1$ + public static final String EXCLUSION_TYPE_ATTRIBUTE_NAME = "exclusionType"; //$NON-NLS-1$ + public static final String EXCLUSION_ELEMENT_NAME = "exclusion"; //$NON-NLS-1$ + public static final String RESOURCE_VALUE = "RESOURCE"; //$NON-NLS-1$ + public static final String FOLDER_VALUE = "FOLDER"; //$NON-NLS-1$ + public static final String FILE_VALUE = "FILE"; //$NON-NLS-1$ + public static final String DISPLAY_STRING_ATTRIBUTE_NAME = "displayString"; //$NON-NLS-1$ + + private ExclusionType fInstanceExclusionType; + private IResource fResource; + private String fDisplayString; + + public ExclusionType getExclusionType() { + return fInstanceExclusionType; + } + + public void setExclusionType(ExclusionType type) { + fInstanceExclusionType = type; + } + + /** + * If there is a resource directly associated with this exclusion instance, returns the resource. + * + * @return IResource + */ + public IResource getResource() { + return fResource; + } + + public void setResource(IResource resource) { + fResource = resource; + } + + /** + * @return a String corresponding to the human-readable name for this exclusion instance. + * Examples of this would be the resource name for a resource based exclusion, or the file extension + * excluded by a file extension exclusion. + */ + public String getDisplayString() { + return fDisplayString; + } + + public void setDisplayString(String displayString) { + fDisplayString = displayString; + } + + public void persistInstanceData(Document doc, Element extensionElement) { + + // persist the type of the object we are + extensionElement.setAttribute(CLASS_ATTRIBUTE_NAME, this.getClass().getName()); + + Element instanceElement = doc.createElement(INSTANCE_ELEMENT_NAME); + + // persist the exclusion type + String exclusionType = null; + switch(getExclusionType()) { + case FILE: + exclusionType = FILE_VALUE; + break; + + case FOLDER: + exclusionType = FOLDER_VALUE; + break; + + case RESOURCE: + exclusionType = RESOURCE_VALUE; + break; + } + + if(exclusionType != null) { + instanceElement.setAttribute(EXCLUSION_TYPE_ATTRIBUTE_NAME, exclusionType); + } + + // persist resource path + if(fResource != null) { + instanceElement.setAttribute(WORKSPACE_PATH_ATTRIBUTE_NAME, fResource.getFullPath().toString()); + } + + // persist display string + if(fDisplayString != null) { + instanceElement.setAttribute(DISPLAY_STRING_ATTRIBUTE_NAME, fDisplayString); + } + + // persist any data from extenders + persistExtendedInstanceData(doc, instanceElement); + + } + + protected void persistExtendedInstanceData(Document doc, Element instanceElement) { + // override to provide extension specific behaviour if desired + } + + @SuppressWarnings("rawtypes") + public static ExclusionInstance loadInstanceData(Element instanceElement) { + + String classname = instanceElement.getAttribute(CLASS_ATTRIBUTE_NAME); + + ExclusionInstance newInstance = null; + Class instanceClass; + try { + instanceClass = Class.forName(classname); + + Class[] parameterTypes = new Class[0]; + Constructor constructor = instanceClass.getConstructor(parameterTypes); + newInstance = (ExclusionInstance) constructor.newInstance((Object[]) null); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + + // load the exclusion type + String exclusionTypeString = instanceElement.getAttribute(EXCLUSION_TYPE_ATTRIBUTE_NAME); + if(exclusionTypeString != null) { + if(exclusionTypeString.equals(FILE_VALUE)) { + newInstance.fInstanceExclusionType = org.eclipse.cdt.core.resources.ExclusionType.FILE; + } + + else if(exclusionTypeString.equals(FOLDER_VALUE)) { + newInstance.fInstanceExclusionType = org.eclipse.cdt.core.resources.ExclusionType.FOLDER; + } + + else if(exclusionTypeString.equals(RESOURCE_VALUE)) { + newInstance.fInstanceExclusionType = org.eclipse.cdt.core.resources.ExclusionType.RESOURCE; + } + + else { + // error + return null; + } + } + + // load resource path, use it to get the corresponding resource + String resourcePath = instanceElement.getAttribute(WORKSPACE_PATH_ATTRIBUTE_NAME); + + if(resourcePath != null) { + newInstance.fResource = ResourcesPlugin.getWorkspace().getRoot().findMember(resourcePath); + } + + // load display string + newInstance.fDisplayString = instanceElement.getAttribute(DISPLAY_STRING_ATTRIBUTE_NAME); + + + // load any data from extenders + newInstance.loadExtendedInstanceData(instanceElement); + + return newInstance; + } + + protected void loadExtendedInstanceData(Element instanceElement) { + // override to provide extension specific behaviour if desired + } +} \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ExclusionType.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ExclusionType.java new file mode 100644 index 00000000000..f98d6cbfb85 --- /dev/null +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ExclusionType.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2011 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.cdt.core.resources; + +/** + * Indicates the type of resources that this exclusion can exclude. Used to determine which type of icon is displayed in + * the exclusion UI when this exclusion is present. + * + * EXPERIMENTAL. This class or interface has been added as + * part of a work in progress. There is no guarantee that this API will work or + * that it will remain the same. Please do not use this API without consulting + * with the CDT team. + * + * @author crecoskie + * @since 5.3 + * + */ +public enum ExclusionType { + /** + * Constant indicating that this exclusion only excludes folders. + */ + FOLDER, + + + /** + * Constant indicating that this exclusion only excludes folders. + */ + FILE, + + + /** + * Constant indicating that this exclusion can exclude any resource. + */ + RESOURCE +} \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/RefreshExclusion.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/RefreshExclusion.java index 549a0989574..7733bfc01c8 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/RefreshExclusion.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/RefreshExclusion.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.cdt.core.resources; +import java.lang.reflect.Constructor; import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -17,6 +18,8 @@ import java.util.List; import org.eclipse.core.resources.IResource; import org.w3c.dom.Document; import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; /** * A RefreshExclusion represents a rule for excluding certain resources from being refreshed. @@ -34,6 +37,7 @@ import org.w3c.dom.Element; */ public abstract class RefreshExclusion { + public static final String CLASS_ATTRIBUTE_NAME = "class"; //$NON-NLS-1$ public static final String EXTENSION_DATA_ELEMENT_NAME = "extensionData"; //$NON-NLS-1$ public static final String CONTRIBUTOR_ID_ATTRIBUTE_NAME = "contributorId"; //$NON-NLS-1$ public static final String INSTANCE_ELEMENT_NAME = "instance"; //$NON-NLS-1$ @@ -45,129 +49,6 @@ public abstract class RefreshExclusion { public static final String FILE_VALUE = "FILE"; //$NON-NLS-1$ public static final String DISPLAY_STRING_ATTRIBUTE_NAME = "displayString"; //$NON-NLS-1$ - /** - * Indicates the type of resources that this exclusion can exclude. Used to determine which type of icon is displayed in - * the exclusion UI when this exclusion is present. - * - */ - public enum ExclusionType { - /** - * Constant indicating that this exclusion only excludes folders. - */ - FOLDER, - - - /** - * Constant indicating that this exclusion only excludes folders. - */ - FILE, - - - /** - * Constant indicating that this exclusion can exclude any resource. - */ - RESOURCE - } - - /** - * Represents a particular instance of an exclusion. E.g., if an exclusion allowed - * for the exclusion of a list individual resources, there would be one exclusion instance - * per resource. Each exclusion instance is presented in the user interface as a child of the exclusion. - * - * Clients may extend this class to provide custom implementations for their exclusion type. - * - */ - public class ExclusionInstance { - - private ExclusionType fInstanceExclusionType; - private IResource fResource; - private String fDisplayString; - - public ExclusionType getExclusionType() { - return fInstanceExclusionType; - } - - public void setExclusionType(ExclusionType type) { - fInstanceExclusionType = type; - } - - /** - * If there is a resource directly associated with this exclusion instance, returns the resource. - * - * @return IResource - */ - public IResource getResource() { - return fResource; - } - - public void setResource(IResource resource) { - fResource = resource; - } - - /** - * @return a String corresponding to the human-readable name for this exclusion instance. - * Examples of this would be the resource name for a resource based exclusion, or the file extension - * excluded by a file extension exclusion. - */ - public String getDisplayString() { - return fDisplayString; - } - - public void setDisplayString(String displayString) { - fDisplayString = displayString; - } - - public void persistInstanceData(Document doc, Element extensionElement) { - Element instanceElement = doc.createElement(INSTANCE_ELEMENT_NAME); - - // persist the exclusion type - String exclusionType = null; - switch(getExclusionType()) { - case FILE: - exclusionType = FILE_VALUE; - break; - - case FOLDER: - exclusionType = FOLDER_VALUE; - break; - - case RESOURCE: - exclusionType = RESOURCE_VALUE; - break; - } - - if(exclusionType != null) { - instanceElement.setAttribute(EXCLUSION_TYPE_ATTRIBUTE_NAME, exclusionType); - } - - // persist resource path - if(fResource != null) { - instanceElement.setAttribute(WORKSPACE_PATH_ATTRIBUTE_NAME, fResource.getFullPath().toString()); - } - - // persist display string - if(fDisplayString != null) { - instanceElement.setAttribute(DISPLAY_STRING_ATTRIBUTE_NAME, fDisplayString); - } - - // persist any data from extenders - persistExtendedInstanceData(doc, instanceElement); - - } - - protected void persistExtendedInstanceData(Document doc, Element instanceElement) { - // override to provide extension specific behaviour if desired - } - - public void loadInstanceData(Element extensionElement) { - - } - - protected void loadExtendedInstanceData(Element instanceElement) { - // override to provide extension specific behaviour if desired - } - } - protected List fExclusionInstanceList = new LinkedList(); protected List fNestedExclusions = new LinkedList(); protected ExclusionType fExclusionType; @@ -271,6 +152,9 @@ public abstract class RefreshExclusion { // persist the common data that all RefreshExclusions have Element exclusionElement = doc.createElement(EXCLUSION_ELEMENT_NAME); + // persist the type of the object we are + exclusionElement.setAttribute(CLASS_ATTRIBUTE_NAME, this.getClass().getName()); + // persist the exclusion type String exclusionType = null; switch(getExclusionType()) { @@ -324,8 +208,98 @@ public abstract class RefreshExclusion { // override to provide extension specific behaviour if desired } - public void loadData(Element parentElement) { + @SuppressWarnings("rawtypes") + public static RefreshExclusion loadData(Element exclusionElement, RefreshExclusion parent) { + + // create an object of the proper type using zero-argument constructor + RefreshExclusion newExclusion = null; + String classname = exclusionElement.getAttribute(CLASS_ATTRIBUTE_NAME); + Class extensionClass; + try { + extensionClass = Class.forName(classname); + + Class[] parameterTypes = new Class[0]; + Constructor constructor = extensionClass.getConstructor(parameterTypes); + newExclusion = (RefreshExclusion) constructor.newInstance((Object[]) null); + } catch (Exception e) { + // error + e.printStackTrace(); + return null; + } + + // load the exclusion type + String exclusionTypeString = exclusionElement.getAttribute(EXCLUSION_TYPE_ATTRIBUTE_NAME); + if (exclusionTypeString != null) { + if (exclusionTypeString.equals(FILE_VALUE)) { + newExclusion.fExclusionType = org.eclipse.cdt.core.resources.ExclusionType.FILE; + } + + else if (exclusionTypeString.equals(FOLDER_VALUE)) { + newExclusion.fExclusionType = org.eclipse.cdt.core.resources.ExclusionType.FOLDER; + } + + else if (exclusionTypeString.equals(RESOURCE_VALUE)) { + newExclusion.fExclusionType = org.eclipse.cdt.core.resources.ExclusionType.RESOURCE; + } + + else { + // error + } + } + + // set parent + newExclusion.fParent = parent; + + newExclusion.fContributorId = exclusionElement.getAttribute(CONTRIBUTOR_ID_ATTRIBUTE_NAME); + + // get the extension element + NodeList extensionList = exclusionElement.getElementsByTagName(EXTENSION_DATA_ELEMENT_NAME); + + for(int k = 0; k < extensionList.getLength(); k++) { + Node node = extensionList.item(k); + // the node will be an Element + if(node instanceof Element) { + Element extensionElement = (Element) node; + + // load the extension's data + newExclusion.loadExtendedData(extensionElement); + } + } + + // load instances + NodeList instanceList = exclusionElement.getElementsByTagName(INSTANCE_ELEMENT_NAME); + + for(int k = 0; k < instanceList.getLength(); k++) { + Node node = instanceList.item(k); + + // the node will be an element + if(node instanceof Element) { + Element instanceElement = (Element) node; + + // load the instance data + ExclusionInstance instance = ExclusionInstance.loadInstanceData(instanceElement); + newExclusion.fExclusionInstanceList.add(instance); + } + } + + // load nested exclusions + NodeList nestedExclusionsList = exclusionElement.getElementsByTagName(EXCLUSION_ELEMENT_NAME); + + for(int k = 0; k < nestedExclusionsList.getLength(); k++) { + Node node = nestedExclusionsList.item(k); + + // the node will be an element + if(node instanceof Element) { + Element nestedExclusionElement = (Element) node; + + // load the nested exclusion + RefreshExclusion nestedExclusion = loadData(nestedExclusionElement, newExclusion); + newExclusion.addNestedExclusion(nestedExclusion); + } + } + + return newExclusion; } } diff --git a/core/org.eclipse.cdt.ui/schema/RefreshExclusionContributor.exsd b/core/org.eclipse.cdt.ui/schema/RefreshExclusionContributor.exsd index ce332c2b1b9..ddfb1608aa2 100644 --- a/core/org.eclipse.cdt.ui/schema/RefreshExclusionContributor.exsd +++ b/core/org.eclipse.cdt.ui/schema/RefreshExclusionContributor.exsd @@ -71,6 +71,13 @@ + + + + The human readable name used to refer to this exclusion type in the UI. + + + diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/resources/RefreshExclusionContributionManager.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/resources/RefreshExclusionContributionManager.java index 48ccdd2684c..ba484a7df53 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/resources/RefreshExclusionContributionManager.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/resources/RefreshExclusionContributionManager.java @@ -62,13 +62,18 @@ public class RefreshExclusionContributionManager { if (configElement.getName().equals(EXCLUSION_CONTRIBUTOR)) { String id = configElement.getAttribute("id"); //$NON-NLS-1$ + String name = configElement.getAttribute("name"); //$NON-NLS-1$ String utility = configElement.getAttribute("class"); //$NON-NLS-1$ if (utility != null) { try { Object execExt = configElement.createExecutableExtension("class"); //$NON-NLS-1$ if ((execExt instanceof RefreshExclusionContributor) && id != null) { - fIDtoContributorsMap.put(id, (RefreshExclusionContributor) execExt); + RefreshExclusionContributor exclusionContributor = (RefreshExclusionContributor) execExt; + exclusionContributor.setID(id); + exclusionContributor.setName(name); + fIDtoContributorsMap.put(id, exclusionContributor); + } } catch (CoreException e) { CUIPlugin.log(e); @@ -79,4 +84,8 @@ public class RefreshExclusionContributionManager { } } } + + public RefreshExclusionContributor getContributor(String id) { + return fIDtoContributorsMap.get(id); + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/resources/RefreshExclusionContributor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/resources/RefreshExclusionContributor.java index 1cdc1c8f57f..d3fee17d97a 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/resources/RefreshExclusionContributor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/resources/RefreshExclusionContributor.java @@ -27,6 +27,7 @@ import org.eclipse.cdt.core.resources.RefreshExclusion; public abstract class RefreshExclusionContributor { protected String fID; + protected String fName; public String getID() { return fID; @@ -36,7 +37,22 @@ public abstract class RefreshExclusionContributor { fID = id; } + /** + * Returns the human-readable name of this exclusion type. + * + * @return + */ + public String getName() { + return fName; + } + + public void setName(String name) { + fName = name; + } + abstract public RefreshExclusion createExclusion(); abstract public void createProperiesUI(Composite parent); abstract public RefreshExclusion createExclusionFromXML(Element exclusionElement); + + }