View Javadoc

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 }