/*
* Copyright (c) 2005-2011 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.common;
import java.util.LinkedList;
import java.util.List;
import de.tud.kom.p2psim.api.common.HostProperties;
import de.tud.kom.p2psim.api.common.SimHost;
import de.tud.kom.p2psim.api.energy.EnergyModel;
import de.tud.kom.p2psim.api.linklayer.LinkLayer;
import de.tud.kom.p2psim.api.network.NetLayer;
import de.tud.kom.p2psim.api.network.SimNetworkComponent;
import de.tud.kom.p2psim.api.topology.TopologyComponent;
import de.tudarmstadt.maki.simonstrator.api.Monitor;
import de.tudarmstadt.maki.simonstrator.api.Monitor.Level;
import de.tudarmstadt.maki.simonstrator.api.common.graph.INodeID;
import de.tudarmstadt.maki.simonstrator.api.component.ComponentNotAvailableException;
import de.tudarmstadt.maki.simonstrator.api.component.HostComponent;
import de.tudarmstadt.maki.simonstrator.api.component.transport.TransportComponent;
/**
* Default implementation of a host.
*/
public class DefaultHost implements SimHost {
/*
* "New Host"
*/
private final List components = new LinkedList();
private final long uniqueHostId;
private SimNetworkComponent networkComponent = null;
private TransportComponent transportComponent = null;
public DefaultHost() {
hostCounter++;
this.uniqueHostId = hostCounter;
}
@Override
public T getComponent(Class componentClass)
throws ComponentNotAvailableException {
for (HostComponent component : components) {
if (componentClass.isInstance(component)) {
return componentClass.cast(component);
}
}
throw new ComponentNotAvailableException();
}
@Override
public List getComponents(
Class componentClass) throws ComponentNotAvailableException {
List match = new LinkedList();
for (HostComponent component : components) {
if (componentClass.isInstance(component)) {
match.add(componentClass.cast(component));
}
}
if (match.isEmpty()) {
throw new ComponentNotAvailableException();
} else {
return match;
}
}
@Override
public void registerComponent(T component) {
if (!components.contains(component)) {
components.add(component);
} else {
throw new UnsupportedOperationException("The component "
+ component.toString() + " is already registered!");
}
}
@Override
public boolean removeComponent(T component) {
assert component != null;
if (components.remove(component)) {
component.shutdown();
return true;
}
return false;
}
@Override
public SimNetworkComponent getNetworkComponent() {
if (networkComponent == null) {
try {
networkComponent = getComponent(SimNetworkComponent.class);
} catch (ComponentNotAvailableException e) {
Monitor.log(DefaultHost.class, Level.ERROR, "No NetworkComponent found in the current configuration!");
}
}
return networkComponent;
}
@Override
public TransportComponent getTransportComponent() {
if (transportComponent == null) {
try {
transportComponent = getComponent(TransportComponent.class);
} catch (ComponentNotAvailableException e) {
Monitor.log(DefaultHost.class, Level.ERROR, "No TransportComponent found in the current configuration!");
}
}
return transportComponent;
}
/**
* @deprecated use getId instead (and the value() method)
*/
@Override
@Deprecated
public long getHostId() {
return uniqueHostId;
}
@Override
public INodeID getId() {
return INodeID.get(uniqueHostId);
}
/*
* "Old Host"
*/
private NetLayer netLayer;
private LinkLayer linkLayer;
private EnergyModel energyModel;
private TopologyComponent topoComponent;
private HostProperties properties;
private static long hostCounter = 0;
public void setProperties(HostProperties properties) {
this.properties = properties;
}
@Override
public LinkLayer getLinkLayer() {
if (linkLayer == null) {
try {
linkLayer = getComponent(LinkLayer.class);
} catch (ComponentNotAvailableException e) {
//
}
}
return linkLayer;
}
@Override
public EnergyModel getEnergyModel() {
if (energyModel == null) {
try {
energyModel = getComponent(EnergyModel.class);
} catch (ComponentNotAvailableException e) {
//
}
}
return energyModel;
}
@Override
public TopologyComponent getTopologyComponent() {
if (topoComponent == null) {
try {
topoComponent = getComponent(TopologyComponent.class);
} catch (ComponentNotAvailableException e) {
//
}
}
return topoComponent;
}
@Override
public HostProperties getProperties() {
return properties;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("Host {");
sb.append("GroupID=");
if (this.properties != null)
sb.append(this.properties.getGroupID());
sb.append(", nw=");
if (this.netLayer != null)
sb.append(netLayer.getNetID());
sb.append(", #olays=");
sb.append("}");
return sb.toString();
}
@Override
public void initialize() {
try {
List components = getComponents(HostComponent.class);
for (HostComponent hostComponent : components) {
hostComponent.initialize();
}
} catch (ComponentNotAvailableException e) {
throw new AssertionError(
"This host was configured without any components!");
}
}
}