/*******************************************************************************
* 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.Map;
import org.eclipse.cdt.core.settings.model.extension.CDataObject;
public class ProxyProvider implements IProxyProvider {
private IProxyCache fCache;
private ICDataScope fScope;
private IProxyFactory fFactory;
private boolean fProxiesCached;
public ProxyProvider(ICDataScope scope, IProxyCache cache, IProxyFactory factory){
fScope = scope;
fCache = cache;
fFactory = factory;
}
public CDataProxy[] getProxies() {
if(!fProxiesCached || !fScope.isStatic()){
fillCache();
fProxiesCached = true;
}
return fCache.getCachedProxies();
}
/*
private void clearInvalidCachedProxies(){
CDataProxy proxies[] = fCache.getCachedProxies();
for(int i = 0; i < proxies.length; i++){
if(!proxies[i].isValid()){
fCache.removeCachedProxy(proxies[i]);
}
}
}
*/
public CDataProxy getProxy(String id) {
if(!fProxiesCached || !fScope.isStatic()){
fillCache();
fProxiesCached = true;
}
return fCache.getCachedProxy(id);
}
protected void fillCache(){
Map<String, CDataProxy> map = fCache.getCachedProxiesMap();
CDataObject datas[] =fScope.getChildren();
for (CDataObject data : datas) {
CDataProxy proxy = fCache.getCachedProxy(data.getId());
if(proxy == null || proxy.getType() != data.getType()){
proxy = fFactory.createProxy(data);
if(proxy != null){
fCache.addCachedProxy(proxy);
}
} else {
proxy.setData(data);
map.remove(data.getId());
}
}
if(!map.isEmpty()){
for (CDataProxy proxy : map.values()) {
fCache.removeCachedProxy(proxy);
}
}
}
public CDataProxy getProxy(CDataObject data) {
if(!fProxiesCached || !fScope.isStatic()){
fillCache();
fProxiesCached = true;
}
return fCache.getCachedProxy(data);
}
public void removeCachedProxy(String id) {
fCache.removeCachedProxy(id);
fProxiesCached = true;
}
public void removeCachedProxy(CDataProxy proxy) {
fCache.removeCachedProxy(proxy);
fProxiesCached = true;
}
public CDataProxy[] getCachedProxies() {
return fCache.getCachedProxies();
}
public CDataProxy[] getProxiesOfKind(int kind) {
CDataProxy[] proxies = getProxies();
if(proxies.length > 0){
CDataProxy[] tmp = new CDataProxy[proxies.length];
int num = 0;
for (CDataProxy proxy : proxies) {
if((proxy.getType() & kind) == proxy.getType())
tmp[num++] = proxy;
}
if(num != proxies.length){
proxies = new CDataProxy[num];
System.arraycopy(tmp, 0, proxies, 0, num);
}
}
return proxies;
}
public void cacheValues() {
if(!fProxiesCached || !fScope.isStatic()){
fillCache();
fProxiesCached = true;
}
}
public void invalidateCache() {
fProxiesCached = false;
CDataProxy[] proxies = fCache.getCachedProxies();
for (CDataProxy proxy : proxies) {
proxy.doClearData();
}
}
}