package framepack.configurationpack; import javax.xml.transform.*; import javax.xml.transform.dom.*; import org.w3c.dom.*; import toolspack.*; /** * Classe che fornisce metodi per trasformare la requestXML in methodsToCallXML e * beansToViewXML. * Si tratta di una classe singleton, ossia della quale è presente una sola istanza. * E' una soluzione simile ad una classe con soli metodi statici, tuttavia in questo * modo si è sicuri che venga chiamato il costruttore della classe prima che venga invocato * un qualunque metodo. Inoltre si dispone di un riferimento ad un oggetto che come * tale può essere passato ad altri oggetti. * NB: La classe è utilizzata unicamente dai Viewer, dai Controller e dal ServletRequestManager, * non dal Configurator perché altrimenti avrei un ciclo nell'inizializzazione. * NB2: I metodi sono tutti synchronized dal momento che questa classe può essere invocata * contemporaneamente da più oggetti controller e/o da più oggetti viewer. Si ricorda che * l'implemantazione dei metodi relativi al trattamento di DOM-XML non garantisce correttezza * in presenza di richieste concorrenti * @author Stefano Ricciarelli * @version 1.2 - Date: 28-06-2002 */ public class RequestResolverXML { private static RequestResolverXML instance = new RequestResolverXML(); private Transformer viewTransformer = null; private Transformer callsTransformer = null; private Configurator config; private XmlTools xmlTools; /** * Il costruttore è privato poiché si tratta di una classe singleton */ private RequestResolverXML() { config = Configurator.getInstance(); xmlTools = XmlTools.getInstance(); } /** * Metodo statico da invocare per ottenere il riferimeto all'unico oggetto esistente * di questa classe * @return il riferimento all'unico oggetto di questa classe */ public static RequestResolverXML getInstance() { return instance; } /** * Costruisce i trasformatori a paritire dai file View.xsl e Control.xsl che vengono * richiesti al Configurator. Deve essere invocato esplicitamente prima di utilizzare * gli altri metodi della classe. Queste inizializzazioni non sono state inserite nel * costrutture poiché non vi era la possibilità di produrre un risultato in uscita * @return true se l'operazione è andata a buon fine, false altrimenti */ public synchronized boolean resetTransformers() { viewTransformer = xmlTools.createTransformer(config.getViewXSLfile()); if (viewTransformer == null) {Logger.print(this, "ERRORE in View.xsl"); return false; } callsTransformer = xmlTools.createTransformer(config.getControlXSLfile()); if (viewTransformer == null) {Logger.print(this, "ERRORE in Control.xsl"); return false; } return true; } /** * Trasforma il documento doc in base al trasformatore derivato da View.xsl * @param doc il documento in input * @return il documento trasformato, null se si sono verificati degli errori */ public synchronized Document getBeansToViewXML(Document doc) { DOMResult result; try { result = new DOMResult(xmlTools.newDocument()); viewTransformer.transform(new DOMSource(doc), result); } catch (Exception ex) { Logger.print(this, "ERRORE in getBeansToViewXML: " + ex); return null; } return (Document)result.getNode(); } /** * Trasforma il documento doc in base al trasformatore derivato da Control.xsl * @param doc il documento in input * @return il documento trasformato, null se si sono verificati degli errori */ public synchronized Document getMethodsToCallXML(Document doc) { DOMResult result; try { result = new DOMResult(xmlTools.newDocument()); callsTransformer.transform(new DOMSource(doc), result); } catch (Exception ex) { Logger.print(this, "ERRORE in getMethodsToCallXML: " + ex); return null; } return (Document)result.getNode(); } } // FINE CLASSE