/[xulu]/trunk/src/appl/parallel/spmd/MultiDataObject.java
ViewVC logotype

Contents of /trunk/src/appl/parallel/spmd/MultiDataObject.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2 - (show annotations)
Wed Feb 25 11:54:01 2009 UTC (15 years, 9 months ago) by mojays
File size: 6033 byte(s)
First Commit, corresponds to Revision 1008 of Wikisquare-SVN 
1 package appl.parallel.spmd;
2
3 import java.rmi.RemoteException;
4
5 import org.apache.log4j.LogManager;
6 import org.apache.log4j.Logger;
7
8 import schmitzm.data.WritableGrid;
9
10 import edu.bonn.xulu.plugin.data.grid.MultiGrid;
11
12 import appl.parallel.client.DataServer;
13 import appl.parallel.server.PartitionDataServer;
14 import appl.parallel.spmd.split.DataPartition;
15
16 /**
17 * A multi data object stores multiple elements of the same type.
18 * While the related {@link MultiDataInfo} stores only Information about
19 * multi-data and is used by Xulu / V for transfer of metadata, this class
20 * is a actual user object. The user can retrieve a multidata object e.g. via the
21 * {@link SPMDServerController} and work with it (e.g. add elements)
22 *
23 * @see SPMDServerInterface#getMultiData(String)
24 * @see MultiDataInfo
25 *
26 * @author Dominik Appl
27 **/
28
29 public class MultiDataObject {
30
31 private final Logger LOG = LogManager.getLogger(this.getClass().getName());
32
33 private final MultiDataInfo multiDataInfo;
34
35 private final DataServer dataServer;
36
37 private MultiGrid managedGrid = null;
38
39 /**
40 * Construct a new Multidata object
41 *
42 * @param info a {@link MultiDataInfo} object with the identification of the objects
43 * @param dataServer a dataServer which is responsible for the actual loading of the data
44 */
45 public MultiDataObject(MultiDataInfo info, DataServer dataServer) {
46 this.multiDataInfo = info;
47 this.dataServer = dataServer;
48 }
49
50 /**
51 * @param idx the position of the element
52 * @return the element at the indicated position
53 */
54 public Object getElement(int idx) {
55 try {
56 checkIndex(idx);
57 return dataServer.getData(multiDataInfo.getMultiID(idx));
58 } catch (RemoteException e) {
59 LOG.error("RemoteExeception while retrieving data with ID "
60 + multiDataInfo.getMultiID(idx)
61 + " from PartitionDataServer");
62 }
63 return null;
64 }
65
66 /**
67 * checks whether the indicated index is valid
68 * @throws ArrayIndexOutOfBoundsException if idx is below zero or higher than number of elements
69 */
70 private void checkIndex(int idx) {
71 if ((idx > multiDataInfo.getCount() - 1) || idx <0 )
72 throw new ArrayIndexOutOfBoundsException("The Element with index "
73 + idx + " was requested, but the MultiDataObject has only "
74 + multiDataInfo.getCount() + " elements.");
75
76 }
77
78 /**
79 * @return the number of elements in the multidataobject
80 */
81 public int getCount() {
82 return multiDataInfo.getCount();
83 }
84
85 /**
86 * Adds an element to MultiDataObjects. Method should be thread safe.
87 *
88 * @return the index of the new element
89 */
90 public synchronized int addElement() {
91 //the new ID of the MultiDataObject is generated by making
92 //the first id negative and than subtracting the index from
93 //the ID
94 int idx = multiDataInfo.getCount() - 1;
95 try {
96 if (idx == -1)
97 throw new UnsupportedOperationException(
98 "The MultiDataInfo must have at least one element!");
99 //simply get the first element and create a empty one.
100 int firstElementID = multiDataInfo.getMultiID(0);
101 DataPartition firstElement = dataServer.getData(firstElementID);
102 //generate a new id by making the first ID negative and subtracting the index value
103 int newID = multiDataInfo.getNewIDForIndex(idx + 1);
104 //there is a rare chance of colliding with existing ids:
105 while (dataServer.getData(newID) != null) {
106 newID--;
107 }
108 //create new element
109 DataPartition newElement = firstElement.getEmpty(newID);
110 multiDataInfo.addElement(newID);
111 //add the element to the dataServer and to the managed MultiGrid (if any)
112 dataServer.addData(newElement);
113 if (managedGrid != null)
114 managedGrid.addGrid((WritableGrid) newElement);
115 return idx + 1;
116 } catch (RemoteException e) {
117 LOG
118 .error("RemoteExeception while trying to add a new element with idx "
119 + idx + " to MultiData");
120 }
121 return 0;
122 }
123
124 /**
125 * Adds an element with the specified ID.
126 *
127 * @param id the id of the element to add
128 * @return the index of the new element or 0 if an error occurred
129 */
130 public int addElement(int id) {
131 //actual maxIndex
132 int idx = multiDataInfo.getCount() - 1;
133 try {
134 if (idx == -1)
135 throw new UnsupportedOperationException(
136 "The MultiDataInfo must have at least one element!");
137 //simply get the first element and create a empty one.
138 int firstElementID = multiDataInfo.getMultiID(0);
139 DataPartition firstElement = dataServer.getData(firstElementID);
140
141 //create new element
142 DataPartition newElement = firstElement.getEmpty(id);
143 multiDataInfo.addElement(id);
144 //add the element to the dataServer and to the managed MultiGrid (if any)
145 dataServer.addData(newElement);
146 if (managedGrid != null)
147 managedGrid.addGrid((WritableGrid) newElement);
148 return idx + 1;
149 } catch (RemoteException e) {
150 LOG
151 .error("RemoteExeception while trying to add a new element with idx "
152 + idx + " to MultiData");
153 }
154 return 0;
155 }
156
157 /**
158 * Manages a multigrid, which means that when a new element is added
159 * to the multiObject, then the same element is also added to
160 * the managed multiGrid.
161 *
162 * @param toManageMultiGrid the grid to be managed. Only one grid will be
163 * managed at a time.
164 *
165 */
166 public void setManagedGrid(MultiGrid toManageMultiGrid) {
167 this.managedGrid = toManageMultiGrid;
168 }
169
170 /**
171 * @return the encapsulted {@link MultiDataInfo}
172 */
173 public MultiDataInfo getMultiInfo() {
174 return this.multiDataInfo;
175 }
176
177 public String getName() {
178 return multiDataInfo.getName();
179 }
180
181 /**
182 * removes the element with the specified index from the dataServer
183 *
184 * @param idx the element
185 */
186 public void deleteElement(int idx) {
187 checkIndex(idx);
188 try {
189 dataServer.removeData(multiDataInfo.getMultiID(idx));
190 } catch (RemoteException e) {
191 LOG.error("Could not reach DataServer" , e);
192 e.printStackTrace();
193 }
194 }
195 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26