001: /*
002: * Created on 04/02/2005
003: *
004: * Swing Components - visit http://sf.net/projects/gfd
005: *
006: * Copyright (C) 2004 Igor Regis da Silva Simões
007: *
008: * This program is free software; you can redistribute it and/or
009: * modify it under the terms of the GNU General Public License
010: * as published by the Free Software Foundation; either version 2
011: * of the License, or (at your option) any later version.
012: *
013: * This program is distributed in the hope that it will be useful,
014: * but WITHOUT ANY WARRANTY; without even the implied warranty of
015: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
016: * GNU General Public License for more details.
017: *
018: * You should have received a copy of the GNU General Public License
019: * along with this program; if not, write to the Free Software
020: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
021: *
022: */
023: package br.com.gfpshare.config;
024:
025: import java.lang.reflect.InvocationHandler;
026: import java.lang.reflect.Method;
027: import java.lang.reflect.Proxy;
028: import java.sql.SQLException;
029: import java.util.Date;
030: import java.util.HashMap;
031: import java.util.Map;
032:
033: import br.com.gfpshare.db.AbstractPersistentObject;
034: import br.com.gfpshare.db.Column;
035: import br.com.gfpshare.db.Table;
036: import br.com.gfpshare.plugin.core.DynamicClassLoader;
037:
038: /**
039: *
040: * @author Igor Regis da Silva Simoes
041: * @since 04/02/2005 11:03:53
042: */
043: @Table(name="Propriedades")
044: public class Propriedades extends AbstractPersistentObject implements
045: InvocationHandler {
046: /**
047: * Categoria das propriedades. Ex.:Segurança, Conexão a Internet, etc...
048: */
049: @Column(nome="Categoria",isPk=false,writeMethodName="setCategoria",readMethodName="getCategoria")
050: private String categoria = null;
051:
052: /**
053: * Map com as propriedades desta categoria.
054: */
055: @Column(nome="Propriedades",isPk=false,writeMethodName="setPropriedades",readMethodName="getPropriedades")
056: private Map<String, Object> propriedades = new HashMap<String, Object>();
057:
058: /**
059: * Campo ID do objeto
060: */
061: @Column(nome="Id",isPk=true,writeMethodName="setId",readMethodName="getId")
062: private Integer id = null;
063:
064: /**
065: * Não queremos que ninguem instancie esta classse diretamente
066: * @param categoria Nome da categoria desta propriedade
067: */
068: private Propriedades(String categoria) {
069: this .categoria = categoria;
070: }
071:
072: /**
073: * Aqui sim nos instanciamos esta classe
074: * @param impl Interface que o proxy deverá implementar
075: * @return Retorna uma nova instancia de um proxy listener de eventos
076: */
077: public static Object loadPropiedades(Class impl) {
078: Propriedades proxy = new Propriedades(impl.getName());
079: return Proxy.newProxyInstance(DynamicClassLoader
080: .getClassLoader(), new Class[] { impl }, proxy);
081: }
082:
083: /**
084: *
085: * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
086: */
087: public Object invoke(Object proxy, Method method, Object[] args)
088: throws Throwable {
089: if (method.getName().equals("getPersistentObject")) {
090: return this ;
091: } else if (method.getName().startsWith("set")) {
092: getPropriedades().put(
093: method.getName().substring(3,
094: method.getName().length()), args[0]);
095: } else if (method.getName().startsWith("get")) {
096: Object retorno = getPropriedades().get(
097: method.getName().substring(3,
098: method.getName().length()));
099: if (retorno == null
100: && (method.getReturnType().isAssignableFrom(
101: Boolean.class) || method.getReturnType()
102: .isAssignableFrom(boolean.class)))
103:
104: return Boolean.valueOf(false);
105: else if (retorno == null
106: && (method.getReturnType().isAssignableFrom(
107: Number.class)
108: || method.getReturnType().isAssignableFrom(
109: int.class)
110: || method.getReturnType().isAssignableFrom(
111: long.class)
112: || method.getReturnType().isAssignableFrom(
113: double.class)
114: || method.getReturnType().isAssignableFrom(
115: float.class) || method
116: .getReturnType().isAssignableFrom(
117: byte.class)))
118: return Integer.valueOf("0");
119: else if (method.getReturnType()
120: .isAssignableFrom(Date.class)
121: && retorno == null)
122: return new Date();
123: else if (method.getReturnType().isAssignableFrom(
124: String.class)
125: && retorno == null)
126: return "";
127: return retorno;
128: } else if (method.getName().equals("toString")) {
129: return toString();
130: }
131: return null;
132: }
133:
134: /**
135: * @see br.com.gfpshare.db.PersistentObject#validate()
136: */
137: public void validate() throws SQLException {
138: // Por enquato sem validação
139: }
140:
141: /**
142: * @see br.com.gfpshare.db.PersistentObject#getAsString(int)
143: */
144: public String getAsString(int format) {
145: return toString();
146: }
147:
148: /**
149: * Representação em forma de String
150: * @see br.com.gfpshare.db.AbstractPersistentObject#toString()
151: */
152: @Override
153: public String toString() {
154: return "Categoria=" + getCategoria() + " - Propriedades="
155: + getPropriedades();
156: }
157:
158: /**
159: * Getter for property id.
160: * @return Value of property id.
161: */
162: public Integer getId() {
163: return id;
164: }
165:
166: /**
167: * Setter for property id.
168: * @param id New value of property id.
169: */
170: public void setId(Integer id) {
171: this .id = id;
172: }
173:
174: /**
175: * Retorna a categaria destas propriedades
176: * @return String categaria
177: */
178: public String getCategoria() {
179: return categoria;
180: }
181:
182: /**
183: * Indica uma categaria para estas propriedades
184: * @param categoria String nova categaria
185: */
186: public void setCategoria(String categoria) {
187: this .categoria = categoria;
188: }
189:
190: /**
191: * Um Map com todas propriedades para esta categoria
192: * @return Map contendo as prodiedades
193: */
194: public Map<String, Object> getPropriedades() {
195: return propriedades;
196: }
197:
198: /**
199: * Seta uma nova lista de propriedades para esta categoria de propriedades
200: * @param propriedades Map
201: */
202: public void setPropriedades(Map<String, Object> propriedades) {
203: this.propriedades = propriedades;
204: }
205: }
|