package framepack.configurationpack; import java.lang.reflect.Method; import org.w3c.dom.*; import toolspack.*; /** * Classe deputata all'elaborazione degli elementi e del BeanDescriptor.xml. Produce per l'insieme * di application e session beans in questione un array di BeanDescriptor * @author Stefano Ricciarelli * @version 1.2 - Date: 28-06-2002 */ public class BeanDescriptorCreator { private static String[] abn; //applicationBeanNames private static String[] sbn; //sessionBeanNames private static Class[] abc; //applicationBeanClasses private static Class[] sbc; //sessionBeanClasses public BeanDescriptorCreator(String[] abn, String[] sbn, Class[] abc, Class[] sbc) { this.abn = abn; this.sbn = sbn; this.abc = abc; this.sbc = sbc; } /** * Unico metodo pubblico. Dato un insieme di bean, sessionBeans o applicationBeans, * presenti nell'elemento beanElement restituisce un'array di descrittori per questi bean * @param beanElement il sottoalbero dei bean, ad esempio: * * * * * @return un array di descrittori, uno per ciascun bean. */ public BeanDescriptor[] createBeanDescriptor(Element beanElement) { //tipoBean = sessionBeans OR applicationBeans String tipoBean = beanElement.getNodeName(); //Seleziono tutti i tag del beanElement NodeList BeanNodes = beanElement.getElementsByTagName("bean"); int BeanNumber = BeanNodes.getLength(); BeanDescriptor[] beanDescriptor = new BeanDescriptor[BeanNumber]; int i; NodeList nodeList; Element beanTag; Class beanClass; //Logger.print("BeanDescriptorCreator: createBeanDescriptor: BeanNumber = " + BeanNumber); for (i=0; i beanTag = (Element)BeanNodes.item(i); //elaboro tutti i tag di questo bean nodeList = beanTag.getElementsByTagName("listenTo"); if (! setEventLink(nodeList, beanDescriptor[i], tipoBean) ) return null; Logger.print(this, "setEventLink OK per il bean " + (tipoBean.equals("applicationBeans") ? abn[i]: sbn[i]) ); //elaboro tutti i tag di questo bean nodeList = beanTag.getElementsByTagName("usedBean"); if (tipoBean.equals("sessionBeans")) beanClass = sbc[i]; else beanClass = abc[i]; if (! setReferenceLink(nodeList, beanDescriptor[i], tipoBean, beanClass) ) return null; Logger.print(this, "setReferenceLink OK per il bean " + (tipoBean.equals("applicationBeans") ? abn[i]: sbn[i]) ); //elaboro tutti i tag di questo bean nodeList = beanTag.getElementsByTagName("initCall"); if (tipoBean.equals("sessionBeans")) beanClass = sbc[i]; else beanClass = abc[i]; if (! setInitCall(nodeList, beanDescriptor[i], tipoBean, beanClass) ) return null; Logger.print(this, "setInitCall OK per il bean " + (tipoBean.equals("applicationBeans") ? abn[i]: sbn[i]) ); } return beanDescriptor; } /** * Dato un bean di tipo tipoBean e un elenco di nodi del tipo: * * * * * * provvede ad aggiornare i campi initMethods e params del beanDescriptor * inserendovi tutti i metodi e relativi parametri da chiamare per questo bean * @param nodeList la lista dei nodi di tipo del bean * @param beanDescriptor il beanDescriptor del bean * @param tipoBean il tipo di bean * @param beanClass la classe del bean * @return true se l'operazione è andata a buon fine, false altrimenti */ private static boolean setInitCall(NodeList nodeList, BeanDescriptor beanDescriptor , String tipoBean, Class beanClass) { try{ Logger.print("BeanDescriptorCreator: setInitCall per il bean di classe " + beanClass); int initCallNumber = nodeList.getLength(); beanDescriptor.initMethods = new Method [initCallNumber]; beanDescriptor.params = new Document [initCallNumber]; int k, index; String methodName; Element initCallElement; XmlTools xmlTools = XmlTools.getInstance(); for (k=0; k 1) { Logger.print("BeanDescriptorCreator: setInitCall: ERRORE troppi parametri"); return false; } if (params.getLength()==0) { //nessun parametro beanDescriptor.params[k] = null; try {beanDescriptor.initMethods[k] = beanClass.getMethod(methodName , new Class[]{}); } catch (Exception ex) { Logger.print("BeanDescriptorCreator: setInitCall: ERRORE " + ex); return false; } } else { //un parametro Document doc = xmlTools.newDocument(); doc.appendChild(doc.importNode(params.item(0), true)); beanDescriptor.params[k] = doc; try { beanDescriptor.initMethods[k] = beanClass.getMethod(methodName , new Class[]{Class.forName("org.w3c.dom.Document")}); } catch (Exception ex) { Logger.print("BeanDescriptorCreator: setInitCall: ERRORE " + ex); return false; } } } //for k return true; }catch(Exception ex) { Logger.print("BeanDescriptorCreator: setInitCall: ERRORE " + ex); return false; }//catch } /** * Dato un bean di tipo tipoBean e un elenco di nodi del tipo: * * provvede ad aggiornare i campi eventSourceBeanIndex, eventSourceBeanIndexType, * addListenerMethods del beanDescriptor inserendovi l'indice del bean sorgente * degli eventi, il tipo di tale bean (a/s) e il metodo di tale bean per aggiungervi * un listener * @param nodeList la lista dei nodi di tipo del bean * @param beanDescriptor il beanDescriptor del bean * @param tipoBean il tipo di questo bean * @return true se l'operazione è andata a buon fine, false altrimenti */ private static boolean setEventLink( NodeList nodeList, BeanDescriptor beanDescriptor, String tipoBean) { Logger.print("BeanDescriptorCreator: setEventLink: entrato"); int eventSourceBeanNumber = nodeList.getLength(); beanDescriptor.eventSourceBeanIndex = new int [eventSourceBeanNumber]; beanDescriptor.eventSourceBeanIndexType = new char [eventSourceBeanNumber]; beanDescriptor.addListenerMethods = new Method[eventSourceBeanNumber]; int k, index; String eventSourceBeanName, eventName, eventPackage; Element eventSourceElement; for (k=0; k * provvede ad aggiornare i campi usedBeanIndex, usedBeanIndexType, setReferenceMethods * del beanDescriptor inserendovi l'indice del bean da inserire come riferimento, * il tipo di bean (a/s) e il metodo da utilizzare per settare il riferimento. * @param nodeList la lista dei nodi di tipo del bean * @param beanDescriptor il beanDescriptor del bean * @param tipoBean il tipo di bean * @param usingBeanClass la classe di questo bean * @return true se l'operazione è andata a buon fine, false altrimenti */ private static boolean setReferenceLink( NodeList nodeList, BeanDescriptor beanDescriptor, String tipoBean, Class usingBeanClass) { Logger.print("BeanDescriptorCreator: setReferenceLink: entrato"); int usedBeanNumber = nodeList.getLength(); beanDescriptor.usedBeanIndex = new int [usedBeanNumber]; beanDescriptor.usedBeanIndexType = new char [usedBeanNumber]; beanDescriptor.setReferenceMethods = new Method[usedBeanNumber]; int k, index; String usedBeanName, setReferenceMethodName; Element usedBeanElement; for (k=0; k