/*
* Copyright (c) 2005-2010 KOM – Multimedia Communications Lab
*
* This file is part of PeerfactSim.KOM.
*
* PeerfactSim.KOM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* PeerfactSim.KOM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PeerfactSim.KOM. If not, see .
*
*/
package de.tud.kom.p2psim.impl.energy.models;
import java.util.List;
import java.util.Set;
import java.util.Vector;
import de.tud.kom.p2psim.api.common.SimHost;
import de.tud.kom.p2psim.api.energy.ComponentType;
import de.tud.kom.p2psim.api.energy.EnergyComponent;
import de.tud.kom.p2psim.api.energy.EnergyInfo;
import de.tud.kom.p2psim.api.energy.EnergyModel;
import de.tud.kom.p2psim.impl.energy.Battery;
import de.tudarmstadt.maki.simonstrator.api.common.graph.INodeID;
import de.tudarmstadt.maki.simonstrator.api.component.ComponentNotAvailableException;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.battery.BatterySensor;
import de.tudarmstadt.maki.simonstrator.api.component.sis.SiSComponent;
import de.tudarmstadt.maki.simonstrator.api.component.sis.SiSDataCallback;
import de.tudarmstadt.maki.simonstrator.api.component.sis.SiSInfoProperties;
import de.tudarmstadt.maki.simonstrator.api.component.sis.SiSInformationProvider.SiSProviderHandle;
import de.tudarmstadt.maki.simonstrator.api.component.sis.exception.InformationNotAvailableException;
import de.tudarmstadt.maki.simonstrator.api.component.sis.type.SiSTypes;
public abstract class AbstractEnergyModel implements EnergyModel, BatterySensor, EnergyInfo {
protected SimHost host;
protected List energyComponents;
protected Battery bat;
public AbstractEnergyModel(SimHost host, Battery bat) {
energyComponents = new Vector();
this.bat = bat;
this.host = host;
}
@Override
public void initialize() {
//
try {
SiSComponent sis = host.getComponent(SiSComponent.class);
sis.provide().nodeState(SiSTypes.ENERGY_BATTERY_LEVEL,
new SiSDataCallback() {
Set localID = INodeID.getSingleIDSet(getHost()
.getId());
@Override
public Double getValue(INodeID nodeID,
SiSProviderHandle providerHandle)
throws InformationNotAvailableException {
if (nodeID.equals(getHost().getId())) {
return getCurrentPercentage();
} else {
throw new InformationNotAvailableException();
}
}
@Override
public Set getObservedNodes() {
return localID;
}
@Override
public SiSInfoProperties getInfoProperties() {
return new SiSInfoProperties();
}
});
sis.provide().nodeState(SiSTypes.ENERGY_BATTERY_CAPACITY,
new SiSDataCallback() {
Set localID = INodeID.getSingleIDSet(getHost()
.getId());
@Override
public Double getValue(INodeID nodeID,
SiSProviderHandle providerHandle)
throws InformationNotAvailableException {
if (nodeID.equals(getHost().getId())) {
return getCurrentEnergyLevel();
} else {
throw new InformationNotAvailableException();
}
}
@Override
public Set getObservedNodes() {
return localID;
}
@Override
public SiSInfoProperties getInfoProperties() {
return new SiSInfoProperties();
}
});
} catch (ComponentNotAvailableException e) {
// OK
}
}
@Override
public List getComponents(
ComponentType type, Class componentClass) {
List componentsOfType = new Vector();
for (EnergyComponent energyComponent : energyComponents) {
if (energyComponent.getType().equals(type)
&& componentClass.isInstance(energyComponent)) {
componentsOfType.add(componentClass.cast(energyComponent));
}
}
return componentsOfType;
}
@Override
public T getComponent(ComponentType type,
Class componentClass) {
for (EnergyComponent energyComponent : energyComponents) {
if (energyComponent.getType().equals(type)
&& componentClass.isInstance(energyComponent)) {
return componentClass.cast(energyComponent);
}
}
return null;
}
@Override
public EnergyInfo getEnergyInfo() {
/*
* We export our status to interested applications via this interface
*/
return this;
}
@Override
public Battery getBattery() {
return bat;
}
@Override
public double getCurrentPercentage() {
return bat.getCurrentPercentage();
}
@Override
public double getCurrentEnergyLevel() {
return bat.getCurrentEnergyLevel();
}
@Override
public SimHost getHost() {
return host;
}
@Override
public void shutdown() {
throw new AssertionError(
"You are not supposed to shutdown this component.");
}
@Override
public void reset() {
throw new AssertionError(
"You are not supposed to reset this component.");
}
}