/*******************************************************************************
* Copyright (c) 2013 Luigi Sgro. 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:
* Luigi Sgro - initial API and implementation
******************************************************************************/
package com.quantcomponents.ui.algo;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.model.IWorkbenchAdapter;
import com.quantcomponents.algo.IStockDatabaseTradingManager;
import com.quantcomponents.algo.TradingAgentBindingHandle;
import com.quantcomponents.algo.TradingAgentConfigurationHandle;
import com.quantcomponents.algo.TradingAgentExecutionHandle;
import com.quantcomponents.algo.TradingAgentFactoryHandle;
import com.quantcomponents.ui.core.IMonitorableContainer;
public class TradingManagersViewAdapterFactory implements IAdapterFactory {
private final IMonitorableContainer<IStockDatabaseTradingManager> rootContainer;
private Map<TradingAgentFactoryHandle, TradingAgentFactoryWrapper> agentFactoryWrapperMap = new HashMap<TradingAgentFactoryHandle, TradingAgentFactoryWrapper>();
private Map<TradingAgentConfigurationHandle, TradingAgentConfigurationWrapper> agentWrapperMap = new HashMap<TradingAgentConfigurationHandle, TradingAgentConfigurationWrapper>();
private Map<TradingAgentBindingHandle, TradingAgentBindingWrapper> agentBindingWrapperMap = new HashMap<TradingAgentBindingHandle, TradingAgentBindingWrapper>();
private Map<TradingAgentExecutionHandle, TradingAgentExecutionWrapper> agentExecutionWrapperMap = new HashMap<TradingAgentExecutionHandle, TradingAgentExecutionWrapper>();
public TradingAgentFactoryWrapper getOrCreateFactoryWrapper(TradingAgentFactoryHandle factory, IStockDatabaseTradingManager manager) {
TradingAgentFactoryWrapper wrapper = agentFactoryWrapperMap.get(factory);
if (wrapper == null) {
wrapper = new TradingAgentFactoryWrapper(factory, manager);
agentFactoryWrapperMap.put(factory, wrapper);
}
return wrapper;
}
public TradingAgentConfigurationWrapper getOrCreateAgentWrapper(TradingAgentConfigurationHandle agent, IStockDatabaseTradingManager manager) {
TradingAgentConfigurationWrapper wrapper = agentWrapperMap.get(agent);
if (wrapper == null) {
wrapper = new TradingAgentConfigurationWrapper(agent, manager);
agentWrapperMap.put(agent, wrapper);
}
return wrapper;
}
public TradingAgentBindingWrapper getOrCreateAgentBindingWrapper(TradingAgentBindingHandle binding, IStockDatabaseTradingManager manager) {
TradingAgentBindingWrapper wrapper = agentBindingWrapperMap.get(binding);
if (wrapper == null) {
wrapper = new TradingAgentBindingWrapper(binding, manager);
agentBindingWrapperMap.put(binding, wrapper);
}
return wrapper;
}
public TradingAgentExecutionWrapper getOrCreateAgentExecutionWrapper(TradingAgentExecutionHandle execution, IStockDatabaseTradingManager manager) {
TradingAgentExecutionWrapper wrapper = agentExecutionWrapperMap.get(execution);
if (wrapper == null) {
wrapper = new TradingAgentExecutionWrapper(execution, manager);
agentExecutionWrapperMap.put(execution, wrapper);
}
return wrapper;
}
public void resetCache() {
agentFactoryWrapperMap.clear();
agentWrapperMap.clear();
agentBindingWrapperMap.clear();
agentExecutionWrapperMap.clear();
}
private IWorkbenchAdapter managerContainerAdapter = new IWorkbenchAdapter() {
@Override
public Object[] getChildren(Object o) {
return ((IStockDatabaseTradingManagerContainer) o).getElements().toArray();
}
@Override
public ImageDescriptor getImageDescriptor(Object object) {
return null;
}
@Override
public String getLabel(Object o) {
return null;
}
@Override
public Object getParent(Object o) {
return null;
}
};
private IWorkbenchAdapter managerAdapterAdapter = new IWorkbenchAdapter() {
@Override
public Object[] getChildren(Object o) {
IStockDatabaseTradingManager manager = (IStockDatabaseTradingManager) o;
Collection<TradingAgentFactoryHandle> factories = manager.getAllTradingAgentFactories();
Object[] children = new Object[factories.size()];
Map<TradingAgentFactoryHandle, TradingAgentFactoryWrapper> updatedWrapperMap = new HashMap<TradingAgentFactoryHandle, TradingAgentFactoryWrapper>();
int i = 0;
for (TradingAgentFactoryHandle factory : factories) {
TradingAgentFactoryWrapper wrapper = getOrCreateFactoryWrapper(factory, manager);
updatedWrapperMap.put(factory, wrapper);
children[i++] = wrapper;
}
agentFactoryWrapperMap = updatedWrapperMap;
return children;
}
@Override
public ImageDescriptor getImageDescriptor(Object object) {
return TradingAgentPlugin.getDefault().getImageRegistry().getDescriptor(TradingAgentPlugin.TRADING_AGENT_MANAGER_IMAGE_KEY);
}
@Override
public String getLabel(Object o) {
return ((IStockDatabaseTradingManager) o).getPrettyName();
}
@Override
public Object getParent(Object o) {
return rootContainer;
}
};
private IWorkbenchAdapter tradingAgentFactoryAdapter = new IWorkbenchAdapter() {
@Override
public Object[] getChildren(Object o) {
TradingAgentFactoryWrapper wrapper = (TradingAgentFactoryWrapper) o;
IStockDatabaseTradingManager manager = wrapper.getManager();
Collection<TradingAgentConfigurationHandle> agents = manager.getChildren(wrapper.getHandle());
Object[] children = new Object[agents.size()];
Map<TradingAgentConfigurationHandle, TradingAgentConfigurationWrapper> updatedWrapperMap = new HashMap<TradingAgentConfigurationHandle, TradingAgentConfigurationWrapper>();
int i = 0;
for (TradingAgentConfigurationHandle agent : agents) {
TradingAgentConfigurationWrapper childWrapper = getOrCreateAgentWrapper(agent, manager);
updatedWrapperMap.put(agent, childWrapper);
children[i++] = childWrapper;
}
agentWrapperMap = updatedWrapperMap;
return children;
}
@Override
public ImageDescriptor getImageDescriptor(Object object) {
return TradingAgentPlugin.getDefault().getImageRegistry().getDescriptor(TradingAgentPlugin.TRADING_AGENT_FACTORY_IMAGE_KEY);
}
@Override
public String getLabel(Object o) {
TradingAgentFactoryWrapper wrapper = (TradingAgentFactoryWrapper) o;
return wrapper.getHandle().getPrettyName();
}
@Override
public Object getParent(Object o) {
TradingAgentFactoryWrapper wrapper = (TradingAgentFactoryWrapper) o;
return wrapper.getManager();
}
};
private IWorkbenchAdapter tradingAgentConfigurationAdapter = new IWorkbenchAdapter() {
@Override
public Object[] getChildren(Object o) {
TradingAgentConfigurationWrapper wrapper = (TradingAgentConfigurationWrapper) o;
IStockDatabaseTradingManager manager = wrapper.getManager();
Collection<TradingAgentBindingHandle> bindings = manager.getChildren(wrapper.getHandle());
Object[] children = new Object[bindings.size()];
Map<TradingAgentBindingHandle, TradingAgentBindingWrapper> updatedWrapperMap = new HashMap<TradingAgentBindingHandle, TradingAgentBindingWrapper>();
int i = 0;
for (TradingAgentBindingHandle binding : bindings) {
TradingAgentBindingWrapper childWrapper = getOrCreateAgentBindingWrapper(binding, manager);
updatedWrapperMap.put(binding, childWrapper);
children[i++] = childWrapper;
}
agentBindingWrapperMap = updatedWrapperMap;
return children;
}
@Override
public ImageDescriptor getImageDescriptor(Object object) {
return TradingAgentPlugin.getDefault().getImageRegistry().getDescriptor(TradingAgentPlugin.TRADING_AGENT_IMAGE_KEY);
}
@Override
public String getLabel(Object o) {
TradingAgentConfigurationWrapper wrapper = (TradingAgentConfigurationWrapper) o;
return wrapper.getHandle().getPrettyName();
}
@Override
public Object getParent(Object o) {
TradingAgentConfigurationWrapper wrapper = (TradingAgentConfigurationWrapper) o;
TradingAgentFactoryHandle parent = wrapper.getManager().getParent(wrapper.getHandle());
return parent == null ? null : new TradingAgentFactoryWrapper(parent, wrapper.getManager());
}
};
private IWorkbenchAdapter tradingAgentBindingAdapter = new IWorkbenchAdapter() {
@Override
public Object[] getChildren(Object o) {
TradingAgentBindingWrapper wrapper = (TradingAgentBindingWrapper) o;
IStockDatabaseTradingManager manager = wrapper.getManager();
Collection<TradingAgentExecutionHandle> executions = manager.getChildren(wrapper.getHandle());
Object[] children = new Object[executions.size()];
Map<TradingAgentExecutionHandle, TradingAgentExecutionWrapper> updatedWrapperMap = new HashMap<TradingAgentExecutionHandle, TradingAgentExecutionWrapper>();
int i = 0;
for (TradingAgentExecutionHandle execution : executions) {
TradingAgentExecutionWrapper childWrapper = getOrCreateAgentExecutionWrapper(execution, manager);
updatedWrapperMap.put(execution, childWrapper);
children[i++] = childWrapper;
}
agentExecutionWrapperMap = updatedWrapperMap;
return children;
}
@Override
public ImageDescriptor getImageDescriptor(Object object) {
return TradingAgentPlugin.getDefault().getImageRegistry().getDescriptor(TradingAgentPlugin.TRADING_AGENT_BINDING_IMAGE_KEY);
}
@Override
public String getLabel(Object o) {
TradingAgentBindingWrapper wrapper = (TradingAgentBindingWrapper) o;
return wrapper.getHandle().getPrettyName();
}
@Override
public Object getParent(Object o) {
TradingAgentBindingWrapper wrapper = (TradingAgentBindingWrapper) o;
TradingAgentConfigurationHandle parent = wrapper.getManager().getParent(wrapper.getHandle());
return parent == null ? null : new TradingAgentConfigurationWrapper(parent, wrapper.getManager());
}
};
private IWorkbenchAdapter tradingAgentExecutionAdapter = new IWorkbenchAdapter() {
@Override
public Object[] getChildren(Object o) {
return new Object[0];
}
@Override
public ImageDescriptor getImageDescriptor(Object object) {
return TradingAgentPlugin.getDefault().getImageRegistry().getDescriptor(TradingAgentPlugin.TRADING_AGENT_EXECUTION_IMAGE_KEY);
}
@Override
public String getLabel(Object o) {
TradingAgentExecutionWrapper wrapper = (TradingAgentExecutionWrapper) o;
return wrapper.getHandle().getPrettyName();
}
@Override
public Object getParent(Object o) {
TradingAgentExecutionWrapper wrapper = (TradingAgentExecutionWrapper) o;
TradingAgentBindingHandle parent = wrapper.getManager().getParent(wrapper.getHandle());
return parent == null ? null : new TradingAgentBindingWrapper(parent, wrapper.getManager());
}
};
public TradingManagersViewAdapterFactory(IMonitorableContainer<IStockDatabaseTradingManager> container) {
this.rootContainer = container;
}
@Override
public Object getAdapter(Object adaptableObject, @SuppressWarnings("rawtypes") Class adapterType) {
if (adapterType == IWorkbenchAdapter.class) {
if (adaptableObject instanceof IStockDatabaseTradingManagerContainer) {
return managerContainerAdapter;
} else if (adaptableObject instanceof IStockDatabaseTradingManager) {
return managerAdapterAdapter;
} else if (adaptableObject instanceof TradingAgentFactoryWrapper) {
return tradingAgentFactoryAdapter;
} else if (adaptableObject instanceof TradingAgentConfigurationWrapper) {
return tradingAgentConfigurationAdapter;
} else if (adaptableObject instanceof TradingAgentBindingWrapper) {
return tradingAgentBindingAdapter;
} else if (adaptableObject instanceof TradingAgentExecutionWrapper) {
return tradingAgentExecutionAdapter;
}
}
return null;
}
@Override
public Class<?>[] getAdapterList() {
return new Class[] { IWorkbenchAdapter.class };
}
}