blob: 7b7151e6a885da38a46744114ffd72978fe8f257 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 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
* James Blackburn (Broadcom Corp.) - ongoing development
* Lars Vogel <Lars.Vogel@vogella.com> - Bug 473427
*******************************************************************************/
package org.eclipse.core.internal.resources;
import java.util.HashMap;
import org.eclipse.core.internal.events.BuildCommand;
import org.eclipse.core.resources.ICommand;
import org.eclipse.core.resources.IProjectNature;
import org.eclipse.core.runtime.content.IContentTypeMatcher;
public class ProjectInfo extends ResourceInfo {
/** The description of this object */
protected ProjectDescription description = null;
/** The list of natures for this project */
protected HashMap<String, IProjectNature> natures = null;
/** The property store for this resource (used only by the compatibility fragment) */
protected Object propertyStore = null;
/** The content type matcher for this project. */
protected IContentTypeMatcher matcher = null;
/**
* Discards stale natures on this project after project description
* has changed.
*/
public synchronized void discardNatures() {
natures = null;
}
/**
* Discards any stale state on this project after it has been moved. Builder
* instances must be cleared because they reference the old project handle.
*/
public synchronized void fixupAfterMove() {
natures = null;
// note that the property store instance will be recreated lazily
propertyStore = null;
if (description != null) {
ICommand[] buildSpec = description.getBuildSpec(false);
for (int i = 0; i < buildSpec.length; i++)
((BuildCommand) buildSpec[i]).setBuilders(null);
}
}
/**
* Returns the description associated with this info. The return value may be null.
*/
public ProjectDescription getDescription() {
return description;
}
/**
* Returns the content type matcher associated with this info. The return value may be null.
*/
public IContentTypeMatcher getMatcher() {
return matcher;
}
public IProjectNature getNature(String natureId) {
// thread safety: (Concurrency001)
HashMap<String, IProjectNature> temp = natures;
if (temp == null)
return null;
return temp.get(natureId);
}
/**
* Returns the property store associated with this info. The return value may be null.
*/
@Override
public Object getPropertyStore() {
return propertyStore;
}
/**
* Sets the description associated with this info. The value may be null.
*/
public void setDescription(ProjectDescription value) {
if (description != null) {
//if we already have a description, assign the new
//build spec on top of the old one to ensure we maintain
//any existing builder instances in the old build commands
ICommand[] oldSpec = description.buildSpec;
ICommand[] newSpec = value.buildSpec;
value.buildSpec = oldSpec;
value.setBuildSpec(newSpec);
}
description = value;
}
/**
* Sets the content type matcher to be associated with this info. The value may be null.
*/
public void setMatcher(IContentTypeMatcher matcher) {
this.matcher = matcher;
}
@SuppressWarnings({"unchecked"})
public synchronized void setNature(String natureId, IProjectNature value) {
// thread safety: (Concurrency001)
if (value == null) {
if (natures == null)
return;
HashMap<String, IProjectNature> temp = (HashMap<String, IProjectNature>) natures.clone();
temp.remove(natureId);
if (temp.isEmpty())
natures = null;
else
natures = temp;
} else {
HashMap<String, IProjectNature> temp = natures;
if (temp == null)
temp = new HashMap<>(5);
else
temp = (HashMap<String, IProjectNature>) natures.clone();
temp.put(natureId, value);
natures = temp;
}
}
/**
* Sets the property store associated with this info. The value may be null.
*/
@Override
public void setPropertyStore(Object value) {
propertyStore = value;
}
}