/*******************************************************************************
* 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.core.osgi;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.quantcomponents.core.model.ISeries;
import com.quantcomponents.core.model.ISeriesListener;
import com.quantcomponents.core.model.ISeriesPoint;
import com.quantcomponents.core.remote.IUIDGenerator;
import com.quantcomponents.core.remote.ServiceHandle;
public class SeriesHost<A extends Comparable<A>, O extends Comparable<O>, P extends ISeriesPoint<A, O>> implements ISeriesHost<A, O, P>, ISeriesHostLocal<A, O, P> {
protected class SeriesInfo {
public ISeries<A, O, ? extends P> series;
public ISeriesListener<A, O> listener;
}
private static final Logger logger = Logger.getLogger(SeriesHost.class.getName());
private final Map<ServiceHandle<ISeriesHost<A, O, P>>, SeriesInfo> allSeries = new ConcurrentHashMap<ServiceHandle<ISeriesHost<A, O, P>>, SeriesInfo>();
private volatile IUIDGenerator uidGenerator;
private volatile ISeriesIteratorHostLocal<A, O, P> seriesIteratorHost;
private volatile ISeriesListenerHost<A, O, P> seriesListenerHost; // optional service
public SeriesHost() {}
public void deactivate() {
allSeries.clear();
}
public void setUidGenerator(IUIDGenerator uidGenerator) {
this.uidGenerator = uidGenerator;
}
public void setSeriesIteratorHost(ISeriesIteratorHostLocal<A, O, P> seriesIteratorHost) {
this.seriesIteratorHost = seriesIteratorHost;
}
public void setSeriesListenerHost(ISeriesListenerHost<A, O, P> seriesListenerHost) {
this.seriesListenerHost = seriesListenerHost;
}
public void resetSeriesListenerHost(ISeriesListenerHost<A, O, P> seriesListenerHost) {
if (this.seriesListenerHost == seriesListenerHost) {
this.seriesListenerHost = null;
} else {
logger.log(Level.WARNING, " WEIRD: ------>>>>> SeriesHost: " + this + "; resetting seriesListenerHost: " + seriesListenerHost + " different from: " + this.seriesListenerHost);
}
}
@Override
public int size(ServiceHandle<? extends ISeriesHost<A, O, P>> seriesHostHandle) {
return retrieveSeriesInfo(seriesHostHandle).series.size();
}
@Override
public boolean isEmpty(ServiceHandle<? extends ISeriesHost<A, O, P>> seriesHostHandle) {
return retrieveSeriesInfo(seriesHostHandle).series.isEmpty();
}
@SuppressWarnings("unchecked")
@Override
public ServiceHandle<? extends ISeriesIteratorHost<A, O, P>> iterator(ServiceHandle<? extends ISeriesHost<A, O, P>> seriesHostHandle) {
Iterator<? extends P> iterator = retrieveSeriesInfo(seriesHostHandle).series.iterator();
ServiceHandle<ISeriesIteratorHost<A, O, P>> iteratorHostHandle = seriesIteratorHost.addIterator((Iterator<P>) iterator);
return iteratorHostHandle;
}
@SuppressWarnings("unchecked")
@Override
public ServiceHandle<ISeriesIteratorHost<A, O, P>> descendingIterator(ServiceHandle<? extends ISeriesHost<A, O, P>> seriesHostHandle) {
Iterator<P> iterator = (Iterator<P>) retrieveSeriesInfo(seriesHostHandle).series.descendingIterator();
ServiceHandle<ISeriesIteratorHost<A, O, P>> iteratorHostHandle = seriesIteratorHost.addIterator(iterator);
return iteratorHostHandle;
}
@Override
public P getFirst(ServiceHandle<? extends ISeriesHost<A, O, P>> seriesHostHandle) {
return retrieveSeriesInfo(seriesHostHandle).series.getFirst();
}
@Override
public P getLast(ServiceHandle<? extends ISeriesHost<A, O, P>> seriesHostHandle) {
return retrieveSeriesInfo(seriesHostHandle).series.getLast();
}
@Override
public P getMinimum(ServiceHandle<? extends ISeriesHost<A, O, P>> seriesHostHandle) {
return retrieveSeriesInfo(seriesHostHandle).series.getMinimum();
}
@Override
public P getMaximum(ServiceHandle<? extends ISeriesHost<A, O, P>> seriesHostHandle) {
return retrieveSeriesInfo(seriesHostHandle).series.getMaximum();
}
@Override
public long getTimestamp(ServiceHandle<? extends ISeriesHost<A, O, P>> seriesHostHandle) {
return retrieveSeriesInfo(seriesHostHandle).series.getTimestamp();
}
@Override
public void close(ServiceHandle<? extends ISeriesHost<A, O, P>> seriesHostHandle) {
allSeries.remove(seriesHostHandle);
}
@Override
public ServiceHandle<ISeriesHost<A, O, P>> addSeries(ISeries<A, O, ? extends P> series) {
final ServiceHandle<ISeriesHost<A, O, P>> seriesHandle = new ServiceHandle<ISeriesHost<A, O, P>>(uidGenerator.nextUID());
SeriesInfo seriesInfo = new SeriesInfo();
seriesInfo.series = series;
seriesInfo.listener = new ISeriesListener<A, O>() {
@Override
public void onItemUpdated(ISeriesPoint<A, O> existingItem, ISeriesPoint<A, O> updatedItem) {
if (seriesListenerHost != null) {
seriesListenerHost.onItemUpdated(seriesHandle, existingItem, updatedItem);
}
}
@Override
public void onItemAdded(ISeriesPoint<A, O> newItem) {
if (seriesListenerHost != null) {
seriesListenerHost.onItemAdded(seriesHandle, newItem);
}
}};
allSeries.put(seriesHandle, seriesInfo);
seriesInfo.series.addSeriesListener(seriesInfo.listener);
return seriesHandle;
}
@Override
public void removeSeries(ServiceHandle<? extends ISeriesHost<A, O, ? extends P>> seriesHostHandle) {
SeriesInfo seriesInfo = retrieveSeriesInfo(seriesHostHandle);
seriesInfo.series.removeSeriesListener(seriesInfo.listener);
allSeries.remove(seriesHostHandle);
}
protected SeriesInfo retrieveSeriesInfo(ServiceHandle<? extends ISeriesHost<A, O, ? extends P>> seriesHostHandle) {
SeriesInfo seriesInfo = allSeries.get(seriesHostHandle);
if (seriesInfo == null) {
throw new IllegalArgumentException("LinkedListSeries for handle: " + seriesHostHandle + " not found");
}
return seriesInfo;
}
@Override
public boolean isEnforceStrictSequence(ServiceHandle<? extends ISeriesHost<A, O, P>> seriesHostHandle) {
return retrieveSeriesInfo(seriesHostHandle).series.isEnforceStrictSequence();
}
@Override
public String getPersistentID(ServiceHandle<? extends ISeriesHost<A, O, P>> seriesHostHandle) {
return retrieveSeriesInfo(seriesHostHandle).series.getPersistentID();
}
}