blob: 7333e5bd645a1810228b02db7eb6a95f24126df1 [file] [log] [blame]
// StandardRelativeHistoryValueProviderAdapterFactory.java
package org.eclipse.stem.diseasemodels.standard.provider;
/*******************************************************************************
* Copyright (c) 2007 IBM 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
import java.util.List;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.provider.ChangeNotifier;
import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.IChangeNotifier;
import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
import org.eclipse.emf.edit.provider.INotifyChangedListener;
import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
import org.eclipse.stem.adapters.history.HistoryProvider;
import org.eclipse.stem.adapters.history.HistoryProviderAdapter;
import org.eclipse.stem.adapters.history.HistoryProviderAdapterFactory;
import org.eclipse.stem.core.common.Identifiable;
import org.eclipse.stem.core.model.STEMTime;
import org.eclipse.stem.definitions.adapters.relativevalue.RelativeValueProvider;
import org.eclipse.stem.definitions.adapters.relativevalue.RelativeValueProviderAdapter;
import org.eclipse.stem.definitions.adapters.relativevalue.RelativeValueProviderAdapterFactory;
import org.eclipse.stem.definitions.adapters.relativevalue.history.RelativeValueHistoryProvider;
import org.eclipse.stem.definitions.adapters.relativevalue.history.RelativeValueHistoryProviderAdapter;
import org.eclipse.stem.definitions.adapters.relativevalue.history.RelativeValueHistoryProviderAdapterFactory;
import org.eclipse.stem.diseasemodels.standard.DiseaseModelLabel;
import org.eclipse.stem.diseasemodels.standard.DiseaseModelLabelValue;
import org.eclipse.stem.diseasemodels.standard.StandardDiseaseModelLabelValue;
import org.eclipse.stem.diseasemodels.standard.util.StandardAdapterFactory;
/**
* This class is a factory for this model that creates
* {@link RelativeValueHistoryProvider}'s for classes in the model.
*/
public class StandardRelativeValueHistoryProviderAdapterFactory extends
StandardAdapterFactory implements
RelativeValueHistoryProviderAdapterFactory {
/**
* This keeps track of the root adapter factory that delegates to this
* adapter factory.
*/
protected ComposedAdapterFactory parentAdapterFactory;
/**
* This is used to implement
* {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
*/
protected IChangeNotifier changeNotifier = new ChangeNotifier();
/**
* This factory is used to create item providers for the adapted classes.
* The item providers are used as property sources to get the properties
* that can have relative values.
*/
private static StandardItemProviderAdapterFactory itemProviderFactory;
private HistoryProviderAdapter historyProviderAdapter = null;
/**
* Default Constructor
*/
public StandardRelativeValueHistoryProviderAdapterFactory() {
super();
RelativeValueHistoryProviderAdapterFactory.INSTANCE
.addAdapterFactory(this);
} // StandardRelativeHistoryValueProviderAdapterFactory
/**
* @see org.eclipse.stem.diseasemodels.standard.util.StandardAdapterFactory#createAdapter(org.eclipse.emf.common.notify.Notifier)
*/
@Override
public Adapter createAdapter(Notifier target) {
Adapter retValue = null;
// Before we create our adapter, we try to adapt the target to a
// HistoryProvider. If we can't then we're done and return null to
// indicate that this factory can't create the adapter. If not, then we
// remember the history provider and let the super class's method do the
// switch on the type.
historyProviderAdapter = (HistoryProviderAdapter) HistoryProviderAdapterFactory.INSTANCE
.adapt(target, HistoryProvider.class);
// Did we succeed?
if (historyProviderAdapter != null) {
// Yes
retValue = super.createAdapter(target);
} // if
return retValue;
} // createAdapter
/**
* @see org.eclipse.stem.diseasemodels.standard.util.StandardAdapterFactory#createDiseaseModelLabelAdapter()
*/
@Override
public Adapter createDiseaseModelLabelAdapter() {
return new DiseaseModelLabelRelativeValueHistoryProvider(
historyProviderAdapter);
} // createDiseaseModelLabelAdapter
/**
* @see org.eclipse.emf.edit.provider.IChangeNotifier#addListener(org.eclipse.emf.edit.provider.INotifyChangedListener)
*/
public void addListener(final INotifyChangedListener notifyChangedListener) {
changeNotifier.addListener(notifyChangedListener);
} // addListener
/**
* @see org.eclipse.emf.edit.provider.IChangeNotifier#fireNotifyChanged(org.eclipse.emf.common.notify.Notification)
*/
public void fireNotifyChanged(final Notification notification) {
changeNotifier.fireNotifyChanged(notification);
if (parentAdapterFactory != null) {
parentAdapterFactory.fireNotifyChanged(notification);
}
} // fireNotifyChanged
/**
* @see org.eclipse.emf.edit.provider.IChangeNotifier#removeListener(org.eclipse.emf.edit.provider.INotifyChangedListener)
*/
public void removeListener(
final INotifyChangedListener notifyChangedListener) {
changeNotifier.removeListener(notifyChangedListener);
} // removeListener
/**
* @see org.eclipse.emf.edit.provider.ComposeableAdapterFactory#getRootAdapterFactory()
*/
public ComposeableAdapterFactory getRootAdapterFactory() {
return parentAdapterFactory == null ? this : parentAdapterFactory
.getRootAdapterFactory();
} // getRootAdapterFactory
/**
* @see org.eclipse.emf.edit.provider.ComposeableAdapterFactory#setParentAdapterFactory(org.eclipse.emf.edit.provider.ComposedAdapterFactory)
*/
public void setParentAdapterFactory(
final ComposedAdapterFactory parentAdapterFactory) {
this.parentAdapterFactory = parentAdapterFactory;
} // setParentAdapterFactory
/**
* @see org.eclipse.emf.common.notify.AdapterFactory#isFactoryForType(java.lang.Object)
*/
@Override
public boolean isFactoryForType(final Object type) {
return type == RelativeValueHistoryProvider.class
|| super.isFactoryForType(type);
}
/**
* This disposes all of the item providers created by this factory.
*
* @see org.eclipse.emf.edit.provider.IDisposable#dispose()
*/
public void dispose() {
// Nothing
} // dispose
/**
* @return the instance of the Relative Value Provider Adapter Factory
*/
private static RelativeValueProviderAdapterFactory getRelativeValueProviderAdapterFactory() {
return RelativeValueProviderAdapterFactory.INSTANCE;
} // getRelativeValueProviderAdapterFactory
/**
* This class is a Relative Value History Provider for DiseaseModelLabel
* instances. It provides a collection of the properties that can have
* relative values and will compute the value between 0.0 and 1.0 for any of
* those properties. It will also provide historic relative values.
*
* @see DiseaseModelLabelValueRelativeValueHistoryProvider
*/
public static class DiseaseModelLabelRelativeValueHistoryProvider extends
RelativeValueHistoryProviderAdapter implements
RelativeValueHistoryProvider {
private HistoryProviderAdapter historyProviderAdapter = null;
/**
* @param historyProviderAdapter
*/
public DiseaseModelLabelRelativeValueHistoryProvider(
final HistoryProviderAdapter historyProviderAdapter) {
this.historyProviderAdapter = historyProviderAdapter;
historyProviderAdapter.addExtensionListener(this);
} // DiseaseModelLabelRelativeValueHistoryProvider
/**
* @see org.eclipse.stem.definitions.adapters.relativevalue.RelativeValueProviderAdapter#getProperties()
*/
@Override
public List<IItemPropertyDescriptor> getProperties() {
final DiseaseModelLabel dml = (DiseaseModelLabel) getTarget();
final RelativeValueProvider rvp = (RelativeValueProvider) getRelativeValueProviderAdapterFactory()
.adapt(dml.getCurrentValue(), RelativeValueProvider.class);
return rvp.getProperties();
} // getProperties
/**
* @see org.eclipse.stem.definitions.adapters.relativevalue.RelativeValueProviderAdapter#getRelativeValue(org.eclipse.emf.ecore.EStructuralFeature)
*/
@Override
public double getRelativeValue(final EStructuralFeature feature) {
final DiseaseModelLabel dml = (DiseaseModelLabel) getTarget();
final RelativeValueProvider rvp = (RelativeValueProvider) getRelativeValueProviderAdapterFactory()
.adapt(dml.getCurrentValue(), RelativeValueProvider.class);
return rvp.getRelativeValue(feature);
} // getRelativeValue
/**
* This method returns the denominator or scale used to convert to relative
* values in the range 0-1. For example, in an Epidemic Compartment model
* the state values are normalized by population.
* It is required whenever we need to switch between relative and absolute values
* or can be used to create a label showing the maximum scale for any relative value.
* @return the denominator or scale used to normalize the relative value
*/
public double getDenominator(final EStructuralFeature feature) {
final DiseaseModelLabel dml = (DiseaseModelLabel) getTarget();
DiseaseModelLabelValue dmlv = (DiseaseModelLabelValue)dml.getCurrentValue();
final double populationCount = dmlv.getPopulationCount();
return dmlv.getPopulationCount();
}
/**
* @see org.eclipse.stem.definitions.adapters.relativevalue.history.RelativeValueHistoryProvider#getRelativeValue(org.eclipse.emf.edit.provider.ItemPropertyDescriptor,
* org.eclipse.stem.core.model.STEMTime)
*/
@Override
public double getRelativeValue(final ItemPropertyDescriptor property,
final STEMTime time) {
return getRelativeValue((EStructuralFeature) property
.getFeature(null), time);
}
/**
* @see org.eclipse.stem.definitions.adapters.relativevalue.history.RelativeValueHistoryProviderAdapter#getRelativeValue(org.eclipse.emf.ecore.EStructuralFeature,
* org.eclipse.stem.core.model.STEMTime)
*/
@Override
public double getRelativeValue(final EStructuralFeature feature,
final STEMTime time) {
historyProviderAdapter.setTarget(getTarget());
final DiseaseModelLabel dml = (DiseaseModelLabel) historyProviderAdapter
.getInstance(time);
final RelativeValueProviderAdapter rvp = (RelativeValueProviderAdapter) RelativeValueProviderAdapterFactory.INSTANCE
.adapt(dml, RelativeValueProvider.class);
return rvp.getRelativeValue(feature);
} // getRelativeValue
/**
* @see org.eclipse.stem.definitions.adapters.relativevalue.history.RelativeValueHistoryProvider#getAllHistoricRelativeValues(org.eclipse.emf.edit.provider.ItemPropertyDescriptor)
*/
@Override
public double[] getAllHistoricRelativeValues(
final ItemPropertyDescriptor property) {
return getAllHistoricRelativeValues((EStructuralFeature) property
.getFeature(null));
}
/**
* @see org.eclipse.stem.definitions.adapters.relativevalue.history.RelativeValueHistoryProviderAdapter#getAllHistoricRelativeValues(org.eclipse.emf.ecore.EStructuralFeature)
*/
@Override
public double[] getAllHistoricRelativeValues(
final EStructuralFeature feature) {
historyProviderAdapter.setTarget(getTarget());
final Identifiable[] historicValues = historyProviderAdapter
.getAllHistoricInstances();
final double[] retValue = new double[historicValues.length];
int i = 0;
for (Identifiable identifiable : historicValues) {
final DiseaseModelLabel dml = (DiseaseModelLabel) identifiable;
final RelativeValueProviderAdapter rvp = (RelativeValueProviderAdapter) RelativeValueProviderAdapterFactory.INSTANCE
.adapt(dml, RelativeValueProvider.class);
retValue[i++] = rvp.getRelativeValue(feature);
} // for each Identifiable
return retValue;
} // getAllHistoricRelativeValues
/**
*
* @param property
* @param timeRange
* @return
*/
public double[] getHistoricInstances(final ItemPropertyDescriptor property, STEMTime[] timeRange) {
double[] allValues = getAllHistoricRelativeValues(property);
double[] retVal = new double[timeRange.length];
System.arraycopy(allValues, 0, retVal, 0, timeRange.length);
return retVal;
}
/**
* @see org.eclipse.stem.definitions.adapters.relativevalue.history.RelativeValueHistoryProviderAdapter#getEarliestTimeValue()
*/
@Override
public STEMTime getEarliestTimeValue() {
historyProviderAdapter.setTarget(getTarget());
return historyProviderAdapter.getEarliestTimeValue();
} // getEarliestTimeValue
/**
* @see org.eclipse.stem.definitions.adapters.relativevalue.history.RelativeValueHistoryProviderAdapter#getAllHistoricTimeValues()
*/
@Override
public STEMTime[] getAllHistoricTimeValues() {
historyProviderAdapter.setTarget(getTarget());
return historyProviderAdapter.getAllHistoricTimeValues();
} // getAllHistoricTimeValues
} // DiseaseModelLabelRelativeValueHistoryProvider
} // StandardRelativeValueHistoryProviderAdapterFactory