001: /*
002: * Copyright 2002-2006 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.ui;
018:
019: import java.util.Collection;
020: import java.util.HashMap;
021: import java.util.Iterator;
022: import java.util.Map;
023:
024: import org.springframework.core.Conventions;
025: import org.springframework.util.Assert;
026:
027: /**
028: * Implementation of {@link java.util.Map} for use when building model data for use
029: * with UI tools. Supports chained calls and generation of model attribute names.
030: *
031: * <p>This class serves as generic model holder for both Servlet and Portlet MVC,
032: * but is tied to neither of those.
033: *
034: * @author Rob Harrop
035: * @since 2.0
036: * @see Conventions#getVariableName
037: * @see org.springframework.web.servlet.ModelAndView
038: * @see org.springframework.web.portlet.ModelAndView
039: */
040: public class ModelMap extends HashMap {
041:
042: /**
043: * Construct a new, empty <code>ModelMap</code>.
044: */
045: public ModelMap() {
046: }
047:
048: /**
049: * Construct a new <code>ModelMap</code> containing the supplied model object
050: * under the supplied name.
051: * @see #addObject(String, Object)
052: */
053: public ModelMap(String modelName, Object modelObject) {
054: addObject(modelName, modelObject);
055: }
056:
057: /**
058: * Construct a new <code>ModelMap</code> containing the supplied model object.
059: * Uses attribute name generation to generate the key for the supplied model
060: * object.
061: * @see #addObject(Object)
062: */
063: public ModelMap(Object modelObject) {
064: addObject(modelObject);
065: }
066:
067: /**
068: * Add the supplied <code>Object</code> under the supplied name.
069: * @param modelName the name of the model attribute (never <code>null</code>)
070: * @param modelObject the model attribute object (can be <code>null</code>)
071: */
072: public ModelMap addObject(String modelName, Object modelObject) {
073: Assert.notNull(modelName, "Model name must not be null");
074: this .put(modelName, modelObject);
075: return this ;
076: }
077:
078: /**
079: * Add the supplied <code>Object</code> to this <code>Map</code> used a
080: * {@link org.springframework.core.Conventions#getVariableName generated name}.
081: * <p/><emphasis>Note: Empty {@link Collection Collections} are not added to
082: * the model when using this method because we cannot correctly determine
083: * the true convention name. View code should check for <code>null</code> rather than
084: * for empty collections as is already done by JSTL tags</emphasis>.
085: * @param modelObject the model attribute object (never <code>null</code>)
086: */
087: public ModelMap addObject(Object modelObject) {
088: Assert.notNull(modelObject, "Model object must not be null");
089: if (modelObject instanceof Collection
090: && ((Collection) modelObject).isEmpty()) {
091: return this ;
092: }
093: return addObject(Conventions.getVariableName(modelObject),
094: modelObject);
095: }
096:
097: /**
098: * Copy all objects in the supplied <code>Map</code> into this <code>Map</code>.
099: */
100: public ModelMap addAllObjects(Map objects) {
101: if (objects != null) {
102: this .putAll(objects);
103: }
104: return this ;
105: }
106:
107: /**
108: * Copy all objects in the supplied <code>Collection</code> into this <code>Map</code>,
109: * using attribute name generation for each element.
110: * @see #addObject(Object)
111: */
112: public ModelMap addAllObjects(Collection objects) {
113: if (objects != null) {
114: for (Iterator it = objects.iterator(); it.hasNext();) {
115: addObject(it.next());
116: }
117: }
118: return this;
119: }
120:
121: }
|