/* * Copyright: (c) 2004-2012 Mayo Foundation for Medical Education and * Research (MFMER). All rights reserved. MAYO, MAYO CLINIC, and the * triple-shield Mayo logo are trademarks and service marks of MFMER. * * Except as contained in the copyright notice above, or as used to identify * MFMER as the author of this software, the trade names, trademarks, service * marks, or product names of the copyright holder shall not be used in * advertising, promotion or otherwise in connection with this software without * prior written authorization of the copyright holder. * * 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 edu.mayo.cts2.framework.webapp.rest.view.jsp; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.WordUtils; import org.springframework.beans.BeanUtils; import edu.mayo.cts2.framework.model.core.DirectoryEntry; import edu.mayo.cts2.framework.model.core.ResourceDescriptionDirectoryEntry; import edu.mayo.cts2.framework.model.core.ResourceVersionDescriptionDirectoryEntry; import edu.mayo.cts2.framework.model.entity.EntityDirectoryEntry; import edu.mayo.cts2.framework.model.valuesetdefinition.ResolvedValueSetDirectoryEntry; /** * JSP tag lib for various bean introspection utilities. * * @author <a href="mailto:kevin.peterson@mayo.edu">Kevin Peterson</a> */ @SuppressWarnings( {"rawtypes", "unchecked"} ) public class Beans { private static final String HEADING_FIELD = "_heading"; private static final String ENTRY_LIST_FIELD = "_entryList"; private static final Comparator<Map.Entry<String, Object>> BEAN_COMPARATOR = new Comparator<Map.Entry<String, Object>>(){ @Override public int compare(Map.Entry<String, Object> val1, Map.Entry<String, Object> val2) { if(val1.getKey().equals(HEADING_FIELD) || !val1.getKey().equals(ENTRY_LIST_FIELD)){ return -1; } if(val2.getKey().equals(HEADING_FIELD) || !val2.getKey().equals(ENTRY_LIST_FIELD)){ return 1; } return 0; } }; /** * Should recurse. * * @param bean the bean * @return true, if successful */ public static boolean shouldRecurse(Object bean) { return !BeanUtils.isSimpleProperty(bean.getClass()) && !bean.getClass().isEnum(); } public static String capitalize(String string) { return WordUtils.capitalize(string); } public static Map summary(Object bean) { Map returnMap = new LinkedHashMap(); if(bean instanceof ResourceVersionDescriptionDirectoryEntry){ return returnSummary( buildSummary( ( ResourceVersionDescriptionDirectoryEntry ) bean, returnMap), bean); } if(bean instanceof ResourceDescriptionDirectoryEntry){ return returnSummary( buildSummary( ( ResourceDescriptionDirectoryEntry ) bean, returnMap), bean); } if(bean instanceof DirectoryEntry){ return returnSummary( buildSummary( ( DirectoryEntry ) bean, returnMap), bean); } if(bean instanceof ResolvedValueSetDirectoryEntry){ return returnSummary( buildSummary( (ResolvedValueSetDirectoryEntry) bean, returnMap), bean); } if(bean instanceof EntityDirectoryEntry){ return returnSummary( buildSummary( (EntityDirectoryEntry) bean, returnMap), bean); } throw new IllegalStateException("Unknown type of Directory Entry: " + bean.getClass().getName()); } private static Map returnSummary(Map summary, Object bean){ if(summary.isEmpty()){ summary.put("Entry", bean.getClass().getSimpleName()); } return summary; } private static Map buildSummary(EntityDirectoryEntry bean, Map returnMap) { returnMap.put("Namespace", bean.getName().getNamespace()); returnMap.put("Name", bean.getName().getName()); returnMap.put("About", bean.getAbout()); return returnMap; } private static Map buildSummary(ResourceVersionDescriptionDirectoryEntry bean, Map returnMap) { buildSummary( (ResourceDescriptionDirectoryEntry) bean, returnMap).put("Version", bean.getOfficialResourceVersionId()); return returnMap; } private static Map buildSummary(ResourceDescriptionDirectoryEntry bean, Map returnMap) { buildSummary( (DirectoryEntry) bean, returnMap).put("About", bean.getAbout()); return returnMap; } private static Map buildSummary(ResolvedValueSetDirectoryEntry bean, Map returnMap) { returnMap.put("Name", bean.getResourceName()); returnMap.put("URI", bean.getResolvedValueSetURI()); returnMap.put("Header", bean.getResolvedHeader()); return returnMap; } private static Map buildSummary(DirectoryEntry bean, Map returnMap) { String resourceName = bean.getResourceName(); if(StringUtils.isNotBlank(resourceName)){ returnMap.put("Name", bean.getResourceName()); } return returnMap; } /** * Inspect. * * @param bean the bean * @return the list */ public static List<Map.Entry<String, Object>> inspect(Object bean) { Map<String, Object> props = new LinkedHashMap<String, Object>(); Class<?> clazz = bean.getClass(); while(clazz != null){ for(Field field : clazz.getDeclaredFields()){ field.setAccessible(true); String name = field.getName(); Object value; try { value = field.get(bean); } catch (Exception e) { throw new RuntimeException(e); } if(value != null){ props.put(name, value); } } clazz = clazz.getSuperclass(); } List<Map.Entry<String, Object>> list = new ArrayList<Map.Entry<String, Object>>(props.entrySet()); Collections.sort(list, BEAN_COMPARATOR); return list; } }