/*******************************************************************************
* 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.internal.core.settings.model;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.settings.model.extension.ICProjectConverter;
import org.eclipse.cdt.core.settings.model.util.CDataUtil;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
public class CProjectConverterDesciptor {
final static String PROJECT_CONVERTER_EXTPOINT_ID = CCorePlugin.PLUGIN_ID + "." + "projectConverter"; //$NON-NLS-1$ //$NON-NLS-2$
final static String CONVERTER = "converter"; //$NON-NLS-1$
final static String CLASS = "class"; //$NON-NLS-1$
final static String NATURES = "natures"; //$NON-NLS-1$
final static String OWNERS = "owners"; //$NON-NLS-1$
final static String DELIMITER = ";"; //$NON-NLS-1$
private String fId;
private ICProjectConverter fConverter;
private IExtension fExtension;
private IConfigurationElement fConverterElement;
CProjectConverterDesciptor(IExtension extension){
fId = extension.getUniqueIdentifier();
fExtension = extension;
}
public ICProjectConverter getConverter() throws CoreException{
if(fConverter == null) {
fConverter = createConverter();
}
return fConverter;
}
private static IConfigurationElement getConverterElement(IExtension ext){
IConfigurationElement elements[] = ext.getConfigurationElements();
for(int i = 0; i < elements.length; i++){
IConfigurationElement element = elements[i];
if(CONVERTER.equals(element.getName())){
return element;
}
}
return null;
}
private IConfigurationElement getConverterElement(){
if(fConverterElement == null){
fConverterElement = getConverterElement(fExtension);
}
return fConverterElement;
}
private ICProjectConverter createConverter() throws CoreException{
IConfigurationElement element = getConverterElement();
if(element != null){
Object obj = element.createExecutableExtension(CLASS);
if(obj instanceof ICProjectConverter){
return (ICProjectConverter)obj;
} else
throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("CProjectConverterDesciptor.0")); //$NON-NLS-1$
}
throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("CProjectConverterDesciptor.1")); //$NON-NLS-1$
}
public String getId(){
return fId;
}
public boolean canConvertProject(IProject project, String oldOwnerId, ICProjectDescription des){
if(getConverterElement() == null)
return false;
String ids[] = getSupportedOwnerIds();
if(ids != null ){
if(!idsContain(ids, oldOwnerId))
return false;
}
try {
String supportedIds[] = getSupportedNatureIds();
if(supportedIds != null){
IProjectDescription eDes = project.getDescription();
String natures[] = eDes.getNatureIds();
Set<String> natureSet = new HashSet<String>(Arrays.asList(natures));
natureSet.removeAll(Arrays.asList(supportedIds));
if(natureSet.size() == natures.length)
return false;
}
} catch (CoreException e1) {
CCorePlugin.log(e1);
}
try {
ICProjectConverter converter = getConverter();
return converter.canConvertProject(project, oldOwnerId, des);
} catch (CoreException e) {
}
return false;
}
public String[] getSupportedOwnerIds(){
return getIds(OWNERS);
}
public String[] getSupportedNatureIds(){
return getIds(NATURES);
}
private String[] getIds(String attribute){
IConfigurationElement element = getConverterElement();
if(element == null)
return null;
String value = element.getAttribute(attribute);
return CDataUtil.stringToArray(value, DELIMITER);
}
private boolean idsContain(String[] ids, String id){
if(ids == null || ids.length == 0)
return id == null;
for(int i = 0; i < ids.length; i++){
if(ids[i].equals(id))
return true;
}
return false;
}
}