/*******************************************************************************
* Copyright (c) 2007, 2010 Symbian Software Limited 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:
* Bala Torati (Symbian) - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.managedbuilder.templateengine;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.cdt.core.CCProjectNature;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.CProjectNature;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.settings.model.extension.CConfigurationData;
import org.eclipse.cdt.core.templateengine.TemplateEngineMessages;
import org.eclipse.cdt.managedbuilder.buildproperties.IBuildProperty;
import org.eclipse.cdt.managedbuilder.core.BuildException;
import org.eclipse.cdt.managedbuilder.core.IBuilder;
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo;
import org.eclipse.cdt.managedbuilder.core.IManagedProject;
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import org.eclipse.cdt.managedbuilder.internal.core.Configuration;
import org.eclipse.cdt.managedbuilder.internal.core.ManagedBuildInfo;
import org.eclipse.cdt.managedbuilder.internal.core.ManagedProject;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Preferences;
/**
* This class is a helper for creating general CDT projects
*
* @noextend This class is not intended to be subclassed by clients.
* @noinstantiate This class is not intended to be instantiated by clients.
*
* Note that this class is used by ISVs, see bug 318063.
*/
public class ProjectCreatedActions {
IProject project;
IPath projectLocation;
IConfiguration[] configs;
String artifactExtension;
private static final String PROPERTY = "org.eclipse.cdt.build.core.buildType"; //$NON-NLS-1$
private static final String PROP_VAL = PROPERTY + ".debug"; //$NON-NLS-1$
/*
* create a project and do things common to project creationr from the new project
* wizard.
*/
public ProjectCreatedActions() {}
Map<IConfiguration, IConfiguration> original2newConfigs;
/**
* Utility method that
* <ul>
* <li>Creates a CDT MBS project from an IProject
* <li>Autoexpands the project in the C/C++ Projects view
* </ul>
* <p>
*
* @return an IManagedBuildInfo instance (from which the IManagedProject can be retrieved)
*/
public IManagedBuildInfo createProject(IProgressMonitor monitor, String indexerId, boolean isCProject) throws CoreException, BuildException {
if(!areFieldsValid()) {
throw new IllegalArgumentException(TemplateEngineMessages.getString("ProjectCreatedActions.InsufficientInformation")); //$NON-NLS-1$
}
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IProjectDescription description = workspace.newProjectDescription(project.getName());
if ((projectLocation != null) && (!projectLocation.equals(Platform.getLocation()))) {
description.setLocation(projectLocation);
}
Preferences corePrefs = CCorePlugin.getDefault().getPluginPreferences();
corePrefs.setValue(CCorePlugin.PREF_INDEXER, indexerId);
CCorePlugin.getDefault().createCDTProject(description, project, monitor);
// Open the project if we have to
if (!project.isOpen()) {
project.open(monitor);
}
if (isCProject) {
CProjectNature.addCNature(project, monitor);
} else {
CProjectNature.addCNature(project, monitor);
CCProjectNature.addCCNature(project, monitor);
}
CoreModel coreModel = CoreModel.getDefault();
ICProjectDescription des = coreModel.createProjectDescription(project, false);
ManagedBuildInfo info = ManagedBuildManager.createBuildInfo(project);
ManagedProject newManagedProject = new ManagedProject(project, configs[0].getProjectType());
info.setManagedProject(newManagedProject);
original2newConfigs = new HashMap<IConfiguration,IConfiguration>();
ICConfigurationDescription active = null;
for (IConfiguration cfg : configs) {
if (cfg != null) {
String id = ManagedBuildManager.calculateChildId(cfg.getId(), null);
Configuration configuration = new Configuration(newManagedProject, (Configuration)cfg, id, false, true);
CConfigurationData data = configuration.getConfigurationData();
ICConfigurationDescription cfgDes = des.createConfiguration(ManagedBuildManager.CFG_DATA_PROVIDER_ID, data);
configuration.setConfigurationDescription(cfgDes);
configuration.exportArtifactInfo();
configuration.setArtifactExtension(artifactExtension);
original2newConfigs.put(cfg, configuration);
IBuilder builder = configuration.getEditableBuilder();
if (builder != null) {
builder.setManagedBuildOn(builder.isManagedBuildOn());
}
configuration.setName(cfg.getName());
configuration.setArtifactName(newManagedProject.getDefaultArtifactName());
IBuildProperty buildProperty = configuration.getBuildProperties().getProperty(PROPERTY);
if (buildProperty != null && buildProperty.getValue() != null && PROP_VAL.equals(buildProperty.getValue().getId())) {
active = cfgDes;
} else if (active == null) {// select at least first configuration
active = cfgDes;
}
}
}
if (active != null) {
active.setActive();
}
coreModel.setProjectDescription(project, des);
info.setValid(true);
ManagedBuildManager.saveBuildInfo(project, true);
IStatus status = ManagedBuildManager.initBuildInfoContainer(project);
if (status.getCode() != IStatus.OK) {
ResourcesPlugin.getPlugin().getLog().log(status);
}
// Force the binary parser list to be updated for the project.
// An attempt is made to do this earlier when the project is being
// created, but the build info may not be ready then.
CCorePlugin.getDefault().getCProjectDescription(project, false).get(CCorePlugin.BINARY_PARSER_UNIQ_ID, true);
return info;
}
protected boolean areFieldsValid() {
return project!=null && configs!=null && artifactExtension!=null;
}
public IConfiguration getNewConfiguration(IConfiguration original) {
return original2newConfigs.get(original);
}
public Set<IConfiguration> getNewConfigurations(Collection<IConfiguration> originalConfigs) {
Set<IConfiguration> result = new HashSet<IConfiguration>();
for (IConfiguration cfg : originalConfigs) {
result.add(getNewConfiguration(cfg));
}
return result;
}
/**
* Chooses the IConfiguration which should be considered the project default.
* @param configs an array containing each of the newly created IConfigurations
* @return an element of the input array
*/
protected IConfiguration chooseDefaultConfiguration(IConfiguration[] configs) {
return configs[0];
}
/**
* @param artifactExtension the artifactExtension to set
*/
public void setArtifactExtension(String artifactExtension) {
this.artifactExtension = artifactExtension;
}
/**
* @return the configs
*/
public IConfiguration[] getConfigs() {
return configs;
}
/**
* @param configs the configs to set
*/
public void setConfigs(IConfiguration[] configs) {
this.configs = configs;
}
/**
* @return the project
*/
public IProject getProject() {
return project;
}
/**
* @param project the project to set
*/
public void setProject(IProject project) {
this.project = project;
}
/**
* @return the projectLocation
*/
public IPath getProjectLocation() {
return projectLocation;
}
/**
* @param projectLocation the projectLocation to set
*/
public void setProjectLocation(IPath projectLocation) {
this.projectLocation = projectLocation;
}
protected IConfiguration createNewConfiguration(IManagedProject managedProject, IConfiguration config) {
return managedProject.createConfiguration(config, config.getId() + "." + ManagedBuildManager.getRandomNumber()); //$NON-NLS-1$
}
}