package org.cloudbus.cloudsim.container.utils;
/**
* Created by sareh on 13/08/15.
*/
import org.cloudbus.cloudsim.container.containerProvisioners.ContainerPe;
import org.cloudbus.cloudsim.container.containerVmProvisioners.ContainerVmPe;
import org.cloudbus.cloudsim.container.core.*;
import java.util.LinkedHashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.Map;
/**
* A factory for CloudSim entities' ids. CloudSim requires a lot of ids, that
* are provided by the end user. This class is a utility for automatically
* generating valid ids.
* Modifies for containers
*
* @author nikolay.grozev
*/
public final class IDs {
private static final Map<Class<?>, Integer> COUNTERS = new LinkedHashMap<>();
private static final Set<Class<?>> NO_COUNTERS = new HashSet<>();
private static int globalCounter = 1;
static {
COUNTERS.put(ContainerCloudlet.class, 1);
COUNTERS.put(ContainerVm.class, 1);
COUNTERS.put(Container.class, 1);
COUNTERS.put(ContainerHost.class, 1);
COUNTERS.put(ContainerDatacenterBroker.class, 1);
COUNTERS.put(ContainerPe.class, 1);
COUNTERS.put(ContainerVmPe.class, 1);
}
private IDs() {
}
/**
* Returns a valid id for the specified class.
*
* @param clazz - the class of the object to get an id for. Must not be null.
* @return a valid id for the specified class.
*/
public static synchronized int pollId(final Class<?> clazz) {
Class<?> matchClass = null;
if (COUNTERS.containsKey(clazz)) {
matchClass = clazz;
} else if (!NO_COUNTERS.contains(clazz)) {
for (Class<?> key : COUNTERS.keySet()) {
if (key.isAssignableFrom(clazz)) {
matchClass = key;
break;
}
}
}
int result = -1;
if (matchClass == null) {
NO_COUNTERS.add(clazz);
result = pollGlobalId();
} else {
result = COUNTERS.get(matchClass);
COUNTERS.put(matchClass, result + 1);
}
if (result < 0) {
throw new IllegalStateException("The generated id for class:" + clazz.getName()
+ " is negative. Possible integer overflow.");
}
return result;
}
private static synchronized int pollGlobalId() {
return globalCounter++;
}
}