/*******************************************************************************
* Copyright (c) 2007 Intel 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:
* Intel Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.managedbuilder.internal.buildproperties;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.StringTokenizer;
import org.eclipse.cdt.core.settings.model.util.CDataUtil;
import org.eclipse.cdt.managedbuilder.buildproperties.IBuildProperties;
import org.eclipse.cdt.managedbuilder.buildproperties.IBuildProperty;
import org.eclipse.core.runtime.CoreException;
public class BuildProperties implements IBuildProperties {
private HashMap<String, IBuildProperty> fPropertiesMap = new HashMap<String, IBuildProperty>();
private ArrayList<String> fInexistentProperties;
public BuildProperties(){
}
public BuildProperties(String properties){
StringTokenizer t = new StringTokenizer(properties, BuildPropertyManager.PROPERTIES_SEPARATOR);
while(t.hasMoreTokens()){
String property = t.nextToken();
try {
BuildProperty prop = new BuildProperty(property);
addProperty(prop);
} catch (CoreException e) {
if(fInexistentProperties == null)
fInexistentProperties = new ArrayList<String>();
fInexistentProperties.add(property);
}
}
if(fInexistentProperties != null)
fInexistentProperties.trimToSize();
}
@SuppressWarnings("unchecked")
public BuildProperties(BuildProperties properties){
fPropertiesMap.putAll(properties.fPropertiesMap);
if(properties.fInexistentProperties != null)
fInexistentProperties = (ArrayList<String>)properties.fInexistentProperties.clone();
}
public IBuildProperty[] getProperties(){
return fPropertiesMap.values().toArray(new BuildProperty[fPropertiesMap.size()]);
}
public IBuildProperty getProperty(String id){
return fPropertiesMap.get(id);
}
void addProperty(IBuildProperty property){
fPropertiesMap.put(property.getPropertyType().getId(), property);
}
public IBuildProperty setProperty(String propertyId, String propertyValue) throws CoreException {
return setProperty(propertyId, propertyValue, false);
}
public IBuildProperty setProperty(String propertyId, String propertyValue, boolean force) throws CoreException {
try {
IBuildProperty property = BuildPropertyManager.getInstance().createProperty(propertyId, propertyValue);
addProperty(property);
return property;
} catch (CoreException e){
if(force){
if(fInexistentProperties == null)
fInexistentProperties = new ArrayList<String>(1);
fInexistentProperties.add(BuildProperty.toString(propertyId, propertyValue));
fInexistentProperties.trimToSize();
}
throw e;
}
}
public IBuildProperty removeProperty(String id){
return fPropertiesMap.remove(id);
}
void removeProperty(BuildProperty property){
fPropertiesMap.remove(property.getPropertyType().getId());
}
@Override
public String toString(){
String props = toStringExistingProperties();
if(fInexistentProperties != null){
String inexistentProps = CDataUtil.arrayToString(fInexistentProperties.toArray(new String[fInexistentProperties.size()]), BuildPropertyManager.PROPERTIES_SEPARATOR);
if(props.length() != 0){
StringBuffer buf = new StringBuffer();
buf.append(props).append(BuildPropertyManager.PROPERTIES_SEPARATOR).append(inexistentProps);
} else {
props = inexistentProps;
}
}
return props;
}
public String toStringExistingProperties(){
int size = fPropertiesMap.size();
if(size == 0)
return ""; //$NON-NLS-1$
else if(size == 1)
return fPropertiesMap.values().iterator().next().toString();
StringBuffer buf = new StringBuffer();
Iterator<IBuildProperty> iter = fPropertiesMap.values().iterator();
buf.append(iter.next().toString());
for(;iter.hasNext();){
buf.append(BuildPropertyManager.PROPERTIES_SEPARATOR);
buf.append(iter.next().toString());
}
return buf.toString();
}
@SuppressWarnings("unchecked")
@Override
public Object clone() {
try {
BuildProperties clone = (BuildProperties)super.clone();
if(fInexistentProperties != null)
clone.fInexistentProperties = (ArrayList<String>)fInexistentProperties.clone();
clone.fPropertiesMap = (HashMap<String, IBuildProperty>)fPropertiesMap.clone();
/* for(Iterator iter = clone.fPropertiesMap.entrySet().iterator(); iter.hasNext();){
Map.Entry entry = (Map.Entry)iter.next();
BuildProperty prop = (BuildProperty)entry.getValue();
entry.setValue(prop.clone());
}
*/
return clone;
} catch (CloneNotSupportedException e) {
}
return null;
}
public void clear() {
fPropertiesMap.clear();
fInexistentProperties.clear();
}
public boolean containsValue(String propertyId, String valueId) {
IBuildProperty prop = getProperty(propertyId);
if(prop != null){
return valueId.equals(prop.getValue().getId());
}
return false;
}
}