/*******************************************************************************
* Copyright (c) 2007, 2010 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.core.settings.model.extension.impl;
import java.util.Arrays;
import java.util.HashMap;
import org.eclipse.cdt.core.cdtvariables.ICdtVariablesContributor;
import org.eclipse.cdt.core.settings.model.CConfigurationStatus;
import org.eclipse.cdt.core.settings.model.ICSettingBase;
import org.eclipse.cdt.core.settings.model.ICSourceEntry;
import org.eclipse.cdt.core.settings.model.extension.CBuildData;
import org.eclipse.cdt.core.settings.model.extension.CConfigurationData;
import org.eclipse.cdt.core.settings.model.extension.CFileData;
import org.eclipse.cdt.core.settings.model.extension.CFolderData;
import org.eclipse.cdt.core.settings.model.extension.CLanguageData;
import org.eclipse.cdt.core.settings.model.extension.CResourceData;
import org.eclipse.cdt.core.settings.model.extension.CTargetPlatformData;
import org.eclipse.cdt.core.settings.model.util.CDataUtil;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
public class CDefaultConfigurationData extends CConfigurationData {
protected String fDescription;
private HashMap<IPath, CResourceData> fResourceDataMap = new HashMap<IPath, CResourceData>();
protected CFolderData fRootFolderData;
protected String fName;
protected String fId;
protected CTargetPlatformData fTargetPlatformData;
protected CBuildData fBuildData;
protected ICSourceEntry[] fSourceEntries;
private CDataFactory fFactory;
protected boolean fIsModified;
private CConfigurationStatus fStatus = CConfigurationStatus.CFG_STATUS_OK;
protected CDefaultConfigurationData(CDataFactory factory){
if(factory == null)
factory = new CDataFactory();
fFactory = factory;
}
// public CDefaultConfigurationData(String id, String name) {
// this(id, name, (CDataFacroty)null);
// }
public CDataFactory getFactory(){
return fFactory;
}
public CDefaultConfigurationData(String id, String name, CDataFactory factory) {
fId = id;
fName = name;
if(factory == null)
factory = new CDataFactory();
fFactory = factory;
}
// public CDefaultConfigurationData(String id, String name, CConfigurationData base) {
// this(id, name, base, null);
// }
public CDefaultConfigurationData(String id, String name, CConfigurationData base, CDataFactory facroty, boolean clone) {
this(id, name, facroty);
copySettingsFrom(base, clone);
}
protected IPath standardizePath(IPath path){
return path.makeRelative().setDevice(null);
}
protected void addRcData(CResourceData data){
IPath path = standardizePath(data.getPath());
if(path.segmentCount() == 0){
if(data.getType() == ICSettingBase.SETTING_FOLDER)
fRootFolderData = (CFolderData)data;
else
return;
}
fResourceDataMap.put(path, data);
}
protected void removeRcData(IPath path){
path = standardizePath(path);
fResourceDataMap.remove(path);
if(path.segmentCount() == 0)
fRootFolderData = null;
}
protected void copySettingsFrom(CConfigurationData base, boolean clone){
if(base == null)
return;
fDescription = base.getDescription();
fTargetPlatformData = copyTargetPlatformData(base.getTargetPlatformData(), clone);
fSourceEntries = base.getSourceEntries();
fBuildData = copyBuildData(base.getBuildData(), clone);
fStatus = base.getStatus();
if(fStatus == null)
fStatus = CConfigurationStatus.CFG_STATUS_OK;
CFolderData baseRootFolderData = base.getRootFolderData();
fRootFolderData = copyFolderData(baseRootFolderData.getPath(), baseRootFolderData, clone);
addRcData(fRootFolderData);
CResourceData[] rcDatas = filterRcDatasToCopy(base);
for(int i = 0; i < rcDatas.length; i++){
CResourceData rcData = rcDatas[i];
if(baseRootFolderData == rcData)
continue;
if(rcData instanceof CFolderData)
addRcData(copyFolderData(rcData.getPath(), (CFolderData)rcData, clone));
else if(rcData instanceof CFileData)
addRcData(copyFileData(rcData.getPath(), (CFileData)rcData, clone));
}
}
protected CResourceData[] filterRcDatasToCopy(CConfigurationData base){
return base.getResourceDatas();
}
protected CFolderData copyFolderData(IPath path, CFolderData base, boolean clone){
return fFactory.createFolderData(this, base, null, clone, path);
}
protected CFileData copyFileData(IPath path, CFileData base, boolean clone){
return fFactory.createFileData(this, base, null, null, clone, path);
}
protected CFileData copyFileData(IPath path, CFolderData base, CLanguageData langData){
return fFactory.createFileData(this, base, langData, null, false, path);
}
protected CTargetPlatformData copyTargetPlatformData(CTargetPlatformData base, boolean clone){
return fFactory.createTargetPlatformData(this, base, null, base != null ? base.getName() : null, clone);
}
protected CBuildData copyBuildData(CBuildData data, boolean clone){
return fFactory.createBuildData(this, data, null, data != null ? data.getName() : null, clone);
}
@Override
public CFolderData createFolderData(IPath path, CFolderData base) throws CoreException{
CFolderData data = copyFolderData(path, base, false);
addRcData(data);
setModified(true);
return data;
}
@Override
public CFileData createFileData(IPath path, CFileData base) throws CoreException{
CFileData data = copyFileData(path, base, false);
addRcData(data);
setModified(true);
return data;
}
@Override
public CFileData createFileData(IPath path, CFolderData base, CLanguageData langData) throws CoreException{
CFileData data = copyFileData(path, base, langData);
addRcData(data);
setModified(true);
return data;
}
@Override
public String getDescription() {
return fDescription;
}
@Override
public void setDescription(String description) {
if(CDataUtil.objectsEqual(description, fDescription))
return;
fDescription = description;
setModified(true);
}
@Override
public CResourceData[] getResourceDatas() {
return fResourceDataMap.values().toArray(new CResourceData[fResourceDataMap.size()]);
}
@Override
public CFolderData getRootFolderData() {
return fRootFolderData;
}
public CFolderData createRootFolderData() throws CoreException{
if(fRootFolderData == null){
createFolderData(new Path(""), null); //$NON-NLS-1$
}
return fRootFolderData;
}
@Override
public void removeResourceData(CResourceData data) throws CoreException {
if(data == getResourceData(data.getPath())){
IPath path = standardizePath(data.getPath());
removeRcData(path);
setModified(true);
}
}
public CResourceData getResourceData(IPath path){
path = standardizePath(path);
return fResourceDataMap.get(path);
}
@Override
public String getName() {
return fName;
}
@Override
public void setName(String name) {
if(CDataUtil.objectsEqual(name, fName))
return;
fName = name;
setModified(true);
}
@Override
public String getId() {
return fId;
}
@Override
public boolean isValid() {
return getId() != null;
}
@Override
public CTargetPlatformData getTargetPlatformData() {
return fTargetPlatformData;
}
@Override
public ICSourceEntry[] getSourceEntries() {
return fSourceEntries != null ? (ICSourceEntry[])fSourceEntries.clone() : null;
}
@Override
public void setSourceEntries(ICSourceEntry[] entries) {
if(Arrays.equals(entries, fSourceEntries))
return;
fSourceEntries = entries != null ? (ICSourceEntry[])entries.clone() : null;
setModified(true);
}
@Override
public CBuildData getBuildData() {
return fBuildData;
}
public void initEmptyData() throws CoreException{
if(getRootFolderData() == null)
createRootFolderData();
if(getTargetPlatformData() == null)
createTargetPlatformData();
if(getBuildData() == null)
createBuildData();
}
public CTargetPlatformData createTargetPlatformData(){
fTargetPlatformData = copyTargetPlatformData(null, false);
setModified(true);
return fTargetPlatformData;
}
public CBuildData createBuildData(){
fBuildData = copyBuildData(null, false);
setModified(true);
return fBuildData;
}
@Override
public ICdtVariablesContributor getBuildVariablesContributor() {
// TODO Auto-generated method stub
return null;
}
public boolean isModified(){
if(fIsModified)
return true;
CResourceData[] rcDatas = getResourceDatas();
for(int i = 0; i < rcDatas.length; i++){
if(fFactory.isModified(rcDatas[i]))
return true;
}
return false;
}
public void setModified(boolean modified){
fIsModified = modified;
if(!modified){
CResourceData[] rcDatas = getResourceDatas();
for(int i = 0; i < rcDatas.length; i++){
fFactory.setModified(rcDatas[i], false);
}
}
}
@Override
public CConfigurationStatus getStatus() {
return fStatus;
}
}