1 |
mojays |
2 |
package appl.parallel.data; |
2 |
|
|
|
3 |
|
|
import java.awt.Rectangle; |
4 |
|
|
import java.io.IOException; |
5 |
|
|
import java.io.Serializable; |
6 |
|
|
|
7 |
|
|
import org.apache.log4j.LogManager; |
8 |
|
|
import org.apache.log4j.Logger; |
9 |
|
|
|
10 |
|
|
import appl.data.LoadingException; |
11 |
|
|
import appl.parallel.client.ClientDataServer; |
12 |
|
|
import appl.parallel.spmd.split.DataPartition; |
13 |
|
|
import appl.parallel.spmd.split.SplittableResource; |
14 |
|
|
|
15 |
|
|
/** |
16 |
|
|
* This class is used as a base class for loaders. It is especially intended for |
17 |
|
|
* use with the SPMD-Paradigm, but may be used with other loaders, too. It |
18 |
|
|
* implements the reusable stuff of the {@link PartitionDataHandler} Interface. |
19 |
|
|
* Notice that each loader is responsible for exactly one data element. It must |
20 |
|
|
* be {@link Cloneable}, so that multi-data elements can add another element. |
21 |
|
|
* |
22 |
|
|
* @author Dominik Appl |
23 |
|
|
*/ |
24 |
|
|
public abstract class AbstractDataHandler implements PartitionDataHandler { |
25 |
|
|
|
26 |
|
|
protected transient Logger LOG = LogManager.getLogger(this.getClass() |
27 |
|
|
.getName()); |
28 |
|
|
|
29 |
|
|
/** |
30 |
|
|
* The id of the currently handled {@link SplittableResource} |
31 |
|
|
*/ |
32 |
|
|
protected int rootID; |
33 |
|
|
|
34 |
|
|
/** |
35 |
|
|
* The partition bounds (the whole bounds) of the current |
36 |
|
|
* {@link SplittableResource} |
37 |
|
|
*/ |
38 |
|
|
protected Rectangle partitionBounds; |
39 |
|
|
|
40 |
|
|
/** |
41 |
|
|
* the currently handled data (must be initialized before calling |
42 |
|
|
* {@link #unload()} |
43 |
|
|
*/ |
44 |
|
|
protected transient DataPartition data; |
45 |
|
|
|
46 |
|
|
/** |
47 |
|
|
* The unload bounds differ may differ from the partitionBounds. If there is |
48 |
|
|
* a neighborhood region it is important, that only the core-region (without |
49 |
|
|
* the neighborhood) is unloaded. |
50 |
|
|
*/ |
51 |
|
|
protected Rectangle unloadBounds; |
52 |
|
|
|
53 |
|
|
/** |
54 |
|
|
* A {@link ClientDataServer} may be used locally for faster access. |
55 |
|
|
*/ |
56 |
|
|
protected transient ClientDataServer spmdClient; |
57 |
|
|
|
58 |
|
|
/** |
59 |
|
|
* Constructs a new {@link AbstractDataHandler}. The local IP address at |
60 |
|
|
* the time of construction is later used on serverside for communication |
61 |
|
|
* (e.g. unloading). |
62 |
|
|
* |
63 |
|
|
* @param rootID |
64 |
|
|
* the id of the data |
65 |
|
|
* @param client |
66 |
|
|
* a {@link ClientDataServer} which may be used to get meta |
67 |
|
|
* information on client side before transferring the loader to |
68 |
|
|
* its destination |
69 |
|
|
* @param partitionBounds |
70 |
|
|
* the bounds of the partition to be retrieved on server side |
71 |
|
|
* @param unloadBounds |
72 |
|
|
* the bounds of the partition which is to be uploaded to the |
73 |
|
|
* client after calculation (may only be the calculation area) |
74 |
|
|
*/ |
75 |
|
|
public AbstractDataHandler(int rootID, ClientDataServer client, |
76 |
|
|
Rectangle partitionBounds, Rectangle unloadBounds) { |
77 |
|
|
this.spmdClient = client; |
78 |
|
|
this.rootID = rootID; |
79 |
|
|
this.partitionBounds = partitionBounds; |
80 |
|
|
this.unloadBounds = unloadBounds; |
81 |
|
|
} |
82 |
|
|
|
83 |
|
|
/** |
84 |
|
|
* sets a local {@link ClientDataServer} which MAY be used by the handler |
85 |
|
|
* for local access |
86 |
|
|
* |
87 |
|
|
* @param localSPMDClient |
88 |
|
|
*/ |
89 |
|
|
public void setSPMDClient(ClientDataServer localSPMDClient) { |
90 |
|
|
this.spmdClient = localSPMDClient; |
91 |
|
|
} |
92 |
|
|
|
93 |
|
|
/** |
94 |
|
|
* (empty constructors are important for deserialization) |
95 |
|
|
* |
96 |
|
|
* @see #AbstractDataHandler(int, ClientDataServer, Rectangle, Rectangle) |
97 |
|
|
*/ |
98 |
|
|
public AbstractDataHandler() { |
99 |
|
|
this(-1, null, new Rectangle(0, 0, 0, 0), new Rectangle(0, 0, 0, 0)); |
100 |
|
|
} |
101 |
|
|
|
102 |
|
|
/* |
103 |
|
|
* (non-Javadoc) |
104 |
|
|
* |
105 |
|
|
* @see appl.data.DataLoader#getLoadInfo() |
106 |
|
|
*/ |
107 |
|
|
public abstract String getLoadInfo(); |
108 |
|
|
|
109 |
|
|
/* |
110 |
|
|
* (non-Javadoc) |
111 |
|
|
* |
112 |
|
|
* @see appl.data.DataLoader#getLoadInfo() |
113 |
|
|
*/ |
114 |
|
|
public abstract String getUnloadInfo(); |
115 |
|
|
|
116 |
|
|
/* |
117 |
|
|
* (non-Javadoc) |
118 |
|
|
* |
119 |
|
|
* @see appl.data.DataLoader#load() |
120 |
|
|
*/ |
121 |
|
|
public abstract DataPartition load() throws LoadingException; |
122 |
|
|
|
123 |
|
|
/** |
124 |
|
|
* Initializes the {@link Logger} after deserialization (used by |
125 |
|
|
* {@link java.io.Serializable}) |
126 |
|
|
* |
127 |
|
|
* @throws IOException |
128 |
|
|
* @see Serializable |
129 |
|
|
*/ |
130 |
|
|
private synchronized void readObject(java.io.ObjectInputStream s) |
131 |
|
|
throws IOException, ClassNotFoundException { |
132 |
|
|
// reading standard fields |
133 |
|
|
s.defaultReadObject(); |
134 |
|
|
// initialize Logger |
135 |
|
|
LOG = LogManager.getLogger(this.getClass().getName()); |
136 |
|
|
} |
137 |
|
|
|
138 |
|
|
/* |
139 |
|
|
* (non-Javadoc) |
140 |
|
|
* |
141 |
|
|
* @see appl.data.PartitionDataHandler#setUnloadPartition(java.awt.Rectangle) |
142 |
|
|
*/ |
143 |
|
|
public void setUnloadBounds(Rectangle unloadBounds) { |
144 |
|
|
this.unloadBounds = unloadBounds; |
145 |
|
|
} |
146 |
|
|
|
147 |
|
|
/* |
148 |
|
|
* (non-Javadoc) |
149 |
|
|
* |
150 |
|
|
* @see appl.data.PartitionDataHandler#setBasePartition(appl.parallel.spmd.split.DataPartition) |
151 |
|
|
*/ |
152 |
|
|
public void setBasePartition(DataPartition data) { |
153 |
|
|
this.data = data; |
154 |
|
|
} |
155 |
|
|
|
156 |
|
|
/* |
157 |
|
|
* (non-Javadoc) |
158 |
|
|
* |
159 |
|
|
* @see appl.data.DataUnloader#unload() |
160 |
|
|
*/ |
161 |
|
|
public abstract void unload(); |
162 |
|
|
|
163 |
|
|
/* |
164 |
|
|
* (non-Javadoc) |
165 |
|
|
* |
166 |
|
|
* @see appl.data.PartitionDataHandler#setRootID(int) |
167 |
|
|
*/ |
168 |
|
|
public void setRootID(int rootID) { |
169 |
|
|
this.rootID = rootID; |
170 |
|
|
} |
171 |
|
|
|
172 |
|
|
/* |
173 |
|
|
* (non-Javadoc) |
174 |
|
|
* |
175 |
|
|
* @see java.lang.Object#clone() |
176 |
|
|
*/ |
177 |
|
|
public PartitionDataHandler clone() { |
178 |
|
|
return newInstance(rootID, spmdClient, this.unloadBounds, |
179 |
|
|
this.partitionBounds); |
180 |
|
|
} |
181 |
|
|
|
182 |
|
|
} |