/* * Copyright 2004 original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.extremecomponents.table.core; import java.util.Collection; import java.util.Collections; import java.util.Map; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.extremecomponents.table.context.Context; import org.extremecomponents.util.ExtremeUtils; /** * @author Jeff Johnston */ public class RetrievalUtils { private static Log logger = LogFactory.getLog(RetrievalUtils.class); /** * @see #retrieve(Context, Object, String) */ public static Object retrieve(Context context, String name) { return retrieve(context, name, null); } /** * Look in the specified servlet scope for the Object. If the scope is null * look through the scopes in order (page, request, session, and * application). */ public static Object retrieve(Context context, String name, String scope) { if (StringUtils.isNotBlank(scope)) { if (scope.equalsIgnoreCase(TableConstants.PAGE_SCOPE)) { return context.getPageAttribute(name); } else if (scope.equalsIgnoreCase(TableConstants.REQUEST_SCOPE)) { return context.getRequestAttribute(name); } else if (scope.equalsIgnoreCase(TableConstants.SESSION_SCOPE)) { return context.getSessionAttribute(name); } else if (scope.equalsIgnoreCase(TableConstants.APPLICATION_SCOPE)) { return context.getApplicationAttribute(name); } } Object value = context.getPageAttribute(name); if (value == null) { value = context.getRequestAttribute(name); } if (value == null) { value = context.getSessionAttribute(name); } if (value == null) { value = context.getApplicationAttribute(name); } return value; } /** * @see #retrieveCollection(Context, Object, String) */ public static Collection retrieveCollection(Context context, Object collection) throws Exception { return retrieveCollection(context, collection, null); } /** * If the collection variable passed in is in fact a Collection then just * return it. If it is a Map then return the Map values. * * If it is a String then look in the specified servlet scope for the * Collection. If the scope is null look through the scopes in order (page, * request, session, and application). * * If the collection variable is specified with a dot (.) notation then will * look for a nested collection. For example foo.values will first look for * an object called foo in the various servlet scopes (as described above). * Once it finds it then it will look for an attribute called values, which * is assumed to be a Collection. * * @param collection Either a String or Object that will represent the Collection. * @return A Collection. */ public static Collection retrieveCollection(Context context, Object collection, String scope) throws Exception { if (collection instanceof Collection) { return (Collection) collection; } else if (collection instanceof Map) { return ((Map) collection).values(); } else if (collection instanceof String) { return retrieveCollectionFromScope(context, String.valueOf(collection), scope); } else { if (logger.isDebugEnabled()) { logger.debug("Could not find the Collection."); } return Collections.EMPTY_LIST; } } static Collection retrieveCollectionFromScope(Context context, String collection, String scope) throws Exception { Collection results = null; if (StringUtils.isBlank(collection) || "null".equals(collection)) { if (logger.isDebugEnabled()) { logger.debug("The collection is not defined."); } return Collections.EMPTY_LIST; } if (StringUtils.contains(collection, ".")) { results = retrieveNestedCollection(context, collection, scope); } else { results = retrieveCollectionAsObject(context, collection, scope); } if (results == null) { if (logger.isDebugEnabled()) { logger.debug("Could not find the Collection."); } return Collections.EMPTY_LIST; } return results; } static Collection retrieveNestedCollection(Context context, String collection, String scope) throws Exception { String split[] = StringUtils.split(collection, "."); Object obj = RetrievalUtils.retrieve(context, split[0], scope); String collectionToFind = StringUtils.substringAfter(collection, "."); if (ExtremeUtils.isBeanPropertyReadable(obj, collectionToFind)) { obj = PropertyUtils.getProperty(obj, collectionToFind); } if (!(obj instanceof Collection)) { if (logger.isDebugEnabled()) { logger.debug("The object is not of type Collection."); } return Collections.EMPTY_LIST; } return (Collection) obj; } static Collection retrieveCollectionAsObject(Context context, String collection, String scope) throws Exception { Object obj = RetrievalUtils.retrieve(context, collection, scope); if (obj instanceof Collection) { return (Collection) obj; } else if (obj instanceof Map) { return ((Map) obj).values(); } else { if (logger.isDebugEnabled()) { logger.debug("The object is not of type Collection."); } return Collections.EMPTY_LIST; } } }