/*******************************************************************************
* Copyright (c) 2007, 2011 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 org.eclipse.cdt.core.ICExtensionReference;
import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescriptionListener;
import org.eclipse.cdt.internal.core.CConfigBasedDescriptor;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
public abstract class AbstractCExtensionProxy implements ICProjectDescriptionListener{
private IProject fProject;
private String fExtId;
private boolean fIsNewStyle;
private boolean fInited;
private String fExtPointId;
private Object fProvider;
public AbstractCExtensionProxy(IProject project, String extPointId) {
fProject = project;
fExtPointId = extPointId;
CProjectDescriptionManager.getInstance().addCProjectDescriptionListener(this, CProjectDescriptionEvent.LOADED | CProjectDescriptionEvent.APPLIED);
}
protected final void providerRequested(){
if(!fInited)
checkUpdateProvider(CProjectDescriptionManager.getInstance().getProjectDescription(fProject, false), false, false);
}
public void updateProject(IProject project){
IProject oldProj = fProject;
fProject = project;
if(oldProj == null || !oldProj.equals(fProject))
fInited = false;
}
private ICExtensionReference getRef(ICConfigurationDescription cfg, boolean update){
if(fExtPointId != null){
try {
CConfigBasedDescriptor dr = new CConfigBasedDescriptor(cfg, false);
ICExtensionReference[] cextensions = dr.get(fExtPointId, update);
if (cextensions.length > 0) {
return cextensions[0];
}
} catch (CoreException e) {
}
}
return null;
}
protected IProject getProject(){
return fProject;
}
private boolean checkUpdateProvider(ICProjectDescription des, boolean recreate, boolean rescan){
Object newProvider = null;
Object oldProvider = null;
synchronized(this){
if(recreate || rescan || !fInited){
ICExtensionReference ref = null;
boolean newStyle = true;
ICConfigurationDescription cfg = null;
if(des != null){
cfg = des.getDefaultSettingConfiguration();
if(cfg != null){
ref = getRef(cfg, false);
newStyle = CProjectDescriptionManager.getInstance().isNewStyleCfg(cfg);
}
}
if(ref != null){
if(recreate || !ref.getID().equals(fExtId)){
try {
newProvider = ref.createExtension();
if(!isValidProvider(newProvider))
newProvider = null;
} catch (CoreException e) {
}
}
}
if(newProvider == null){
if(recreate || fProvider == null || newStyle != fIsNewStyle){
newStyle = isNewStyleCfg(cfg);
newProvider = createDefaultProvider(cfg, newStyle);
}
}
if(newProvider != null){
if(fProvider != null){
deinitializeProvider(fProvider);
oldProvider = fProvider;
}
fProvider = newProvider;
if(ref != null)
fExtId = ref.getID();
fIsNewStyle = newStyle;
initializeProvider(fProvider);
}
fInited = true;
}
}
if(newProvider != null){
postProcessProviderChange(newProvider, oldProvider);
return true;
}
return false;
}
protected boolean isNewStyleCfg(ICConfigurationDescription des){
return CProjectDescriptionManager.getInstance().isNewStyleCfg(des);
}
protected abstract boolean isValidProvider(Object o);
protected abstract void initializeProvider(Object o);
protected abstract void deinitializeProvider(Object o);
protected abstract Object createDefaultProvider(ICConfigurationDescription cfgDes, boolean newStile);
protected void postProcessProviderChange(Object newProvider, Object oldProvider){
}
public void close(){
CProjectDescriptionManager.getInstance().removeCProjectDescriptionListener(this);
if(fProvider != null){
deinitializeProvider(fProvider);
}
}
@Override
public void handleEvent(CProjectDescriptionEvent event) {
if(!fProject.equals(event.getProject()))
return;
doHandleEvent(event);
}
protected boolean doHandleEvent(CProjectDescriptionEvent event){
boolean force = false;
switch(event.getEventType()){
case CProjectDescriptionEvent.LOADED:
force = true;
//$FALL-THROUGH$
case CProjectDescriptionEvent.APPLIED:
ICProjectDescription des = event.getNewCProjectDescription();
if(des != null){
updateProject(des.getProject());
return checkUpdateProvider(des, force, true);
}
break;
}
return false;
}
}