1 /**
2 * Copyright 2010 The Kuali Foundation Licensed under the
3 * Educational Community License, Version 2.0 (the "License"); you may
4 * not use this file except in compliance with the License. You may
5 * obtain a copy of the License at
6 *
7 * http://www.osedu.org/licenses/ECL-2.0
8 *
9 * Unless required by applicable law or agreed to in writing,
10 * software distributed under the License is distributed on an "AS IS"
11 * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12 * or implied. See the License for the specific language governing
13 * permissions and limitations under the License.
14 */
15
16 package org.kuali.student.common.ui.client.mvc;
17
18 import java.util.ArrayList;
19 import java.util.Collection;
20 import java.util.Collections;
21 import java.util.HashMap;
22 import java.util.Map;
23
24 import org.kuali.student.common.dto.Idable;
25 import org.kuali.student.common.ui.client.mvc.ModelChangeEvent.Action;
26
27 import com.google.gwt.event.shared.HandlerManager;
28 import com.google.gwt.event.shared.HandlerRegistration;
29
30 /**
31 * Model object used as a container for the model state. Sources ModelChangeEvents used for tracking the model state.
32 *
33 * @author Kuali Student Team
34 * @param <T>
35 * the type of model object to be contained within the model
36 */
37 public class CollectionModel<T> implements Model {
38 private Map<String, T> data = new HashMap<String, T>();
39 private HandlerManager handlers = new HandlerManager(this);
40
41 private T value = null;
42 /**
43 * Adds an object to the model, and fires a ModelChangeEvent
44 * @param object
45 */
46 public void add(T object) {
47 if (object instanceof Idable){
48 data.put(((Idable)object).getId(), object);
49 handlers.fireEvent(new CollectionModelChangeEvent<T>(Action.ADD, this, object));
50 }
51 }
52
53 /**
54 * Removes the specified model object from the model
55 *
56 * @param object
57 * @return the object that was removed, or null if not found
58 * @deprecated should use new Data structures instead, accessed via getValue, setValue
59 */
60 public T remove(T object) {
61 if (object instanceof Idable){
62 T result = data.remove(((Idable)object).getId());
63 if (result != null) {
64 handlers.fireEvent(new CollectionModelChangeEvent<T>(Action.REMOVE, this, result));
65 }
66 return result;
67 } else {
68 return null;
69 }
70 }
71
72 /**
73 * Adds a ModelChangeHandler that will be invoked for ModelChangeEvents
74 *
75 * @param handler
76 * the handler to add
77 * @return HandlerRegistration that can be used to unregister the handler later
78 */
79 @Override
80 public HandlerRegistration addModelChangeHandler(ModelChangeHandler handler) {
81 return handlers.addHandler(ModelChangeEvent.TYPE, handler);
82 }
83
84 /**
85 * Returns an unsorted, umodifiable collection of the values contained within the model.
86 *
87 * @return an unsorted, umodifiable collection of the values contained within the model.
88 */
89 public Collection<T> getValues() {
90 return Collections.unmodifiableList(new ArrayList<T>(data.values()));
91 }
92
93
94 /**
95 * Returns the Model's value
96 * Going forward, the Model class should primarily be used with a single DataModel instance for use with the configurable UI framework.
97 * @return the Model's value
98 */
99 public T getValue() {
100 return value;
101 }
102
103 /**
104 * Sets the Model's value
105 * Going forward, the Model class should primarily be used with a single DataModel instance for use with the configurable UI framework.
106 * @param value the new value
107 */
108 public void setValue(T value) {
109 this.value = value;
110 handlers.fireEvent(new CollectionModelChangeEvent<T>(Action.RELOAD, this, value));
111 }
112
113
114
115 }