package framepack.controlpack; import framepack.configurationpack.*; import java.lang.reflect.*; import java.net.URI; import java.net.URL; import java.util.Enumeration; import java.util.StringTokenizer; import javax.servlet.http.*; import org.w3c.dom.*; import toolspack.*; /** * Classe deputata al controllo dell'esecuzione delle richieste degli utenti * @author Stefano Ricciarelli * @version 1.2 - Date: 28-06-2002 */ public class Controller { private Configurator config; private XmlTools xmlTools; private RequestResolverXML requestResolverXML; public Controller() { config = Configurator.getInstance(); xmlTools = XmlTools.getInstance(); requestResolverXML = RequestResolverXML.getInstance(); } /** * Costruisce requestXML a partire da httpRequest. Il compito coinvolge alcune problematiche. * Anzitutto l'Enumeration names = httpRequest.getParameterNames(), non garantisce l'ordine * dei parametri così come sono scritti nell'URL. Per questo motivo si procede ad un parsign * della richiesta query = httpRequest.getQueryString() attraverso lo StringTokenizer. * Secondariamente vi è il problema della codifica dei caratteri dell'URL identificati da * %xx con xx=codifica esadecimale USASCII. Per questo motivo si crea un (since jdk1.4) * al quale chiedere la queryString che verrà restituita con i caratteri già decodificati * @param httpRequest la richiesta arrivata alla servlet * @return la richiesta i formato XML */ private Document buildRequestXML(HttpServletRequest httpRequest) { //creo la nuova requestXML a partire dalla richiesta HTTP Document requestXML = xmlTools.newDocument(); Element request = requestXML.createElement("request"); requestXML.appendChild(request); //estraggo la queryString (decodificata) dalla richiesta String query = httpRequest.getQueryString(); StringBuffer bufferURL = httpRequest.getRequestURL(); String requestURI; if (query==null) query=""; if (query.equals("")) requestURI = bufferURL.toString(); else requestURI = bufferURL.append('?').append(query).toString(); try { URI uri = new URI(requestURI); //since jdk1.4 String decodedQuery = uri.getQuery(); //parserizzo ogni coppia nome=valore StringTokenizer st = new StringTokenizer(query, new String("&")); //se non c'è alcun parametro restituisco un requestXML con le sole requestProperties if (!st.hasMoreTokens()) { requestXML = appendRequestProperties(httpRequest, requestXML); return requestXML; } //per ogni coppia nome=valore parserizzo il nome e il valore int j=0; String paramName, paramValue; StringTokenizer st2; boolean start = true; //Variabile indicante l'attuale nodo action a cui aggiungere i parametri Element actualActionElement = null; while (st.hasMoreTokens()) { st2 = new StringTokenizer(st.nextToken(), new String("=")); paramName = st2.nextToken(); paramValue = st2.nextToken(); if (st2.hasMoreTokens()) {Logger.print(this, "errore parserizzando "+st2+" in "+st); return null;} Logger.print(this, "parametro "+j+" nome: "+paramName+" valore: "+paramValue); // se si tratta del primo parametro deve necessariamente essere un "action" if (start) { if (!paramName.equals("action")) {Logger.print(this, "ERRORE: url non corretto"); return requestXML;} //errore start = false; } if (paramName.equals("action")) { Element action = requestXML.createElement("action"); action.setAttribute("name", paramValue); request.appendChild(action); actualActionElement = action; } else{ //parametri della action Element param = requestXML.createElement("param"); param.setAttribute(paramName, paramValue); actualActionElement.appendChild(param); } j++; }//while } catch (Exception ex) {Logger.print("ERRORE costruendo l'URI " + ex);} requestXML = appendRequestProperties(httpRequest, requestXML); return requestXML; } /** * Chiama i bean come indicato in _methodsToCallXML utilizzando la reflection. * Si ricercano i bean prima fra quelli di sessione, poi fra quelli di applicazione * Eventuali parametri da passare ai metodi dei bean devono essere costituiti * da un unico parametro di tipo Document con radice <params> presente nel * documento _methodsToCallXML. * @param sessionBeans l'insieme dei bean di sessione * @param applicationBeans l'insieme dei bean di applicazione * @param _methodsToCallXML il Document contenente le informazioni sui bean da chiamare, * metodi e relativi parametri * @return true se l'operazione è andata a buon fine, false altrimenti */ private boolean callBeans(ObjectSet sessionBeans, ObjectSet applicationBeans , Document _methodsToCallXML) { NodeList calls = _methodsToCallXML.getElementsByTagName("call"); String beanName, methodName; Element callElement; Document paramDocument; int i = 0; for (i=0; i 1) {Logger.print(this, "troppi parametri"); return false;} if (params.getLength() == 1) { paramDocument = xmlTools.newDocument(); paramDocument.appendChild(paramDocument.importNode(params.item(0), true)); } else paramDocument = null; Object bean = sessionBeans.getValue(beanName); if (bean == null) {//cerco allora il bean fra quelli di applicazione bean = applicationBeans.getValue(beanName); if (bean == null) {Logger.print(this, "bean inesistente"); return false;} }//if //chiamo il bean: try { if (paramDocument==null) Reflect.invoke(bean, methodName); else Reflect.invoke(bean, methodName, paramDocument, Class.forName("org.w3c.dom.Document")); } catch (Exception ex) { Logger.print(this, "errore chiamando i bean specificati nella richiesta " + ex); return false; } }//for Logger.print(this, "CallBeans: chiamati correttamente " + calls.getLength() + " bean/s."); return true; } //***************************** E X E C U T E ******************************* /* * Provvede a eseguire le chiamate ai bean relative ad una richiesta request * @param request la richiesta http ricevuta dalla servlet * @return true se l'operazione è andata a buon fine, false altrimenti */ public boolean execute(HttpServletRequest request) { HttpSession session = request.getSession(); Document requestXML; if (session.isNew()) { Logger.print(this, "NUOVA SESSIONE"); //inserisco nella sessione i sessionBeans session.setAttribute("sessionBeans", config.getNewSessionBeanInstances()); //if (!initSession(session)) return false; } else { Logger.print(this, "SESSIONE ESISTENTE!"); } Logger.print(this, "Sessione gestita da cookie? " + request.isRequestedSessionIdFromCookie()); Logger.print(this, "Sessione gestita da URL? " + request.isRequestedSessionIdFromURL()); Logger.print(this, "Sessione ancora valida? " + request.isRequestedSessionIdValid()); //Creo la requestXML a partire dalla requestHTTP requestXML = buildRequestXML(request); if (requestXML == null) return false; Logger.DOMtoXMLfile(requestXML, "_request.xml"); Logger.print(this, "SESSIONE INIZIALIZZATA. Adesso creo _methodsToCall.xml"); //produco callsXML a partire da requestXML Document _methodsToCallXML = requestResolverXML.getMethodsToCallXML(requestXML); Logger.DOMtoXMLfile(_methodsToCallXML, "_methodsToCall.xml"); Logger.print(this, "chiamo i bean di _methodsToCall.xml"); //invoco callBeans passandogli callsXML if ( ! callBeans((ObjectSet)session.getAttribute("sessionBeans") , config.getApplicationBeanInstances(), _methodsToCallXML) ) return false; session.setAttribute("requestXML", requestXML); return true; } /** * Aggiunge al documento requestXML un tag contenenete vari attributi * che indicano proprietà della richiesta httpRequest * @param httpRequest la richiesta http ricevuta dalla servlet * @param requestXML la richiesta XML * @return la nuova richiesta XML contenente anche le proprietà della richiesta */ private Document appendRequestProperties(HttpServletRequest httpRequest, Document requestXML) { //Inserisco il nodo requestProperties Element rp = requestXML.createElement("requestProperties"); Element e; String s; String query = httpRequest.getQueryString(); StringBuffer bufferURL = httpRequest.getRequestURL(); String requestURI; if (query==null) query=""; if (query.equals("")) requestURI = bufferURL.toString(); else requestURI = bufferURL.append('?').append(query).toString(); rp.setAttribute("requestURL", (requestURI==null)? "" : requestURI); s = httpRequest.getContextPath(); rp.setAttribute("contextPath", (s==null)? "" : s); s = httpRequest.getPathInfo(); rp.setAttribute("pathInfo", (s==null)? "" : s); s = httpRequest.getServletPath(); rp.setAttribute("servletPath", (s==null)? "" : s); s = httpRequest.getQueryString(); rp.setAttribute("queryString", (s==null)? "" : s); s = httpRequest.getRemoteAddr(); rp.setAttribute("remoteAddr", (s==null)? "" : s); s = httpRequest.getRemoteHost(); rp.setAttribute("remoteHost", (s==null)? "" : s); s = httpRequest.getRemoteUser(); rp.setAttribute("remoteUser", (s==null)? "" : s); s = httpRequest.getProtocol(); rp.setAttribute("protocol", (s==null)? "" : s); s = httpRequest.getServerName(); rp.setAttribute("serverName", (s==null)? "" : s); s = Integer.toString(httpRequest.getServerPort()); rp.setAttribute("serverPort", (s==null)? "" : s); HttpSession session = httpRequest.getSession(); s = session.getId(); rp.setAttribute("sessionID", (s==null)? "" : s); s = Boolean.toString(session.isNew()); rp.setAttribute("sessionIsNew", (s==null)? "" : s); s = Long.toString(session.getCreationTime()); rp.setAttribute("sessionCreationTime", (s==null)? "" : s); s = Long.toString(session.getLastAccessedTime()); rp.setAttribute("sessionLastAccessedTime", (s==null)? "" : s); requestXML.getDocumentElement().appendChild(rp); return requestXML; } } //FINE CLASSE /******************* URI - URL - PARAMETRI ************************************ * Enumeration e = request.getParameterNames(); int q=0; while (e.hasMoreElements()) { q++; String s = (String)e.nextElement(); Tester.print("parametro numero " + q + " - nome: " + s + " valore: " + request.getParameter(s)); } String query = request.getQueryString(); if (query==null) query = new String(""); String requestURI = request.getRequestURI(); StringBuffer bufferURL = request.getRequestURL(); String requestURL; if (!query.equals("")) { requestURL = bufferURL.append('?').append(query).toString(); requestURI = requestURI.concat("?").concat(query); } else {requestURL = bufferURL.toString();} try { URI uri = new URI(requestURI); URI uri2 = new URI(requestURL); URL url = new URL(requestURL); Tester.print("URI toString = " + uri.toString() + " query = " + uri.getQuery()); Tester.print("URI2 toString = " + uri2.toString() + " query = " + uri2.getQuery()); Tester.print("URI2 toASCIIString = " + uri2.toASCIIString() + " query = " + uri2.getQuery()); Tester.print("URL toString = " + url.toString() + " query = " + url.getQuery()); } catch (Exception ex) {Tester.print("ERRORE costruendo l'URI");} StringTokenizer st = new StringTokenizer(query, new String("&")); int jj=0; while (st.hasMoreTokens()) { String param = st.nextToken(); StringTokenizer st2 = new StringTokenizer(param, new String("=")); String paramName = st2.nextToken(); String paramValue = st2.nextToken(); if (st2.hasMoreTokens()) {Tester.print(this, "errore parserizzando "+st2+" in "+st); return ;} Tester.print(this, "parametro "+jj+" nome: "+paramName+" valore: "+paramValue); } **********************************************************************************/ /* private Document buildRequestXML(HttpServletRequest httpRequest) { //creo la nuova requestXML a partire dalla richiesta HTTP Enumeration names = httpRequest.getParameterNames(); Document requestXML = xmlTools.newDocument(); Element request = requestXML.createElement("request"); requestXML.appendChild(request); //eseguo il parsing della richiesta String query = httpRequest.getQueryString(); StringTokenizer st = new StringTokenizer(httpRequest.getQueryString(), "&"); int jj=0; while (st.hasMoreTokens()) { String param = st.nextToken(); StringTokenizer st2 = new StringTokenizer(param, "="); String paramName = st2.nextToken(); String paramValue = st2.nextToken(); if (st2.hasMoreTokens()) {Tester.print(this, "errore parserizzando "+st2+" in "+st); return null;} Tester.print(this, "parametro "+jj+" nome: "+paramName+" valore: "+paramValue); } if (! names.hasMoreElements()) { //Non ci sono parametri: inizializzo la requestXML con initRequestXML requestXML = config.getInitRequestXML(); if (requestXML == null) return null; } else { //ci sono parametri: i inserisco le "action" nella requestXML String name, value; boolean start = true; Element actualElement = request; while (names.hasMoreElements()) { name = (String) names.nextElement(); value = httpRequest.getParameter(name); Tester.print(this, "Parsing url: name=\"" + name + "\" value = \"" + value + "\""); if (start) { if (!name.equals("action")) {Tester.print(this, "ERRORE: url non corretto"); return requestXML;} //errore start = false; } if (name.equals("action")) { Element action = requestXML.createElement("action"); action.setAttribute("name", value); request.appendChild(action); actualElement = action; } else{ Element param = requestXML.createElement("param"); param.setAttribute("key", name); param.setAttribute("value", value); actualElement.appendChild(param); } }//while }//if //Inserisco il nodo requestProperties requestXML = appendRequestProperties(httpRequest, requestXML); return requestXML; }*/