/******************************************************************************* * 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.ArrayList; import org.eclipse.core.internal.utils.Messages; import org.eclipse.core.resources.IProjectNatureDescriptor; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.*; import org.eclipse.osgi.util.NLS; /** */ public class ProjectNatureDescriptor implements IProjectNatureDescriptor { protected String id; protected String label; protected String[] requiredNatures; protected String[] natureSets; protected String[] builderIds; protected String[] contentTypeIds; protected boolean allowLinking= true; //descriptors that are in a dependency cycle are never valid protected boolean hasCycle= false; //colours used by cycle detection algorithm protected byte colour= 0; /** * Creates a new descriptor based on the given extension markup. * * @exception CoreException if the given nature extension is not correctly formed. */ protected ProjectNatureDescriptor(IExtension natureExtension) throws CoreException { readExtension(natureExtension); } protected void fail() throws CoreException { fail(NLS.bind(Messages.natures_invalidDefinition, id)); } protected void fail(String reason) throws CoreException { throw new ResourceException(new Status(IStatus.ERROR, ResourcesPlugin.PI_RESOURCES, 1, reason, null)); } /** * Returns the IDs of the incremental builders that this nature claims to own. These builders do * not necessarily exist in the registry. */ public String[] getBuilderIds() { return builderIds; } /** * Returns the IDs of the content types this nature declares to have affinity with. These * content types do not necessarily exist in the registry. */ public String[] getContentTypeIds() { return contentTypeIds; } /** * @see IProjectNatureDescriptor#getNatureId() */ public String getNatureId() { return id; } /** * @see IProjectNatureDescriptor#getLabel() */ public String getLabel() { return label; } /** * @see IProjectNatureDescriptor#getRequiredNatureIds() */ public String[] getRequiredNatureIds() { return requiredNatures; } /** * @see IProjectNatureDescriptor#getNatureSetIds() */ public String[] getNatureSetIds() { return natureSets; } /** * @see IProjectNatureDescriptor#isLinkingAllowed() */ public boolean isLinkingAllowed() { return allowLinking; } /** * Initialize this nature descriptor based on the provided extension point. */ protected void readExtension(IExtension natureExtension) throws CoreException { //read the extension id= natureExtension.getUniqueIdentifier(); if (id == null) { fail(Messages.natures_missingIdentifier); } label= natureExtension.getLabel(); IConfigurationElement[] elements= natureExtension.getConfigurationElements(); int count= elements.length; ArrayList requiredList= new ArrayList(count); ArrayList setList= new ArrayList(count); ArrayList builderList= new ArrayList(count); ArrayList contentTypeList= new ArrayList(count); for (int i= 0; i < count; i++) { IConfigurationElement element= elements[i]; String name= element.getName(); if (name.equalsIgnoreCase("requires-nature")) { //$NON-NLS-1$ String attribute= element.getAttribute("id"); //$NON-NLS-1$ if (attribute == null) fail(); requiredList.add(attribute); } else if (name.equalsIgnoreCase("one-of-nature")) { //$NON-NLS-1$ String attribute= element.getAttribute("id"); //$NON-NLS-1$ if (attribute == null) fail(); setList.add(attribute); } else if (name.equalsIgnoreCase("builder")) { //$NON-NLS-1$ String attribute= element.getAttribute("id"); //$NON-NLS-1$ if (attribute == null) fail(); builderList.add(attribute); } else if (name.equalsIgnoreCase("content-type")) { //$NON-NLS-1$ String attribute= element.getAttribute("id"); //$NON-NLS-1$ if (attribute == null) fail(); contentTypeList.add(attribute); } else if (name.equalsIgnoreCase("options")) { //$NON-NLS-1$ String attribute= element.getAttribute("allowLinking"); //$NON-NLS-1$ //when in doubt (missing attribute, wrong value) default to allow linking allowLinking= !Boolean.FALSE.toString().equalsIgnoreCase(attribute); } } requiredNatures= (String[])requiredList.toArray(new String[requiredList.size()]); natureSets= (String[])setList.toArray(new String[setList.size()]); builderIds= (String[])builderList.toArray(new String[builderList.size()]); contentTypeIds= (String[])contentTypeList.toArray(new String[contentTypeList.size()]); } /** * Prints out a string representation for debugging purposes only. */ public String toString() { return "ProjectNatureDescriptor(" + id + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } }