1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
/**************************************************************************
* AssignItemToSlot
*
* $Workfile$
* $Revision: 1.8 $
* $Date: 2004/10/21 08:02:19 $
*
* Copyright (C) 2001 CERN - European Organization for Nuclear Research
* All rights reserved.
**************************************************************************/
package com.c2kernel.lifecycle.instance.predefined;
import java.util.Arrays;
import com.c2kernel.collection.Collection;
import com.c2kernel.collection.CollectionMember;
import com.c2kernel.collection.MembershipException;
import com.c2kernel.common.InvalidDataException;
import com.c2kernel.common.ObjectNotFoundException;
import com.c2kernel.lookup.AgentPath;
import com.c2kernel.lookup.ItemPath;
import com.c2kernel.persistency.ClusterStorage;
import com.c2kernel.persistency.ClusterStorageException;
import com.c2kernel.process.Gateway;
import com.c2kernel.utils.Logger;
/**************************************************************************
*
* @author $Author: abranson $ $Date: 2004/10/21 08:02:19 $
* @version $Revision: 1.8 $
**************************************************************************/
public class RemoveSlotFromCollection extends PredefinedStep
{
/**************************************************************************
* Constructor for Castor
**************************************************************************/
public RemoveSlotFromCollection()
{
super();
}
/**
* Params:
* 0 - collection name
* 1 - slot number OR if null:
* 2 - target entity key
*/
@Override
protected String runActivityLogic(AgentPath agent, ItemPath item,
int transitionID, String requestData) throws InvalidDataException {
String collName;
int slotNo = -1;
ItemPath currentChild = null;
Collection<? extends CollectionMember> coll;
// extract parameters
String[] params = getDataList(requestData);
if (Logger.doLog(3)) Logger.msg(3, "RemoveSlotFromCollection: called by "+agent+" on "+item+" with parameters "+Arrays.toString(params));
try {
collName = params[0];
if (params.length>1 && params[1].length()>0) slotNo = Integer.parseInt(params[1]);
if (params.length>2 && params[2].length()>0) currentChild = new ItemPath(params[2]);
} catch (Exception e) {
throw new InvalidDataException("RemoveSlotFromCollection: Invalid parameters "+Arrays.toString(params), "");
}
if (slotNo == -1 && currentChild == null)
throw new InvalidDataException("RemoveSlotFromCollection: Must give either slot number or entity key", "");
// load collection
try {
coll = (Collection<? extends CollectionMember>)Gateway.getStorage().get(item, ClusterStorage.COLLECTION+"/"+collName, null);
} catch (ObjectNotFoundException ex) {
throw new InvalidDataException("RemoveSlotFromCollection: Collection '"+collName+"' not found in this Item", "");
} catch (ClusterStorageException ex) {
Logger.error(ex);
throw new InvalidDataException("RemoveSlotFromCollection: Error loading collection '\"+collName+\"': "+ex.getMessage(), "");
}
// check the slot is there if it's given by id
CollectionMember slot = null;
if (slotNo > -1) {
try {
slot = coll.getMember(slotNo);
} catch (ObjectNotFoundException e) {
throw new InvalidDataException("RemoveSlotFromCollection: Slot "+slotNo+" not found in this collection", "");
}
}
// if both parameters are supplied, check the given item is actually in that slot
if (slot != null && currentChild != null && !slot.getItemPath().equals(currentChild)) {
throw new InvalidDataException("RemoveSlotFromCollection: Item "+currentChild+" was not in slot "+slotNo, "");
}
if (slotNo == -1) { // find slot from entity key
for (CollectionMember member : coll.getMembers().list) {
if (member.getItemPath().equals(currentChild)) {
slotNo = member.getID();
break;
}
}
}
if (slotNo == -1) {
throw new InvalidDataException("No match", "");
}
// Remove the slot
try {
coll.removeMember(slotNo);
} catch (MembershipException e) {
throw new InvalidDataException(e.getMessage(), "");
}
// Store the collection
try {
Gateway.getStorage().put(item, coll, null);
} catch (ClusterStorageException e) {
Logger.error(e);
throw new InvalidDataException("Error storing collection", "");
}
return requestData;
}
}
|