package schedframe.resources; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import schedframe.resources.units.ResourceUnit; import schedframe.scheduling.utils.ResourceParameterName; /** * * @author Marcin Krystek * */ public abstract class ResourceDescription implements Cloneable { protected ResourceProvider provider; protected Map> resUnits; /** * * @return type of described resource */ public abstract ResourceType getType(); protected ResourceDescription(){ this.resUnits = new HashMap>(); } protected ResourceDescription(ResourceDescription r){ this(); Iterator itr = r.resUnits.keySet().iterator(); while(itr.hasNext()){ ResourceParameterName name = itr.next(); try { List list = r.getResourceUnitList(name); List newList = new ArrayList(list.size()); for(int i = 0; i < list.size(); i++){ newList.add((ResourceUnit)list.get(i).clone()); } resUnits.put(name, newList); } catch(NoSuchFieldException e){ e.printStackTrace(); } } provider = r.provider; } /** * * @return resource id */ public ResourceProvider getProvider(){ return this.provider; } /** * * @param unitName name of the resource unit * @return resource unit value * @throws NoSuchFieldException if particular resource unit is not defined */ public ResourceUnit getResourceUnit(ResourceParameterName unitName) throws NoSuchFieldException{ return getResourceUnitList(unitName).get(0); } public List getResourceUnitList(ResourceParameterName unitName) throws NoSuchFieldException{ if(resUnits.containsKey(unitName)) return resUnits.get(unitName); else throw new NoSuchFieldException("Resource unit " + unitName + " is not available in resource " + provider.id); } public Collection getResourceUnit(){ List values = new ArrayList(); Collection> lists = resUnits.values(); Iterator> itr = lists.iterator(); while(itr.hasNext()){ List list = itr.next(); values.addAll(list); } return values; } public int getProcessorsAmount() throws NoSuchFieldException{ List list = getResourceUnitList(ResourceParameterName.CPUCOUNT); int amount = 0; for(int i = 0; i < list.size(); i++){ amount += list.get(i).getAmount(); } return amount; } public float getMemoryAmount() throws NoSuchFieldException{ List list = getResourceUnitList(ResourceParameterName.MEMORY); int amount = 0; for(int i = 0; i < list.size(); i++){ amount += list.get(i).getAmount(); } return amount; } public Object clone(){ ResourceDescription copy = null; try { copy = (ResourceDescription) super.clone(); copy.resUnits = new HashMap>(); Iterator itr = this.resUnits.keySet().iterator(); while(itr.hasNext()){ ResourceParameterName name = itr.next(); List list = this.resUnits.get(name); List newList = new ArrayList(list.size()); for(int i = 0; i < list.size(); i++){ newList.add((ResourceUnit)list.get(i).clone()); } copy.resUnits.put(name, newList); } } catch (CloneNotSupportedException e) { e.printStackTrace(); } return copy; } public enum ResourceType { COMPUTING_RESOURCE, QUEUING_SYSTEM; } public abstract long getQueueLoad(String queueName) throws NoSuchFieldException; }