Project

General

Profile

« Previous | Next » 

Revision 6405

Add a CNReplicationTask class that will be submitted to the CN storage cluster when there are changes to the object store involving system metadata, science metadata, and resource maps. When a new entry is added to the hzSystemMetadata map, a new data, science metadata, or resource map was added to the VO, and all CN cluster members need to be updated with the object and it's system metadata. This task is executed on each CN to replicate the information. If the event is an update to an existing system metadata entry, it may only involve a change to system metadata, or may involve a change to science metadata as well. The task will return with the PID of the object replicated, be it a sysmeta, scimeta, or resource object. Locking of the PID will be handled by the task.

View differences:

src/edu/ucsb/nceas/metacat/dataone/CNReplicationTask.java
1
/**
2
 * This work was created by participants in the DataONE project, and is
3
 * jointly copyrighted by participating institutions in DataONE. For
4
 * more information on DataONE, see our web site at http://dataone.org.
5
 *
6
 *   Copyright ${year}
7
 *
8
 * Licensed under the Apache License, Version 2.0 (the "License");
9
 * you may not use this file except in compliance with the License.
10
 * You may obtain a copy of the License at
11
 *
12
 *   http://www.apache.org/licenses/LICENSE-2.0
13
 *
14
 * Unless required by applicable law or agreed to in writing, software
15
 * distributed under the License is distributed on an "AS IS" BASIS,
16
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
 * See the License for the specific language governing permissions and
18
 * limitations under the License.
19
 */
20

  
21
package edu.ucsb.nceas.metacat.dataone;
22

  
23
import java.io.Serializable;
24
import java.util.concurrent.Callable;
25

  
26
import org.dataone.client.D1Client;
27
import org.dataone.client.MNode;
28
import org.dataone.configuration.Settings;
29
import org.dataone.service.exceptions.InsufficientResources;
30
import org.dataone.service.exceptions.InvalidRequest;
31
import org.dataone.service.exceptions.NotAuthorized;
32
import org.dataone.service.exceptions.NotImplemented;
33
import org.dataone.service.exceptions.ServiceFailure;
34
import org.dataone.service.exceptions.UnsupportedType;
35
import org.dataone.service.types.v1.Identifier;
36
import org.dataone.service.types.v1.Node;
37
import org.dataone.service.types.v1.Permission;
38
import org.dataone.service.types.v1.Session;
39
import org.dataone.service.types.v1.Subject;
40
import org.dataone.service.types.v1.SystemMetadata;
41

  
42
import com.hazelcast.core.Hazelcast;
43
import com.hazelcast.core.HazelcastInstance;
44
import com.hazelcast.core.IMap;
45

  
46
/**
47
 * A single CN replication task to be executed by the CN Replication Service. This 
48
 * applies to replication of system metadata, science metadata, and resource maps 
49
 * across CNs.
50
 * 
51
 * The task is built when a change occurs in the hzSystemMetadata map in the
52
 * storage cluster initiated by Metacat for a given PID. If the change involves
53
 * only modifications to system metadata, those changes will occur in the shared
54
 * map and in the backing store of the member that owns the map entry. Other 
55
 * members must be updated using this task.  Likewise, changes to the system
56
 * metadata map that involve science metadata creation or changes will be
57
 * distributed to all members via this task.  The same is for OAI-ORE resource maps.
58
 * 
59
 * @author cjones
60
 *
61
 */
