1 | package schedframe.resources.units; |
---|
2 | |
---|
3 | import schedframe.Parameters; |
---|
4 | |
---|
5 | public abstract class AbstractResourceUnit implements ResourceUnit, Cloneable { |
---|
6 | |
---|
7 | protected ResourceUnitName name; |
---|
8 | |
---|
9 | protected ResourceUnitType resourceType;; |
---|
10 | |
---|
11 | protected String resourceId; |
---|
12 | |
---|
13 | protected ResourceUnitProvisioner provisioner; |
---|
14 | |
---|
15 | |
---|
16 | public AbstractResourceUnit(AbstractResourceUnit unit){ |
---|
17 | this.name = unit.name; |
---|
18 | this.resourceType = unit.resourceType; |
---|
19 | this.resourceId = unit.resourceId; |
---|
20 | this.provisioner = new SimpleResourceUnitProvisioner(unit, ResourceUnitState.FREE, 0); |
---|
21 | } |
---|
22 | |
---|
23 | public AbstractResourceUnit(ResourceUnitName name) { |
---|
24 | this.name = name; |
---|
25 | resourceId = ""; |
---|
26 | resourceType = ResourceUnitType.CONTINUOUS_RESOURCE; |
---|
27 | this.provisioner = new SimpleResourceUnitProvisioner(this, ResourceUnitState.FREE, 0); |
---|
28 | } |
---|
29 | |
---|
30 | public AbstractResourceUnit(ResourceUnitName name, String resId) { |
---|
31 | this(name); |
---|
32 | resourceId = resId; |
---|
33 | resourceType = ResourceUnitType.CONTINUOUS_RESOURCE; |
---|
34 | this.provisioner = new SimpleResourceUnitProvisioner(this, ResourceUnitState.FREE, 0); |
---|
35 | } |
---|
36 | |
---|
37 | public ResourceUnitName getName() { |
---|
38 | return name; |
---|
39 | } |
---|
40 | |
---|
41 | public String getResourceId() { |
---|
42 | return resourceId; |
---|
43 | } |
---|
44 | |
---|
45 | public ResourceUnitType getResourceUnitType() { |
---|
46 | return this.resourceType; |
---|
47 | } |
---|
48 | |
---|
49 | public boolean equals(Object o){ |
---|
50 | if(o instanceof AbstractResourceUnit){ |
---|
51 | AbstractResourceUnit unit = (AbstractResourceUnit) o; |
---|
52 | if(this.name != unit.getName()) return false; |
---|
53 | if(!this.resourceId.equals(unit.getResourceId())) return false; |
---|
54 | if(this.getFreeAmount() != unit.getFreeAmount()) return false; |
---|
55 | if(this.getUsedAmount() != unit.getUsedAmount()) return false; |
---|
56 | return true; |
---|
57 | } else { |
---|
58 | return false; |
---|
59 | } |
---|
60 | } |
---|
61 | |
---|
62 | public Object clone(){ |
---|
63 | Object obj = null; |
---|
64 | try { |
---|
65 | obj = super.clone(); |
---|
66 | } catch (CloneNotSupportedException e) { |
---|
67 | e.printStackTrace(); |
---|
68 | } |
---|
69 | return obj; |
---|
70 | } |
---|
71 | |
---|
72 | public void reset(){}; |
---|
73 | |
---|
74 | public void init(Parameters parameters){ |
---|
75 | |
---|
76 | } |
---|
77 | |
---|
78 | public ResourceUnitProvisioner getProvisioner() { |
---|
79 | return provisioner; |
---|
80 | } |
---|
81 | |
---|
82 | public Parameters getParameters(){ |
---|
83 | return null; |
---|
84 | } |
---|
85 | |
---|
86 | class SimpleResourceUnitProvisioner implements ResourceUnitProvisioner{ |
---|
87 | |
---|
88 | protected ResourceUnit primaryUnit; |
---|
89 | protected ResourceUnitState state; |
---|
90 | protected int pending; |
---|
91 | |
---|
92 | public SimpleResourceUnitProvisioner (ResourceUnit primaryUnit, ResourceUnitState state, int pending) { |
---|
93 | this.primaryUnit = primaryUnit; |
---|
94 | this.state = state; |
---|
95 | this.pending = pending; |
---|
96 | } |
---|
97 | |
---|
98 | public ResourceUnitState getState() { |
---|
99 | return state; |
---|
100 | } |
---|
101 | |
---|
102 | public void setState(ResourceUnitState newState) { |
---|
103 | |
---|
104 | if(newState == ResourceUnitState.FREE){ |
---|
105 | primaryUnit.setUsedAmount(primaryUnit.getUsedAmount() - getAmount()); |
---|
106 | } else if(newState == ResourceUnitState.PENDING){ |
---|
107 | primaryUnit.getProvisioner().setPending(primaryUnit.getProvisioner().getPending() + getAmount()); |
---|
108 | } else if(state == ResourceUnitState.PENDING && newState == ResourceUnitState.BUSY){ |
---|
109 | primaryUnit.getProvisioner().setPending(primaryUnit.getProvisioner().getPending() - getAmount()); |
---|
110 | primaryUnit.setUsedAmount(primaryUnit.getUsedAmount() + getAmount()); |
---|
111 | } else if(state == ResourceUnitState.FREE && newState == ResourceUnitState.BUSY){ |
---|
112 | primaryUnit.setUsedAmount(primaryUnit.getUsedAmount() + getAmount()); |
---|
113 | } |
---|
114 | state = newState; |
---|
115 | } |
---|
116 | |
---|
117 | public int getPending() { |
---|
118 | return pending; |
---|
119 | } |
---|
120 | |
---|
121 | public void setPending(int pending) { |
---|
122 | this.pending = pending; |
---|
123 | } |
---|
124 | |
---|
125 | } |
---|
126 | } |
---|