/*******************************************************************************
* 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.buildmodel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.eclipse.cdt.core.settings.model.util.CDataUtil;
import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
public class ProjectBuildState implements IProjectBuildState {
private Properties fCfgIdToFileNameProps;
private Map<String, ConfigurationBuildState> fCfgIdToStateMap = new HashMap<String, ConfigurationBuildState>();
private IProject fProject;
private boolean fIsMapInfoDirty;
public ProjectBuildState(IProject project){
fProject = project;
}
void setProject(IProject project){
fProject = project;
Collection<ConfigurationBuildState> cbStates = fCfgIdToStateMap.values();
for (ConfigurationBuildState cbs : cbStates) {
cbs.setProject(project);
}
}
public IConfigurationBuildState getConfigurationBuildState(String id, boolean create) {
ConfigurationBuildState state = fCfgIdToStateMap.get(id);
if(state == null){
state = loadState(id, create);
if(state.exists() || create)
fCfgIdToStateMap.put(id, state);
else
state = null;
}
return state;
}
private ConfigurationBuildState loadState(String id, boolean create){
File file = getFileForCfg(id, create);
ConfigurationBuildState bs = new ConfigurationBuildState(fProject, id);
if(file != null && file.exists()){
try {
InputStream iStream = new FileInputStream(file);
bs.load(iStream);
iStream.close();
} catch (FileNotFoundException e) {
ManagedBuilderCorePlugin.log(e);
} catch (IOException e) {
ManagedBuilderCorePlugin.log(e);
}
}
return bs;
}
public IConfigurationBuildState[] getConfigurationBuildStates() {
Properties props = getIdToNameProperties();
List<IConfigurationBuildState> list = new ArrayList<IConfigurationBuildState>(props.size());
Set<Object> keySet = props.keySet();
for (Object key : keySet) {
String id = (String)key;
IConfigurationBuildState state = getConfigurationBuildState(id, false);
if(state != null)
list.add(state);
}
return list.toArray(new ConfigurationBuildState[list.size()]);
}
public void removeConfigurationBuildState(String id) {
ConfigurationBuildState cbs = (ConfigurationBuildState)getConfigurationBuildState(id, false);
if(cbs != null){
cbs.setState(IRebuildState.NEED_REBUILD);
}
}
public int getState() {
// TODO Auto-generated method stub
return 0;
}
public void setState(int state) {
// TODO Auto-generated method stub
}
private static final int OP_CREATE = 1;
private static final int OP_REMOVE = 2;
private String getFileName(String id, int op){
Properties props = getIdToNameProperties();
String name = props.getProperty(id);
if(name == null){
if(op == OP_CREATE){
name = new Integer(CDataUtil.genRandomNumber()).toString();
props.setProperty(id, name);
fIsMapInfoDirty = true;
// saveMapFile();
}
} else if (op == OP_REMOVE){
props.remove(id);
fIsMapInfoDirty = true;
}
return name;
}
private File getFileForCfg(String id, boolean create){
String name = getFileName(id, create ? OP_CREATE : 0);
if(name == null)
return null;
IPath path = BuildStateManager.getInstance().getPrefsDirPath(fProject);
path = path.append(name);
return path.toFile();
}
private void saveMapFile(){
if(fCfgIdToFileNameProps == null)
return;
File file = getMapFile();
File parent = file.getParentFile();
if(!parent.exists())
parent.mkdirs();
try {
OutputStream oStream = new FileOutputStream(file);
fCfgIdToFileNameProps.store(oStream, ""); //$NON-NLS-1$
oStream.close();
} catch (FileNotFoundException e) {
ManagedBuilderCorePlugin.log(e);
} catch (IOException e) {
ManagedBuilderCorePlugin.log(e);
}
}
private File getMapFile(){
IPath path = BuildStateManager.getInstance().getPrefsDirPath(fProject);
path = path.append(getProjFileName());
File file = path.toFile();
return file;
}
private Properties getIdToNameProperties(){
if(fCfgIdToFileNameProps == null){
fCfgIdToFileNameProps = new Properties();
File file = getMapFile();
if(file.exists()){
try {
InputStream iStream = new FileInputStream(file);
fCfgIdToFileNameProps.load(iStream);
iStream.close();
} catch (FileNotFoundException e) {
ManagedBuilderCorePlugin.log(e);
} catch (IOException e) {
ManagedBuilderCorePlugin.log(e);
}
}
}
return fCfgIdToFileNameProps;
}
private String getProjFileName(){
return fProject.getName();
}
public IProject getProject() {
return fProject;
}
void serialize(){
Collection<ConfigurationBuildState> cbStates = fCfgIdToStateMap.values();
for (ConfigurationBuildState s : cbStates) {
String id = s.getConfigurationId();
if(!s.exists()){
File file = getFileForCfg(id, false);
if(file != null && file.exists()){
file.delete();
getFileName(id, OP_REMOVE);
}
} else {
File file = getFileForCfg(id, true);
File parent = file.getParentFile();
if(!parent.exists())
parent.mkdirs();
try {
FileOutputStream oStream = new FileOutputStream(file);
s.store(oStream);
oStream.close();
} catch (FileNotFoundException e) {
ManagedBuilderCorePlugin.log(e);
} catch (IOException e) {
ManagedBuilderCorePlugin.log(e);
}
}
}
if(fIsMapInfoDirty)
saveMapFile();
}
}