62
public class CNReplicationTask implements Serializable, Callable<String> {
63

  
64
  /* The identifier of this task */
65
  private String taskid;
66
  
67
  /* The identifier of the object to replicate */
68
  private String pid;
69
  
70
  /* The object format type stated in the system metadata (DATA/METADATA/RESOURCE) */
71
  private String formatType;
72
  
73
  /* The target Node object */
74
  private Node targetNode;
75
  
76
  /* The originating Node object */
77
  private Node originatingNode;
78

  
79
  /* The subject of the target node, extracted from the Node object */
80
  private String targetNodeSubject;
81
  
82
  /* The subject of the originating node, extracted from the Node object */
83
  private String originatingNodeSubject;
84
  
85
  /* The permission to be executed (in this case, always 'replicate') */
86
  String permission;
87

  
88
  /**
89
   * Constructor - create an empty replication task instance
90
   */
91
  public CNReplicationTask() {
92
  }
93

  
94
  /**
95
   * Constructor - create a replication task instance
96
   * 
97
   * @param taskid
98
   * @param pid
99
   * @param targetNode
100
   */
101
  public CNReplicationTask(String taskid, Identifier pid, String formatType,
102
    Node originatingNode, Node targetNode,
103
    Permission replicatePermission) {
104
    
105
    this.taskid = taskid;
106
    this.pid = pid.getValue();
107
    this.formatType = formatType;
108
    this.originatingNode = originatingNode;
109
    this.targetNode = targetNode;
110
    this.originatingNodeSubject = originatingNode.getSubject(0).getValue();
111
    this.targetNodeSubject = targetNode.getSubject(0).getValue();
112
    this.permission = replicatePermission.name();
113
    
114
  }
115

  
116
  /**
117
   * Get the task identifier for this task
118
   * @return the taskid
119
   */
120
  public String getTaskid() {
121
    return taskid;
122
  }
123

  
124
  /**
125
   * Set the task identifier for this task
126
   * @param taskid the taskid to set
127
   */
128
  public void setTaskid(String taskid) {
129
    this.taskid = taskid;
130
  }
131

  
132
  /**
133
   * Get the object identifier to be replicated
134
   * @return the pid
135
   */
136
  public Identifier getPid() {
137
    Identifier identifier = new Identifier();
138
    identifier.setValue(pid);
139
    return identifier;
140
  }
141

  
142
  /**
143
   * Set the object identifier to be replicated
144
   * @param pid the pid to set
145
   */
146
  public void setPid(Identifier pid) {
147
    this.pid = pid.getValue();
148
  }
149

  
150

  
151
  /**
152
   * Get the format type of the object to be replicated
153
   * @return the pid
154
   */
155
  public String getFormatType() {
156
    return this.formatType;
157
    
158
  }
159

  
160
  /**
161
   * Set the format type of the object to be replicated
162
   * @param pid the pid to set
163
   */
164
  public void setFormatType(String formatType) {
165
    this.formatType = formatType;
166
    
167
  }
168

  
169
  /**
170
   * Get the target node
171
   * @return the targetNode
172
   */
173
  public Node getTargetNode() {
174
    return targetNode;
175
  }
176

  
177
  /**
178
   * Set the target node
179
   * @param targetNode the targetNode to set
180
   */
181
  public void setTargetNode(Node targetNode) {
182
    this.targetNode = targetNode;
183
  }
184

  
185
  /**
186
   * Get the originating node
187
   * @return the originatingNode
188
   */
189
  public Node getOriginatingNode() {
190
    return originatingNode;
191
  }
192

  
193
  /**
194
   * Set the originating node
195
   * @param originatingNode the originatingNode to set
196
   */
197
  public void setOriginatingNode(Node originatingNode) {
198
    this.originatingNode = originatingNode;
199
  }
200

  
201
  /**
202
   * For the given Replication task, return the Subject listed in the target
203
   * node.  Usually used in authorizing a replication event.
204
   * 
205
   * @return subject - the subject listed in the target Node object as a string
206
   */
207
  public String getTargetNodeSubject() {
208
    
209
    return this.targetNodeSubject;
210
    
211
  }
212
  
213
  /**
214
   * Set the target node subject identifying the node
215
   * @param subject the targetNode subject
216
   */
217
  public void setTargetNodeSubject(String subject) {
218
    this.targetNodeSubject = subject;
219
  }
220
  
221
  /**
222
   * For the given Replication task, return the Subject listed in the target
223
   * node.  Usually used in authorizing a replication event.
224
   * 
225
   * @return subject - the subject listed in the target Node object as a string
226
   */
227
  public String getOriginatingNodeSubject() {
228
    
229
    return this.originatingNodeSubject;
230
    
231
  }
232
  
233
  /**
234
   * Set the target node subject identifying the node
235
   * @param subject the targetNode subject
236
   */
237
  public void setOriginatingNodeSubject(String subject) {
238
    this.originatingNodeSubject = subject;
239
  }
240
  
241
  /**
242
   * Get the permission being allowed for this task
243
   * 
244
   * @return subject - the subject listed in the target Node object
245
   */
246
  public String getPermission() {
247
    return this.permission;
248
    
249
  }
250
  
251
  /**
252
   * Set the permission being allowed for this task
253
   * @param subject the targetNode subject
254
   */
255
  public void setPermission(Permission permission) {
256
    this.permission = permission.name();
257
    
258
  }
259
 
260
  /**
261
   * Implement the Callable interface, providing code that initiates replication.
262
   * 
263
   * @return pid - the identifier of the replicated object upon success
264
   */
265
  public String call() {
266
		
267
	// Get the D1 Hazelcast configuration parameters
268
	String hzSystemMetadata = 
269
		Settings.getConfiguration().getString("dataone.hazelcast.systemMetadata");
270
	
271
	// get the system metadata for the pid	
272
	IMap<Identifier, SystemMetadata> sysMetaMap = Hazelcast.getMap(hzSystemMetadata);
273
	
274
	// TODO: Store the object in Metacat by calling the appropriate class
275
	    
276
	
277
    return null;
278
  }
279

  
280
}
0 281

  

Also available in: Unified diff