1 package org.apache.ojb.broker.util.collections;
2
3 /* Copyright 2003-2005 The Apache Software Foundation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 import org.apache.ojb.broker.PersistenceBroker;
19 import org.apache.ojb.broker.PersistenceBrokerException;
20 import org.apache.ojb.broker.metadata.ClassDescriptor;
21
22 import java.util.Iterator;
23 import java.util.Vector;
24
25 /**
26 * This is a collection that tracks removal and addition of elements.
27 * This tracking allow the PersistenceBroker to delete elements from
28 * the database that have been removed from the collection before a
29 * PB.store() orperation occurs.
30 * This will allow to use the PB api in way pretty close to ODMG persistent
31 * collections!
32 * @author Thomas Mahler
33 * @version $Id: RemovalAwareCollection.java,v 1.1 2007-08-24 22:17:39 ewestfal Exp $
34 */
35 public class RemovalAwareCollection extends ManageableVector implements IRemovalAwareCollection
36 {
37 private Vector allObjectsToBeRemoved = new Vector();
38
39 /**
40 * @see org.apache.ojb.broker.ManageableCollection#afterStore(PersistenceBroker broker)
41 */
42 public void afterStore(PersistenceBroker broker) throws PersistenceBrokerException
43 {
44 // make sure allObjectsToBeRemoved does not contain
45 // any instances that got re-added to the list
46 allObjectsToBeRemoved.removeAll(this);
47
48 Iterator iter = allObjectsToBeRemoved.iterator();
49 while (iter.hasNext())
50 {
51 Object obj = iter.next();
52 ClassDescriptor cld = broker.getClassDescriptor(obj.getClass());
53 if (broker.serviceBrokerHelper().assertValidPkForDelete(cld, obj))
54 {
55 broker.delete(obj);
56 }
57 }
58 allObjectsToBeRemoved.clear();
59 }
60
61 /**
62 * @see java.util.List#remove(int)
63 */
64 public Object remove(int index)
65 {
66 Object toBeRemoved = super.remove(index);
67 registerForDeletion(toBeRemoved);
68 return toBeRemoved;
69 }
70
71 protected void registerForDeletion(Object toBeRemoved)
72 {
73 //only add objects once to avoid double deletions
74 if (!allObjectsToBeRemoved.contains(toBeRemoved))
75 {
76 this.allObjectsToBeRemoved.add(toBeRemoved);
77 }
78 }
79
80 /**
81 * @see java.util.Collection#remove(Object)
82 */
83 public boolean remove(Object o)
84 {
85 boolean result = super.remove(o);
86 registerForDeletion(o);
87 return result;
88 }
89
90 /**
91 * @see java.util.Vector#clear()
92 */
93 public synchronized void clear()
94 {
95 removeAllElements();
96 }
97
98 /**
99 * @see java.util.Vector#removeAllElements()
100 */
101 public synchronized void removeAllElements()
102 {
103 for (int i = 0; i < this.size(); i++)
104 {
105 registerForDeletion(this.get(i));
106 }
107 super.removeAllElements();
108 }
109
110
111 /**
112 * @see java.util.Vector#removeElementAt(int)
113 */
114 public synchronized void removeElementAt(int index)
115 {
116 Object toBeDeleted = this.get(index);
117 registerForDeletion(toBeDeleted);
118 super.removeElementAt(index);
119 }
120
121 /**
122 * @see java.util.AbstractList#removeRange(int, int)
123 */
124 protected void removeRange(int fromIndex, int toIndex)
125 {
126 for (int i = fromIndex; i < toIndex; i++)
127 {
128 registerForDeletion(this.get(i));
129 }
130 super.removeRange(fromIndex, toIndex);
131 }
132
133 }