001 /* 002 Copyright (c) 2009 Olivier Chafik, All Rights Reserved 003 004 This file is part of JNAerator (http://jnaerator.googlecode.com/). 005 006 JNAerator is free software: you can redistribute it and/or modify 007 it under the terms of the GNU General Public License as published by 008 the Free Software Foundation, either version 3 of the License, or 009 (at your option) any later version. 010 011 JNAerator is distributed in the hope that it will be useful, 012 but WITHOUT ANY WARRANTY; without even the implied warranty of 013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 014 GNU General Public License for more details. 015 016 You should have received a copy of the GNU General Public License 017 along with JNAerator. If not, see <http://www.gnu.org/licenses/>. 018 */ 019 package com.ochafik.beans; 020 import java.beans.BeanInfo; 021 import java.beans.IntrospectionException; 022 import java.beans.Introspector; 023 import java.beans.PropertyChangeEvent; 024 import java.beans.PropertyChangeListener; 025 import java.beans.PropertyDescriptor; 026 import java.lang.reflect.Method; 027 028 import com.ochafik.util.string.StringUtils; 029 public class BeansUtils { 030 public static final void markTransientProperty(String name,Class<?> classe) throws IntrospectionException { 031 BeanInfo info = Introspector.getBeanInfo(classe); 032 PropertyDescriptor[] propertyDescriptors = 033 info.getPropertyDescriptors(); 034 for (int i = 0; i < propertyDescriptors.length; ++i) { 035 PropertyDescriptor pd = propertyDescriptors[i]; 036 if (pd.getName().equals(name)) { 037 pd.setValue("transient", Boolean.TRUE); 038 } 039 } 040 } 041 042 public static void addPropertyChangeListener(Object bean, final String propertyName, final PropertyChangeListener listener) { 043 if (bean == null) 044 throw new NullPointerException("Null bean !"); 045 046 try { 047 bean.getClass().getMethod("addPropertyChangeListener", String.class, PropertyChangeListener.class).invoke(bean, propertyName, listener); 048 } catch (Exception ex) { 049 try { 050 bean.getClass().getMethod("addPropertyChangeListener", PropertyChangeListener.class).invoke(bean, new PropertyChangeListener() { 051 052 public void propertyChange(PropertyChangeEvent evt) { 053 if (propertyName.equals(evt.getPropertyName())) 054 listener.propertyChange(evt); 055 } 056 }); 057 } catch (Exception ex2) { 058 throw new RuntimeException(ex); 059 } 060 } 061 } 062 public static void removePropertyChangeListener(Object bean, String propertyName, PropertyChangeListener listener) { 063 if (bean == null) 064 throw new NullPointerException("Null bean !"); 065 066 try { 067 bean.getClass().getMethod("removePropertyChangeListener", PropertyChangeListener.class).invoke(bean, listener); 068 } catch (Exception ex) { 069 throw new RuntimeException(ex); 070 } 071 } 072 073 public static Object get(Object bean, String propertyName) { 074 return get(bean, propertyName, Object.class); 075 } 076 077 public static <T> T get(Object bean, String propertyName, Class<T> propertyClass) { 078 if (bean == null) 079 throw new NullPointerException("Null bean !"); 080 081 try { 082 String cap = StringUtils.capitalize(propertyName); 083 Method m; 084 if (propertyClass == Boolean.class) { 085 try { 086 m = bean.getClass().getMethod("is" + cap); 087 } catch (NoSuchMethodException ex) { 088 m = bean.getClass().getMethod("get" + cap); 089 } 090 } else { 091 m = bean.getClass().getMethod("get" + cap); 092 } 093 return propertyClass.cast(m.invoke(bean)); 094 } catch (Exception ex) { 095 throw new RuntimeException(ex); 096 } 097 } 098 099 public static <T> void set(Object bean, String propertyName, Class<T> propertyClass, T value) { 100 if (bean == null) 101 throw new NullPointerException("Null bean !"); 102 103 try { 104 bean.getClass().getMethod("set" + StringUtils.capitalize(propertyName), propertyClass).invoke(bean, value); 105 } catch (Exception ex) { 106 throw new RuntimeException(ex); 107 } 108 } 109 }