blob: db10f847b6bd10bfa75d3f84e453e2033b20e184 [file] [log] [blame]
/*-
* Copyright (C) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
*
* This file was distributed by Oracle as part of a version of Oracle Berkeley
* DB Java Edition made available at:
*
* http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html
*
* Please see the LICENSE file included in the top-level directory of the
* appropriate version of Oracle Berkeley DB Java Edition for a copy of the
* license and additional information.
*/
package com.sleepycat.util;
import java.beans.BeanDescriptor;
import java.beans.EventSetDescriptor;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.beans.SimpleBeanInfo;
import java.lang.reflect.Method;
import java.util.ArrayList;
/*
* If someone add a property in some FooConfig.java,
* (1) If the setter/getter methods are setFoo/getFoo, the name of the
* property should be "foo", which means the first letter of the property
* name should be lower case.
* (2) The setter method for this property setProperty should return "this",
* and setPropertyVoid method which returns void value must be added.
* The return type of the getter method should be the same as the
* parameter of the setter method.
* (3) The setter method and getter method must be added into
* FooConfigBeanInfo;
* (4) If for some of the setter methods in the FooConfig.java, setterVoid
* methods are not necessary, then add the name of such setter methods
* into the ArrayList ignoreMethods within the corresponding
* FooConfigBeanInfo.getPropertyDescriptors method. For example,
* setMaxSeedTestHook method in DiskOrderedCursorConfig.java is only used
* for unit tests, so "setMaxSeedTestHook" is added into ignoreMethods
* list within DiskOrderedCursorConfigBeanInfo.getPropertyDescriptors.
*
*
* If someone adds a new FooConfig.java,
* (1) The definition of setter/getter mehods and the names of the properties
* should follow the rules described above.
* (2) There must be FooConfigBeanInfo.java. You can write it according to
* the current beaninfo classes.
* (3) "PackagePath.FooConfig" must be added into the unit test:
* com.sleepycat.je.ConfigBeanInfoTest.
*
* If someond remove an existing FooConfig.java, then "PackagePath.FooConfig"
* must be deleted in the unit test com.sleepycat.je.ConfigBeanInfoTest.
*/
public class ConfigBeanInfoBase extends SimpleBeanInfo {
private static java.awt.Image iconColor16 = null;
private static java.awt.Image iconColor32 = null;
private static java.awt.Image iconMono16 = null;
private static java.awt.Image iconMono32 = null;
private static String iconNameC16 = null;
private static String iconNameC32 = null;
private static String iconNameM16 = null;
private static String iconNameM32 = null;
private static final int defaultPropertyIndex = -1;
private static final int defaultEventIndex = -1;
protected static ArrayList<String> propertiesName = new ArrayList<String>();
protected static ArrayList<String>
getterAndSetterMethods = new ArrayList<String>();
protected static ArrayList<String> ignoreMethods = new ArrayList<String>();
/*
* Get the propertis' infomation, including all the properties's names
* and their getter/setter methods.
*/
protected static void getPropertiesInfo(Class cls) {
propertiesName.clear();
getterAndSetterMethods.clear();
try {
/* Get all of the public methods. */
ArrayList<String> allMethodNames = new ArrayList<String>();
Method[] methods = cls.getMethods();
for (int i = 0; i < methods.length; i++) {
allMethodNames.add(methods[i].getName());
}
for (int i = 0; i < allMethodNames.size(); i++) {
String name = allMethodNames.get(i);
String subName = name.substring(0, 3);
/* If it is a setter method. */
if (subName.equals("set")) {
if (isIgnoreMethods(name)) {
continue;
}
String propertyName = name.substring(3);
Method getterMethod = null;
try {
getterMethod = cls.getMethod("get" + propertyName);
} catch (NoSuchMethodException e) {
getterMethod = null;
}
if (getterMethod != null) {
getterAndSetterMethods.add("get" + propertyName);
getterAndSetterMethods.add(name + "Void");
/*
* Add the real property name into propertiesName.
* if the names of setter/getter methods are
* setFoo/getFoo, the name of the property should be
* "foo".
*/
propertiesName.add
(propertyName.substring(0, 1).toLowerCase() +
propertyName.substring(1));
}
}
}
} catch (SecurityException e) {
e.printStackTrace();
}
}
private static boolean isIgnoreMethods(String methodName) {
for (int i = 0; i < ignoreMethods.size(); i++) {
if (ignoreMethods.get(i).equals(methodName)) {
return true;
}
}
return false;
}
protected static PropertyDescriptor[] getPdescriptor(Class cls) {
getPropertiesInfo(cls);
final int propertyNum = propertiesName.size();
assert propertyNum * 2 == getterAndSetterMethods.size();
PropertyDescriptor[] properties = new PropertyDescriptor[propertyNum];
try {
for (int i = 0, j = 0; i < propertyNum; i += 1, j += 2) {
properties[i] = new PropertyDescriptor
(propertiesName.get(i), cls, getterAndSetterMethods.get(j),
getterAndSetterMethods.get(j + 1));
}
} catch(IntrospectionException e) {
e.printStackTrace();
}
return properties;
}
protected static BeanDescriptor getBdescriptor(Class cls) {
BeanDescriptor beanDescriptor = new BeanDescriptor(cls, null);
return beanDescriptor;
}
/**
* Gets the bean's <code>BeanDescriptor</code>s.
*
* @param cls the Class.
*
* @return BeanDescriptor describing the editable
* properties of this bean. May return null if the
* information should be obtained by automatic analysis.
*/
public BeanDescriptor getBeanDescriptor(Class cls) {
return null;
}
/**
* Gets the bean's <code>PropertyDescriptor</code>s.
*
* @param cls the Class.
*
* @return An array of PropertyDescriptors describing the editable
* properties supported by this bean. May return null if the
* information should be obtained by automatic analysis.
* <p>
* If a property is indexed, then its entry in the result array will
* belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor.
* A client of getPropertyDescriptors can use "instanceof" to check
* if a given PropertyDescriptor is an IndexedPropertyDescriptor.
*/
public PropertyDescriptor[] getPropertyDescriptors(Class cls) {
return null;
}
/**
* Gets the bean's <code>EventSetDescriptor</code>s.
*
* @return An array of EventSetDescriptors describing the kinds of
* events fired by this bean. May return null if the information
* should be obtained by automatic analysis.
*/
public EventSetDescriptor[] getEventSetDescriptors() {
EventSetDescriptor[] eventSets = new EventSetDescriptor[0];
return eventSets;
}
/**
* A bean may have a "default" property that is the property that will
* mostly commonly be initially chosen for update by human's who are
* customizing the bean.
* @return Index of default property in the PropertyDescriptor array
* returned by getPropertyDescriptors.
* <p> Returns -1 if there is no default property.
*/
public int getDefaultPropertyIndex() {
return defaultPropertyIndex;
}
/**
* A bean may have a "default" event that is the event that will
* mostly commonly be used by human's when using the bean.
* @return Index of default event in the EventSetDescriptor array
* returned by getEventSetDescriptors.
* <p> Returns -1 if there is no default event.
*/
public int getDefaultEventIndex() {
return defaultEventIndex;
}
/**
* This method returns an image object that can be used to
* represent the bean in toolboxes, toolbars, etc. Icon images
* will typically be GIFs, but may in future include other formats.
* <p>
* Beans aren't required to provide icons and may return null from
* this method.
* <p>
* There are four possible flavors of icons (16x16 color,
* 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only
* support a single icon we recommend supporting 16x16 color.
* <p>
* We recommend that icons have a "transparent" background
* so they can be rendered onto an existing background.
*
* @param iconKind The kind of icon requested. This should be
* one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32,
* ICON_MONO_16x16, or ICON_MONO_32x32.
* @return An image object representing the requested icon. May
* return null if no suitable icon is available.
*/
public java.awt.Image getIcon(int iconKind) {
switch (iconKind) {
case ICON_COLOR_16x16:
if (iconNameC16 == null) {
return null;
} else {
if (iconColor16 == null) {
iconColor16 = loadImage(iconNameC16);
}
return iconColor16;
}
case ICON_COLOR_32x32:
if (iconNameC32 == null) {
return null;
} else {
if (iconColor32 == null) {
iconColor32 = loadImage(iconNameC32);
}
return iconColor32;
}
case ICON_MONO_16x16:
if (iconNameM16 == null) {
return null;
} else {
if (iconMono16 == null) {
iconMono16 = loadImage(iconNameM16);
}
return iconMono16;
}
case ICON_MONO_32x32:
if (iconNameM32 == null) {
return null;
} else {
if (iconMono32 == null) {
iconMono32 = loadImage(iconNameM32);
}
return iconMono32;
}
default:
return null;
}
}
}