KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectstyle > cayenne > graph > CompoundDiff


1 /* ====================================================================
2  *
3  * The ObjectStyle Group Software License, version 1.1
4  * ObjectStyle Group - http://objectstyle.org/
5  *
6  * Copyright (c) 2002-2005, Andrei (Andrus) Adamchik and individual authors
7  * of the software. All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  * notice, this list of conditions and the following disclaimer in
18  * the documentation and/or other materials provided with the
19  * distribution.
20  *
21  * 3. The end-user documentation included with the redistribution, if any,
22  * must include the following acknowlegement:
23  * "This product includes software developed by independent contributors
24  * and hosted on ObjectStyle Group web site (http://objectstyle.org/)."
25  * Alternately, this acknowlegement may appear in the software itself,
26  * if and wherever such third-party acknowlegements normally appear.
27  *
28  * 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse
29  * or promote products derived from this software without prior written
30  * permission. For written permission, email
31  * "andrus at objectstyle dot org".
32  *
33  * 5. Products derived from this software may not be called "ObjectStyle"
34  * or "Cayenne", nor may "ObjectStyle" or "Cayenne" appear in their
35  * names without prior written permission.
36  *
37  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40  * DISCLAIMED. IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
41  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48  * SUCH DAMAGE.
49  * ====================================================================
50  *
51  * This software consists of voluntary contributions made by many
52  * individuals and hosted on ObjectStyle Group web site. For more
53  * information on the ObjectStyle Group, please see
54  * <http://objectstyle.org/>.
55  */

56 package org.objectstyle.cayenne.graph;
57
58 import java.util.ArrayList JavaDoc;
59 import java.util.Collection JavaDoc;
60 import java.util.Collections JavaDoc;
61 import java.util.Iterator JavaDoc;
62 import java.util.List JavaDoc;
63 import java.util.ListIterator JavaDoc;
64
65 /**
66  * A GraphDiff that is a list of other GraphDiffs.
67  *
68  * @since 1.2
69  * @author Andrus Adamchik
70  */

71 public class CompoundDiff implements GraphDiff {
72
73     protected List JavaDoc diffs;
74
75     /**
76      * Creates an empty CompoundDiff instance.
77      */

78     public CompoundDiff() {
79     }
80
81     /**
82      * Creates CompoundDiff instance. Note that a List is not cloned in this constructor,
83      * so subsequent calls to add and addAll would modify the original list.
84      */

85     public CompoundDiff(List JavaDoc diffs) {
86         this.diffs = diffs;
87     }
88
89     /**
90      * Returns true if this diff has no other diffs or if all of its diffs are noops.
91      */

92     public boolean isNoop() {
93         if (diffs == null) {
94             return true;
95         }
96
97         Iterator JavaDoc it = diffs.iterator();
98         while (it.hasNext()) {
99             if (!((GraphDiff) it.next()).isNoop()) {
100                 return false;
101             }
102         }
103
104         return true;
105     }
106
107     public List JavaDoc getDiffs() {
108         return (diffs != null)
109                 ? Collections.unmodifiableList(diffs)
110                 : Collections.EMPTY_LIST;
111     }
112
113     public void add(GraphDiff diff) {
114         nonNullDiffs().add(diff);
115     }
116
117     public void addAll(Collection JavaDoc diffs) {
118         nonNullDiffs().addAll(diffs);
119     }
120
121     /**
122      * Iterates over diffs list, calling "apply" on each individual diff.
123      */

124     public void apply(GraphChangeHandler tracker) {
125         if (diffs == null) {
126             return;
127         }
128
129         // implements a naive linear commit - simply replay stored operations
130
Iterator JavaDoc it = diffs.iterator();
131         while (it.hasNext()) {
132             GraphDiff change = (GraphDiff) it.next();
133             change.apply(tracker);
134         }
135     }
136
137     /**
138      * Iterates over diffs list in reverse order, calling "apply" on each individual diff.
139      */

140     public void undo(GraphChangeHandler tracker) {
141         if (diffs == null) {
142             return;
143         }
144
145         ListIterator JavaDoc it = diffs.listIterator(diffs.size());
146         while (it.hasPrevious()) {
147             GraphDiff change = (GraphDiff) it.previous();
148             change.undo(tracker);
149         }
150     }
151
152     List JavaDoc nonNullDiffs() {
153         if (diffs == null) {
154             synchronized (this) {
155                 if (diffs == null) {
156                     diffs = new ArrayList JavaDoc();
157                 }
158             }
159         }
160
161         return diffs;
162     }
163 }
164
Popular Tags