/* * Copyright (C) 1999-2008 Jive Software. All rights reserved. * * 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.jivesoftware.xmpp.workgroup.utils; import java.beans.BeanDescriptor; import java.beans.BeanInfo; import java.beans.EventSetDescriptor; import java.beans.IntrospectionException; import java.beans.MethodDescriptor; import java.beans.PropertyDescriptor; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; import org.jivesoftware.util.JiveGlobals; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public abstract class WorkgroupBeanInfo implements BeanInfo { private static final Logger Log = LoggerFactory.getLogger(WorkgroupBeanInfo.class); private ResourceBundle bundle; public WorkgroupBeanInfo() { List<String> bundleNames = new ArrayList<String>(); String prefix = "bean_"; // fully qualified class name: bean_com.foo.MyClass.properties bundleNames.add(prefix + getClass().toString()); // just class name: bean_MyClass.properties bundleNames.add(prefix + getName().toString()); //Get the locale that should be used, then load the resource bundle. Locale currentLocale = JiveGlobals.getLocale(); for (int i = 0, n = bundleNames.size(); i < n; i++) { String name = bundleNames.get(i); try { // TODO - possibly use other class loaders? bundle = ResourceBundle.getBundle(name, currentLocale); break; } catch (Exception e) { // Ignore any exception when trying to load bundle. } } } /** * Returns the names of the properties of the bean that should be exposed. * * @return the names of the properties that should be exposed. */ public abstract String[] getPropertyNames(); /** * Returns the bean Class. * * @return the Class of the JavaBean that the BeanInfo is for. */ public abstract Class getBeanClass(); /** * Returns the name of the class that the bean info applies to (which * corresponds to the resource bundle that will be loaded). For example, * for the class <tt>com.foo.ExampleClass</tt>, the name would be * <tt>ExampleClass</tt>. * * @return the name of the JavaBean that the BeanInfo is for. */ public abstract String getName(); // BeanInfo Interface public BeanDescriptor getBeanDescriptor() { BeanDescriptor descriptor = new BeanDescriptor(getBeanClass()); try { // Attempt to load the name, displayName and shortDescription explicitly. try { String name = bundle.getString("name"); if (name != null) { descriptor.setName(name); } } catch (MissingResourceException ignored) { } // Get the name try { String displayName = bundle.getString("displayName"); if (displayName != null) { descriptor.setDisplayName(displayName); } } catch (MissingResourceException ignored) { } // Get the short description try { String shortDescription = bundle.getString("shortDescription"); if (shortDescription != null) { descriptor.setShortDescription(shortDescription); } } catch (MissingResourceException ignored) { } // Get a large description field try { String description = bundle.getString("description"); if (description != null) { descriptor.setValue("description", description); } } catch (MissingResourceException ignored) { } // Add any other properties that are specified. Enumeration<String> e = bundle.getKeys(); while (e.hasMoreElements()) { String key = e.nextElement(); try { String value = bundle.getString(key); if (value != null) { descriptor.setValue(key, value); } } catch (MissingResourceException ignored) { } } } catch (Exception e) { // Ignore any exceptions. We may get some if we try to load a // a property that doesn't appear in the resource bundle. } return descriptor; } public PropertyDescriptor[] getPropertyDescriptors() { Class beanClass = getBeanClass(); String[] properties = getPropertyNames(); PropertyDescriptor[] descriptors = new PropertyDescriptor[properties.length]; try { // For each property, create a property descriptor and set the // name and description using the localized data. for (int i = 0; i < descriptors.length; i++) { PropertyDescriptor newDescriptor = new PropertyDescriptor(properties[i], beanClass); if (bundle != null) { try { newDescriptor.setDisplayName(bundle.getString(properties[i] + ".displayName")); } catch (MissingResourceException ignored) { } try { newDescriptor.setShortDescription(bundle.getString(properties[i] + ".shortDescription")); } catch (MissingResourceException ignored) { } // Check to see if the property should be a large text field. This // is a hint to the GUI saying that a large text field should be // used to set this value. try { String largeText = bundle.getString(properties[i] + ".useLargeTextField"); if ("true".equals(largeText)) { newDescriptor.setValue("useLargeTextField", "true"); } } catch (MissingResourceException ignored) { } } descriptors[i] = newDescriptor; } return descriptors; } catch (IntrospectionException ie) { Log.error(ie.getMessage(), ie); throw new Error(ie.toString()); } } public int getDefaultPropertyIndex() { return -1; } public EventSetDescriptor[] getEventSetDescriptors() { return null; } public int getDefaultEventIndex() { return -1; } public MethodDescriptor[] getMethodDescriptors() { return null; } public BeanInfo[] getAdditionalBeanInfo() { return null; } public java.awt.Image getIcon(int iconKind) { return null; } }