package org.opennaas.extensions.network.repository;
import java.util.ArrayList;
import java.util.List;
import org.opennaas.core.resources.descriptor.network.DeviceId;
import org.opennaas.core.resources.descriptor.network.InterfaceId;
import org.opennaas.core.resources.descriptor.network.Layer;
import org.opennaas.core.resources.descriptor.network.LayerId;
import org.opennaas.core.resources.descriptor.network.NetworkTopology;
import org.opennaas.extensions.network.model.NetworkModel;
import org.opennaas.extensions.network.model.NetworkModelHelper;
import org.opennaas.extensions.network.model.domain.NetworkDomain;
import org.opennaas.extensions.network.model.topology.ConnectionPoint;
import org.opennaas.extensions.network.model.topology.Device;
import org.opennaas.extensions.network.model.topology.Interface;
import org.opennaas.extensions.network.model.topology.NetworkElement;
public class NetworkMapperModelToDescriptor {
public static NetworkTopology modelToDescriptor(NetworkModel networkModel) {
List<org.opennaas.core.resources.descriptor.network.Device> existingDevices = new ArrayList<org.opennaas.core.resources.descriptor.network.Device>();
List<org.opennaas.core.resources.descriptor.network.NetworkDomain> existingDomains = new ArrayList<org.opennaas.core.resources.descriptor.network.NetworkDomain>();
List<org.opennaas.core.resources.descriptor.network.Interface> existingInterfaces = new ArrayList<org.opennaas.core.resources.descriptor.network.Interface>();
// List<org.opennaas.core.resources.descriptor.network.Link> existingLinks = new
// ArrayList<org.opennaas.core.resources.descriptor.network.Link>();
/* added all elements */
for (NetworkElement networkElement : networkModel.getNetworkElements()) {
if (networkElement instanceof Device) {
existingDevices.add(newDevice((Device) networkElement));
} else if (networkElement instanceof Interface) {
existingInterfaces.add(newInterface((Interface) networkElement));
} else if (networkElement instanceof NetworkDomain) {
existingDomains.add(newNetworkDomain((NetworkDomain) networkElement));
}
}
/* we create all the necessary associations */
/* using domains */
for (NetworkDomain networkDomain : NetworkModelHelper.getDomains(networkModel.getNetworkElements())) {
int posNetworkDomain = getNetworkDomain(networkDomain.getName(), existingDomains);
org.opennaas.core.resources.descriptor.network.NetworkDomain networkDomainDescriptor = existingDomains.get(posNetworkDomain);
List<DeviceId> deviceIds = new ArrayList<DeviceId>();
for (Device device : networkDomain.getHasDevice()) {
deviceIds.add(newDeviceId(device.getName()));
}
networkDomainDescriptor.setHasDevices(deviceIds);
}
/* using device */
for (Device device : NetworkModelHelper.getDevices(networkModel.getNetworkElements())) {
int posDevice = getDevice(device.getName(), existingDevices);
org.opennaas.core.resources.descriptor.network.Device deviceDescriptor = existingDevices.get(posDevice);
List<InterfaceId> interfaceIds = new ArrayList<InterfaceId>();
for (ConnectionPoint interf : device.getInterfaces()) {
interfaceIds.add(newInterfaceId(interf.getName()));
}
deviceDescriptor.setHasInterfaces(interfaceIds);
}
/* using interface */
for (Interface interf : NetworkModelHelper.getInterfaces(networkModel.getNetworkElements())) {
int posInterface = getInterface(interf.getName(), existingInterfaces);
org.opennaas.core.resources.descriptor.network.Interface interfaceDescriptor = existingInterfaces.get(posInterface);
if (interf.getLinkTo() != null) {
String toLinkName = "";
if (interf.getLinkTo().getSource().getName().equals(interf.getName())) {
toLinkName = newInterfaceId(interf.getLinkTo().getSink().getName()).getResource();
} else {
toLinkName = newInterfaceId(interf.getLinkTo().getSource().getName()).getResource();
}
interfaceDescriptor.setLinkTo(newLink(toLinkName));
}
}
NetworkTopology networkTopology = new NetworkTopology();
networkTopology.setDevices(existingDevices);
networkTopology.setInterfaces(existingInterfaces);
networkTopology.setNetworkDomains(existingDomains);
networkTopology.setLayers(getLayers(networkModel));
return networkTopology;
}
private static String addHashCharacter(String name) {
if (!name.startsWith("#"))
return "#" + name;
else
return name;
}
private static List<Layer> getLayers(NetworkModel networkModel) {
List<Layer> layers = new ArrayList<Layer>();
for (org.opennaas.extensions.network.model.layer.Layer layer : NetworkModelHelper.getLayers(networkModel.getNetworkElements())) {
Layer descriptorLayer = new Layer();
descriptorLayer.setName(layer != null ? addHashCharacter(layer.getName()) : null);
layers.add(descriptorLayer);
}
return layers;
}
/**
*
* @param name
* Name of the NetworkDomain in network model to get
* @param existingDomains
* List of NetworkDomains in descriptor topology.
* @return Position inside existingDomains of the NetworkDomain to get, or -1 if existingDomains does not contain desired domain.
*/
private static int getNetworkDomain(String name, List<org.opennaas.core.resources.descriptor.network.NetworkDomain> existingDomains) {
int pos = 0;
for (org.opennaas.core.resources.descriptor.network.NetworkDomain networkDomain : existingDomains) {
if (networkDomain.getName().equals(name))
return pos;
pos++;
}
return -1;
}
private static DeviceId newDeviceId(String name) {
DeviceId deviceId = new DeviceId();
deviceId.setResource(addHashCharacter(name));
return deviceId;
}
/**
*
* @param name
* Name of the Device in network model to get
* @param existingDevices
* List of Interfaces in descriptor topology.
* @return Position inside existingDevices of the Device to get, or -1 if existingDevices does not contain desired device.
*/
private static int getDevice(String name, List<org.opennaas.core.resources.descriptor.network.Device> existingDevices) {
int pos = 0;
for (org.opennaas.core.resources.descriptor.network.Device device : existingDevices) {
if (device.getName().equals(name))
return pos;
pos++;
}
return -1;
}
private static InterfaceId newInterfaceId(String name) {
InterfaceId interfaceId = new InterfaceId();
interfaceId.setResource(addHashCharacter(name));
return interfaceId;
}
private static org.opennaas.core.resources.descriptor.network.NetworkDomain newNetworkDomain(NetworkDomain networkElement) {
org.opennaas.core.resources.descriptor.network.NetworkDomain networkDomain = new org.opennaas.core.resources.descriptor.network.NetworkDomain();
networkDomain.setName(networkElement.getName());
return networkDomain;
}
private static org.opennaas.core.resources.descriptor.network.Link newLink(String name) {
org.opennaas.core.resources.descriptor.network.Link link = new org.opennaas.core.resources.descriptor.network.Link();
link.setName(name);
return link;
}
private static org.opennaas.core.resources.descriptor.network.Interface newInterface(Interface networkElement) {
org.opennaas.core.resources.descriptor.network.Interface interf = new org.opennaas.core.resources.descriptor.network.Interface();
LayerId layerId = new LayerId();
layerId.setResource(networkElement.getLayer() != null ? networkElement.getLayer().getName() : null);
interf.setName(networkElement.getName());
interf.setAtLayer(layerId);
return interf;
}
private static org.opennaas.core.resources.descriptor.network.Device newDevice(Device networkElement) {
org.opennaas.core.resources.descriptor.network.Device device = new org.opennaas.core.resources.descriptor.network.Device();
device.setName(networkElement.getName());
return device;
}
/**
*
* @param name
* Name of the Interface in network model to get
* @param interfaces
* List of Interfaces in descriptor topology.
* @return Position inside interfaces of the Interface to get, or -1 if interfaces does not contain desired interface.
*/
private static int getInterface(String name, List<org.opennaas.core.resources.descriptor.network.Interface> interfaces) {
int pos = 0;
for (org.opennaas.core.resources.descriptor.network.Interface interf : interfaces) {
if (interf.getName().equals(name)) {
return pos;
}
pos++;
}
return -1;
}
}