source: DCWoRMS/trunk/src/schedframe/resources/computing/ComputingResource.java @ 517

Revision 517, 10.7 KB checked in by wojtekp, 13 years ago (diff)
  • Property svn:mime-type set to text/plain
Line 
1package schedframe.resources.computing;
2
3import gridsim.GridSimTags;
4import gridsim.dcworms.DCWormsTags;
5
6import java.util.ArrayList;
7import java.util.LinkedList;
8import java.util.List;
9import java.util.Properties;
10
11import schedframe.Initializable;
12import schedframe.events.Event;
13import schedframe.events.EventHandler;
14import schedframe.events.ResourceEventCommand;
15import schedframe.events.scheduling.EventReason;
16import schedframe.events.scheduling.SchedulingEvent;
17import schedframe.events.scheduling.SchedulingEventCommand;
18import schedframe.exceptions.ResourceException;
19import schedframe.resources.Resource;
20import schedframe.resources.ResourceStatus;
21import schedframe.resources.ResourceType;
22import schedframe.resources.computing.description.ComputingResourceDescription;
23import schedframe.resources.computing.extensions.Extension;
24import schedframe.resources.computing.extensions.ExtensionList;
25import schedframe.resources.computing.extensions.ExtensionListImpl;
26import schedframe.resources.computing.extensions.ExtensionType;
27import schedframe.resources.computing.profiles.energy.EnergyEvent;
28import schedframe.resources.computing.profiles.energy.EnergyEventType;
29import schedframe.resources.computing.profiles.energy.EnergyExtension;
30import schedframe.resources.computing.profiles.energy.airthroughput.ui.AirThroughputInterface;
31import schedframe.resources.computing.profiles.energy.power.ui.PowerInterface;
32import schedframe.resources.computing.properties.DefaultPropertiesBuilder;
33import schedframe.resources.computing.properties.PropertiesDirector;
34import schedframe.resources.computing.validator.ResourceNameValidator;
35import schedframe.resources.computing.validator.ResourcePropertiesValidator;
36import schedframe.resources.computing.validator.ResourceStatusValidator;
37import schedframe.resources.computing.validator.ResourceTypeValidator;
38import schedframe.resources.computing.validator.ResourceValidator;
39import schedframe.resources.units.PEUnit;
40import schedframe.resources.units.ResourceUnit;
41import schedframe.resources.units.StandardResourceUnitName;
42import schedframe.scheduling.Scheduler;
43
44public class ComputingResource implements Resource, Initializable{
45       
46        protected String name;
47        protected ResourceType type;
48        protected String category;
49        protected ResourceStatus status;
50
51        protected ComputingResource parent;
52        protected List<ComputingResource> children;
53       
54        protected Scheduler scheduler;
55        protected ResourceCharacteristics resourceCharacteristic;
56        protected ExtensionList extensionList;
57       
58
59        public ExtensionList getExtensionList() {
60                return extensionList;
61        }
62
63        public ComputingResource(ComputingResourceDescription resDesc) {
64                this.type = resDesc.getType();
65                this.name = resDesc.getId();
66                this.category = resDesc.getCategory();
67                this.status = ResourceStatus.FREE;
68                this.extensionList = new ExtensionListImpl(1);
69                initCharacteristics(resDesc);
70                addFakeProcessors();
71        }
72
73        //TODO remove if possible (check if all scenarios can be realized - statistics issue), since it's a temporary method
74        private void addFakeProcessors() {
75                if(getResourceCharacteristic().getResourceUnits().get(StandardResourceUnitName.PE) != null){
76                        for(ResourceUnit resUnit: getResourceCharacteristic().getResourceUnits().get(StandardResourceUnitName.PE)){
77                                PEUnit peUnit = (PEUnit) resUnit;
78                                for(int i = 0; i < peUnit.getAmount(); i++){
79                                        schemas.ComputingResource fakeCompResource = new schemas.ComputingResource();
80                                        fakeCompResource.setClazz("Processor");
81                                        addChild(ResourceFactory.createResource(new ComputingResourceDescription(fakeCompResource)));
82                                }
83                        }
84                }
85        }
86
87        protected void initCharacteristics(ComputingResourceDescription resDesc){
88                resourceCharacteristic = new ResourceCharacteristics.Builder().resourceUnits(resDesc.getResourceUnits()).location(resDesc.getLocation()).parameters(resDesc.getParameters()).build();
89        }
90       
91        public ComputingResource getParent() {
92                return parent;
93        }
94
95        public void setParent(ComputingResource newParent) {
96                parent = newParent;
97        }
98
99        public List<ComputingResource> getChildren() {
100                if (children == null)
101                        return new ArrayList<ComputingResource>(1);
102                return children;
103        }
104
105        public void addChild(ComputingResource child) {
106                child.setParent(this);
107                if (children == null)
108                        children = new ArrayList<ComputingResource>();
109                children.add(child);
110        }
111
112        public String getName() {
113                return name;
114        }
115
116        public ResourceType getType() {
117                return type;
118        }
119
120        public ResourceCharacteristics getResourceCharacteristic() {
121                return resourceCharacteristic;
122        }
123
124        public ResourceStatus getStatus() {
125                return status;
126        }
127
128        public void setStatus(ResourceStatus newStatus) {
129                if(newStatus != status){
130                        status = newStatus;
131                        if(children != null) {
132                                for(ComputingResource child: children){
133                                        child.setStatus(status);
134                                }
135                        }       
136                }
137        }
138       
139        private void triggerEventUp(Event event) {
140                if(parent != null)
141                        parent.handleEvent(event);
142        }
143
144        public void handleEvent(Event event){
145                ResourceEventCommand rec = new ResourceEventCommand(this);
146                rec.execute(event);
147                SchedulingEventCommand sec = new SchedulingEventCommand(this);
148                sec.execute(event);
149
150                //old, correctly working method
151                /*if (extensionList != null) {
152                        for (Extension extension : extensionList) {
153                                if (extension.supportsEvent(event)) {
154                                        extension.handleEvent(event);
155                                }
156                        }
157                }*/
158                //TODO - delete, check before
159                //if(scheduler != null && (parent != null && scheduler != parent.getScheduler())/*scheduler.getResources().contains(this)*/){
160                //      String src = event.getSource() != null ? event.getSource() : name;
161                //      scheduler.sendInternal(GridSimTags.SCHEDULE_NOW, DCWormsTags.UPDATE, src);
162                //}
163                //triggerEventUp(event);
164        }
165       
166        public List <? extends ComputingResource> getDescendantsByType(ResourceType type) {
167                List<ResourceValidator> validators = new ArrayList<ResourceValidator>();
168                validators.add(new ResourceTypeValidator(type));
169                return searchDescendants(validators, true);
170        }
171
172        public List<? extends ComputingResource> getDescendantsByTypeAndStatus(ResourceType type, ResourceStatus status) {
173                List<ResourceValidator> validators = new ArrayList<ResourceValidator>();
174                validators.add(new ResourceStatusValidator(status));
175                validators.add(new ResourceTypeValidator(type));
176                return searchDescendants(validators, true);
177        }
178
179        public ComputingResource getDescendantByName(String resourceName) throws ResourceException {
180                List<ResourceValidator> validators = new ArrayList<ResourceValidator>();
181                validators.add(new ResourceNameValidator(resourceName));
182                List<? extends ComputingResource> resources = searchDescendants(validators, true);
183                return resources.size() == 0 ? null : resources.get(0);
184        }
185       
186        public List<? extends ComputingResource> filterDescendants(Properties properties)  {
187                List<ResourceValidator> validators = new ArrayList<ResourceValidator>();
188                validators.add(new ResourcePropertiesValidator(properties));
189                return searchDescendants(validators, false);
190        }
191       
192        protected List<? extends ComputingResource> searchDescendants(List<ResourceValidator> validators, boolean cutOff) {
193
194                List<ComputingResource> descendants = new ArrayList<ComputingResource>();
195                if (children != null) {
196                        LinkedList<ComputingResource> toExamine = new LinkedList<ComputingResource>();
197                        toExamine.push(this);
198
199                        while (!toExamine.isEmpty()) {
200                                ComputingResource resource = toExamine.pop();
201                                List<ComputingResource> resources = resource.getChildren();
202                                int numberOfRes = resources.size();
203                                for (int i = 0; i < numberOfRes; i++) {
204                                        ComputingResource resourceChild = resources.get(i);
205                                        if (resourceChild.match(validators)) {
206                                                descendants.add(resourceChild);
207                                                if(cutOff == false) {
208                                                        toExamine.addLast(resourceChild);
209                                                }
210                                        } else
211                                                //toExamine.insertElementAt(resourceChild, 0);
212                                                toExamine.addLast(resourceChild);
213                                }
214                        }
215                }
216                return descendants;
217        }
218       
219        protected boolean match(List<ResourceValidator> validators){
220                for(ResourceValidator validator: validators){
221                        if(validator.validate(this) == false)
222                                return false;
223                }
224                return true;
225        }
226       
227        public Properties getProperties(){
228                PropertiesDirector propDirector = new PropertiesDirector();
229                propDirector.setPropertiesBuilder(new DefaultPropertiesBuilder());
230                propDirector.constructProperties(this);
231                return propDirector.getProperties();
232        }
233       
234        public String getCategory(){
235                return category;
236        }
237       
238        public PowerInterface getPowerInterface(){
239                Extension extension = getExtension(ExtensionType.ENERGY_EXTENSION);
240                if(extension != null){
241                        EnergyExtension ee = (EnergyExtension)extension;
242                        return ee.getPowerInterface();
243                }
244                return null;
245        }
246       
247        public AirThroughputInterface getAirThroughputInterface(){
248                Extension extension = getExtension(ExtensionType.ENERGY_EXTENSION);
249                if(extension != null){
250                        EnergyExtension ee = (EnergyExtension)extension;
251                        return ee.getAirThroughputInterface();
252                }
253                return null;
254        }
255
256        private  Extension getExtension(ExtensionType type){
257                if (extensionList != null) {
258                        for (Extension extension : extensionList) {
259                                if (extension.getType() == type) {
260                                        return extension;
261                                }
262                        }
263                }
264                return null;
265        }
266       
267        public Scheduler getScheduler() {
268                return scheduler;
269        }
270       
271        public void setScheduler(Scheduler scheduler) {
272                this.scheduler = scheduler;
273                if(children != null){
274                        for(ComputingResource child: children){
275                                child.setScheduler(scheduler);
276                        }       
277                }
278        }
279
280        class ComputingResourceEventHandler implements EventHandler{
281               
282                public void handleResourceEvent(Event event){
283                        if (extensionList != null) {
284                                for (Extension extension : extensionList) {
285                                        if (extension.supportsEvent(event)) {
286                                                extension.handleEvent(event);
287                                        }
288                                }
289                        }
290                        if(event.getReason() != EventReason.SIM_INIT)
291                                triggerEventUp(event);
292                }
293               
294                public void handleSchedulingEvent(SchedulingEvent event){
295
296                        if(scheduler != null && (parent != null && scheduler != parent.getScheduler())/*scheduler.getResources().contains(this)*/){
297                                String src = event.getSource() != null ? event.getSource() : name;
298                                scheduler.sendInternal(GridSimTags.SCHEDULE_NOW, DCWormsTags.UPDATE, src);
299                        } else if(parent != null)
300                                parent.getEventHandler().handleSchedulingEvent(event);
301                }
302        }
303       
304        public EventHandler getEventHandler(){
305                return new ComputingResourceEventHandler();
306        }
307       
308        public void initiate(){
309               
310                /*ResourceEventCommand rec = new ResourceEventCommand(this);
311                EnergyEvent event = new EnergyEvent(EnergyEventType.AIRFLOW_STATE_CHANGED, "Resource controller");
312                event.setReason(EventReason.SIM_INIT);
313                rec.execute(event);*/
314                ResourceEventCommand rec = new ResourceEventCommand(this);
315                EnergyEvent event = new EnergyEvent(EnergyEventType.POWER_STATE_CHANGED, "Resource controller");
316                event.setReason(EventReason.SIM_INIT);
317                rec.execute(event);
318               
319                //alternative way
320                //getEventHandler().handleResourceEvent(new EnergyEvent(EnergyEventType.AIRFLOW_STATE_CHANGED, "Resource controller"));
321                //getEventHandler().handleResourceEvent(new EnergyEvent(EnergyEventType.POWER_STATE_CHANGED, "Resource controller"));
322        }
323}
Note: See TracBrowser for help on using the repository browser.