/******************************************************************************* * Copyright (c) 2005, 2008 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.internal.core.envvar; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.cdt.core.envvar.IEnvironmentVariable; import org.eclipse.cdt.utils.envvar.EnvVarOperationProcessor; /** * This class implements the "merging" functionality of environment variables * Used by the EnvironmentVariableProvider to "merge" the sets of macros returned * by different suppliers into one set returned to the user * * @since 3.0 * */ public class EnvVarCollector { private Map<String, EnvVarDescriptor> fMap = null; public EnvVarCollector(){ } /** * adds an array of environment variables to the set of variables held by this collector * performing environment variable operations * @param vars */ public void add(IEnvironmentVariable vars[]){ add(vars,null,-1, null); } public void add(IEnvironmentVariable vars[], IEnvironmentContextInfo info, int num, ICoreEnvironmentVariableSupplier supplier){ if(vars == null) return; boolean isCaseInsensitive = !EnvironmentVariableManager.getDefault().isVariableCaseSensitive(); for(int i = 0; i < vars.length; i ++) { IEnvironmentVariable var = vars[i]; String name = var.getName(); if(isCaseInsensitive) name = name.toUpperCase(); boolean noCheck = false; if(fMap == null){ noCheck = true; fMap = new HashMap<String, EnvVarDescriptor>(); } EnvVarDescriptor des = null; if(noCheck || (des = fMap.get(name)) == null){ des = new EnvVarDescriptor(var,info,num, supplier); fMap.put(name,des); } else { des.setContextInfo(info); des.setSupplierNum(num); des.setVariable(EnvVarOperationProcessor.performOperation(des.getOriginalVariable(),var)); } } } /** * Returns an array of variables held by this collector * * @param includeRemoved true if removed variables should be included in the resulting array * @return IBuildEnvironmentVariable[] */ public EnvVarDescriptor[] toArray(boolean includeRemoved){ if(fMap == null) return new EnvVarDescriptor[0]; Collection<EnvVarDescriptor> values = fMap.values(); List<EnvVarDescriptor> list = new ArrayList<EnvVarDescriptor>(); Iterator<EnvVarDescriptor> iter = values.iterator(); while(iter.hasNext()){ EnvVarDescriptor des = iter.next(); if(des != null && (includeRemoved || des.getOperation() != IEnvironmentVariable.ENVVAR_REMOVE)) list.add(des); } return list.toArray(new EnvVarDescriptor[list.size()]); } /** * Returns a variable of a given name held by this collector * * @param name a variable name * @return IBuildEnvironmentVariable */ public EnvVarDescriptor getVariable(String name){ if(fMap == null) return null; if(!EnvironmentVariableManager.getDefault().isVariableCaseSensitive()) name = name.toUpperCase(); return fMap.get(name); } /** * Returns an array of variables held by this collector * The call to this method is equivalent of calling toArray(true) * * @return IBuildEnvironmentVariable[] */ public EnvVarDescriptor[] getVariables(){ return toArray(true); } public void clear(){ if(fMap != null) fMap.clear(); } }