|
From: Leandro R. S. C. <bas...@us...> - 2004-03-22 21:34:25
|
Update of /cvsroot/xingu/xingu/exintake/src/java/br/com/ibnetwork/xingu/exintake/handlers In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31708/exintake/src/java/br/com/ibnetwork/xingu/exintake/handlers Added Files: SecurityContentHandler.java RuleContentHandler.java PresentationContentHandler.java IntakeContentHandler.java Log Message: adding Extensible input taker --- NEW FILE: RuleContentHandler.java --- package br.com.ibnetwork.xingu.exintake.handlers; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.List; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.Composable; import org.apache.commons.logging.Log; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import br.com.ibnetwork.xingu.chain.ChainOfResponsibility; import br.com.ibnetwork.xingu.chain.Chainable; import br.com.ibnetwork.xingu.exintake.model.Field; import br.com.ibnetwork.xingu.exintake.model.IntakeInvocationHandler; import br.com.ibnetwork.xingu.exintake.model.rule.Rule; import br.com.ibnetwork.xingu.exintake.model.rule.RuleSet; import br.com.ibnetwork.xingu.factory.ObjectFactory; import br.com.ibnetwork.xingu.factory.ObjectFactoryException; import br.com.ibnetwork.xingu.logging.LoggerFactory; /** * @author <a href="mailto:le...@ib...">Leandro Rodrigo Saad Cruz</a> * */ public class RuleContentHandler extends DefaultHandler implements Chainable, Composable { private List elementsAccepted = new ArrayList(); private List rulesForCurrentRuleSet; private Log logger; private ObjectFactory factory; private ChainOfResponsibility chain; private Rule currentRule; private StringBuffer messageBuffer; /* (non-Javadoc) * @see org.apache.avalon.framework.component.Composable#compose(org.apache.avalon.framework.component.ComponentManager) */ public void compose(ComponentManager manager) throws ComponentException { logger = ((LoggerFactory)manager.lookup(LoggerFactory.ROLE)) .getLoggerForClass(this.getClass().getName()); factory = (ObjectFactory) manager.lookup(ObjectFactory.ROLE); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) */ public void startElement(String arg0,String arg1,String qName,Attributes attrs) throws SAXException { IntakeContentHandler intakeContentHandler = (IntakeContentHandler) chain.getLinkForElement("field"); Proxy currentProxy = intakeContentHandler.getCurrentProxy(); String fieldName = ((Field)currentProxy).getName(); if("ruleset".equalsIgnoreCase(qName)) { rulesForCurrentRuleSet = new ArrayList(); } else if("rule".equalsIgnoreCase(qName)) { logger.debug("Creating Rule for RuleSet on field["+fieldName+"]"); if(rulesForCurrentRuleSet == null) { throw new SAXException("No ruleset element found"); } messageBuffer = new StringBuffer(); Object[] params = new Object[]{attrs}; String[] sign = new String[]{Attributes.class.getName()}; try { Rule rule = (Rule) factory.getInstanceOf(Rule.class.getName(),params,sign); currentRule = rule; rulesForCurrentRuleSet.add(rule); } catch (ObjectFactoryException e) { logger.warn("Error creating Rule for field["+fieldName+"]",e); } } } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#characters(char[], int, int) */ public void characters(char[] ch, int start, int length) throws SAXException { if(currentRule != null) { messageBuffer.append(ch,start,length); } } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String) */ public void endElement(String uri, String localName, String qName) throws SAXException { IntakeContentHandler intakeContentHandler = (IntakeContentHandler) chain.getLinkForElement("field"); Proxy currentProxy = intakeContentHandler.getCurrentProxy(); String fieldName = ((Field)currentProxy).getName(); if("ruleset".equalsIgnoreCase(qName)) { logger.debug("Creating RuleSet on field["+fieldName+"]"); RuleSet ruleSet; try { Object[] params = new Object[]{fieldName,rulesForCurrentRuleSet}; String[] sign = new String[]{String.class.getName(),List.class.getName()}; ruleSet = (RuleSet) factory.getInstanceOf(RuleSet.class.getName(),params,sign); } catch (ObjectFactoryException e) { logger.warn("Error creating RuleSet for field["+fieldName+"]",e); throw new SAXException("Error creating RuleSet for field["+fieldName+"]",e); } IntakeInvocationHandler invocationHandler = (IntakeInvocationHandler) Proxy.getInvocationHandler(currentProxy); invocationHandler.registerMethods(RuleSet.class,ruleSet); rulesForCurrentRuleSet = null; } else if("rule".equalsIgnoreCase(qName) && currentRule != null) { currentRule.setMessage(messageBuffer.toString().trim()); currentRule = null; } } /* * * CHAINABLE METHODS * */ /* (non-Javadoc) * @see br.com.ibnetwork.xingu.chain.Chainable#accepts(java.lang.String) */ public boolean accepts(String qName) { return elementsAccepted.contains(qName); } /* (non-Javadoc) * @see br.com.ibnetwork.xingu.chain.Chainable#addAcceptableElement(java.lang.String) */ public void addAcceptableElement(String elementName) { elementsAccepted.add(elementName); } /* (non-Javadoc) * @see br.com.ibnetwork.xingu.chain.Chainable#getChain() */ public ChainOfResponsibility getChain() { return chain; } /* (non-Javadoc) * @see br.com.ibnetwork.xingu.chain.Chainable#setChain(br.com.ibnetwork.xingu.chain.ChainOfResponsibility) */ public void setChain(ChainOfResponsibility chain) { this.chain = chain; } } --- NEW FILE: IntakeContentHandler.java --- package br.com.ibnetwork.xingu.exintake.handlers; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.Composable; import org.apache.commons.logging.Log; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import br.com.ibnetwork.xingu.chain.ChainOfResponsibility; import br.com.ibnetwork.xingu.chain.Chainable; import br.com.ibnetwork.xingu.exintake.model.Field; import br.com.ibnetwork.xingu.exintake.model.Group; import br.com.ibnetwork.xingu.exintake.model.IntakeInvocationHandler; import br.com.ibnetwork.xingu.exintake.model.IntakeModel; import br.com.ibnetwork.xingu.exintake.model.presentation.Presentation; import br.com.ibnetwork.xingu.factory.ObjectFactory; import br.com.ibnetwork.xingu.factory.ObjectFactoryException; import br.com.ibnetwork.xingu.logging.LoggerFactory; /** * @author <a href="mailto:le...@ib...">Leandro Rodrigo Saad Cruz</a> * */ public class IntakeContentHandler extends DefaultHandler implements Chainable, Composable { private Log invocationHandlerlogger; private List interfacesList = new ArrayList(); private Class[] interfacesArray; private List elementsAccepted = new ArrayList(); private ObjectFactory factory; private Log logger; private ChainOfResponsibility chain; private Group currentGroup; private Proxy currentProxy; /* (non-Javadoc) * @see org.apache.avalon.framework.component.Composable#compose(org.apache.avalon.framework.component.ComponentManager) */ public void compose(ComponentManager manager) throws ComponentException { logger = ((LoggerFactory)manager.lookup(LoggerFactory.ROLE)) .getLoggerForClass(this.getClass().getName()); invocationHandlerlogger = ((LoggerFactory)manager.lookup(LoggerFactory.ROLE)) .getLoggerForClass(IntakeInvocationHandler.class.getName()); factory = (ObjectFactory) manager.lookup(ObjectFactory.ROLE); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) */ public void startElement(String arg0,String arg1,String qName,Attributes attrs) throws SAXException { try { //cria campo novo if("group".equalsIgnoreCase(qName)) { Group newGroup = createGroup(attrs); ((IntakeModel)chain.getModel()).addGroup(newGroup); currentGroup = newGroup; } else if ("field".equalsIgnoreCase(qName)) { ClassLoader cl = this.getClass().getClassLoader(); IntakeInvocationHandler handler = new IntakeInvocationHandler(invocationHandlerlogger); Proxy proxy = (Proxy) Proxy.newProxyInstance(cl,interfacesArray,handler); currentProxy = proxy; currentGroup.addProxy(proxy); //register methods from other interfaces to avoid NPE in the proxy //e.g a <field> with no <rule> will throw NPE when isValid is called for (int i = 0; i < interfacesArray.length; i++) { Class interfaceClass = interfacesArray[i]; Object nullImpl = ((InterfaceHelper)interfacesList.get(i)).nullImplementation; handler.registerMethods(interfaceClass,nullImpl); } //cria campo e registra os metodos no handler Field newField = createField(currentGroup,attrs); handler.registerMethods(Field.class,newField); } else if("interface".equalsIgnoreCase(qName)) { Object nullImplementation = factory.getInstanceOf(attrs.getValue("nullImplementation")); String className = attrs.getValue("name"); Class clazz = Class.forName(className); interfacesList.add(new InterfaceHelper(clazz,nullImplementation)); } } catch (Exception e) { throw new SAXException("Error creating model",e); } } private void createInterfacesArray() { interfacesArray = new Class[this.interfacesList.size()]; for (int i = 0; i < interfacesArray.length; i++) { interfacesArray[i] = ((InterfaceHelper) this.interfacesList.get(i)).clazz; } } private Group createGroup(Attributes attrs) throws ObjectFactoryException { Object[] params = new Object[]{attrs}; String[] sign = new String[]{"org.xml.sax.Attributes"}; return (Group) factory.getInstanceOf(Group.class.getName(),params,sign); } private Field createField(Group group,Attributes attrs) throws ObjectFactoryException { Object[] params = new Object[]{group,attrs}; String[] sign = new String[]{Group.class.getName(),"org.xml.sax.Attributes"}; return (Field) factory.getInstanceOf(Field.class.getName(),params,sign); } private Presentation createPresentation(Attributes attrs) throws ObjectFactoryException { Object[] params = new Object[]{attrs}; String[] sign = new String[]{"org.xml.sax.Attributes"}; return (Presentation) factory.getInstanceOf(Presentation.class.getName(),params,sign); } /* * * CHAINABLE METHODS * */ /* (non-Javadoc) * @see br.com.ibnetwork.xingu.chain.Chainable#accepts(java.lang.String) */ public boolean accepts(String qName) { return elementsAccepted.contains(qName); } /* (non-Javadoc) * @see br.com.ibnetwork.xingu.chain.Chainable#addAcceptableElement(java.lang.String) */ public void addAcceptableElement(String elementName) { elementsAccepted.add(elementName); } /* (non-Javadoc) * @see br.com.ibnetwork.xingu.chain.Chainable#getChain() */ public ChainOfResponsibility getChain() { return chain; } /* (non-Javadoc) * @see br.com.ibnetwork.xingu.chain.Chainable#setChain(br.com.ibnetwork.xingu.chain.ChainOfResponsibility) */ public void setChain(ChainOfResponsibility chain) { this.chain = chain; } public Proxy getCurrentProxy() { return currentProxy; } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String) */ public void endElement(String uri, String localName, String qName) throws SAXException { if ("interfaces".equalsIgnoreCase(qName)) { this.createInterfacesArray(); } super.endElement(uri, localName, qName); } private class InterfaceHelper { Class clazz; Object nullImplementation; InterfaceHelper(Class clazz, Object nullImplementation) { this.clazz = clazz; this.nullImplementation = nullImplementation; } } } --- NEW FILE: PresentationContentHandler.java --- package br.com.ibnetwork.xingu.exintake.handlers; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.List; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.Composable; import org.apache.commons.logging.Log; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import br.com.ibnetwork.xingu.chain.ChainOfResponsibility; import br.com.ibnetwork.xingu.chain.Chainable; import br.com.ibnetwork.xingu.exintake.model.Field; import br.com.ibnetwork.xingu.exintake.model.IntakeInvocationHandler; import br.com.ibnetwork.xingu.exintake.model.presentation.Presentation; import br.com.ibnetwork.xingu.factory.ObjectFactory; import br.com.ibnetwork.xingu.factory.ObjectFactoryException; import br.com.ibnetwork.xingu.logging.LoggerFactory; /** * @author <a href="mailto:le...@ib...">Leandro Rodrigo Saad Cruz</a> * */ public class PresentationContentHandler extends DefaultHandler implements Chainable, Composable { private Log logger; private List elementsAccepted = new ArrayList(); private ObjectFactory factory; private ChainOfResponsibility chain; /* (non-Javadoc) * @see org.apache.avalon.framework.component.Composable#compose(org.apache.avalon.framework.component.ComponentManager) */ public void compose(ComponentManager manager) throws ComponentException { factory = (ObjectFactory) manager.lookup(ObjectFactory.ROLE); logger = ((LoggerFactory)manager.lookup(LoggerFactory.ROLE)) .getLoggerForClass(this.getClass().getName()); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) */ public void startElement( String arg0, String arg1, String qName, Attributes attrs) throws SAXException { if("presentation".equalsIgnoreCase(qName)) { IntakeContentHandler intakeContentHandler = (IntakeContentHandler) chain.getLinkForElement("field"); Proxy currentProxy = intakeContentHandler.getCurrentProxy(); String fieldName = ((Field)currentProxy).getName(); logger.debug("Creating presentation for field["+fieldName+"]"); try { String[] sign = new String[]{Attributes.class.getName(),Proxy.class.getName()}; Object[] params = new Object[]{attrs}; Presentation presentation = (Presentation) factory.getInstanceOf(Presentation.class.getName(),params,sign); IntakeInvocationHandler invocationHandler = (IntakeInvocationHandler) Proxy.getInvocationHandler(currentProxy); invocationHandler.registerMethods(Presentation.class,presentation); } catch (ObjectFactoryException e) { logger.warn("Error creating PresentationField",e); } } else { throw new SAXException("This content handler can´t handle elements named ["+qName+"]"); } } /* (non-Javadoc) * @see br.com.ibnetwork.xingu.chain.Chainable#accepts(java.lang.String) */ public boolean accepts(String qName) { return elementsAccepted.contains(qName); } /* (non-Javadoc) * @see br.com.ibnetwork.xingu.chain.Chainable#addAcceptableElement(java.lang.String) */ public void addAcceptableElement(String elementName) { elementsAccepted.add(elementName); } /* (non-Javadoc) * @see br.com.ibnetwork.xingu.chain.Chainable#getChain() */ public ChainOfResponsibility getChain() { return chain; } /* (non-Javadoc) * @see br.com.ibnetwork.xingu.chain.Chainable#setChain(br.com.ibnetwork.xingu.chain.ChainOfResponsibility) */ public void setChain(ChainOfResponsibility chain) { this.chain = chain; } } --- NEW FILE: SecurityContentHandler.java --- package br.com.ibnetwork.xingu.exintake.handlers; import java.util.ArrayList; import java.util.List; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.Composable; import org.apache.commons.logging.Log; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import br.com.ibnetwork.xingu.chain.ChainOfResponsibility; import br.com.ibnetwork.xingu.chain.Chainable; import br.com.ibnetwork.xingu.factory.ObjectFactory; import br.com.ibnetwork.xingu.logging.LoggerFactory; /** * @author <a href="mailto:le...@ib...">Leandro Rodrigo Saad Cruz</a> * */ public class SecurityContentHandler extends DefaultHandler implements Chainable, Composable { private List elementsAccepted = new ArrayList(); private Log logger; private ObjectFactory factory; private ChainOfResponsibility chain; /* (non-Javadoc) * @see org.apache.avalon.framework.component.Composable#compose(org.apache.avalon.framework.component.ComponentManager) */ public void compose(ComponentManager manager) throws ComponentException { logger = ((LoggerFactory)manager.lookup(LoggerFactory.ROLE)) .getLoggerForClass(this.getClass().getName()); factory = (ObjectFactory) manager.lookup(ObjectFactory.ROLE); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) */ public void startElement( String arg0, String arg1, String qName, Attributes attrs) throws SAXException { //cria campo novo if("ruleset".equalsIgnoreCase(qName)) { System.out.println("Criando RuleSet"); } } /* * * CHAINABLE METHODS * */ /* (non-Javadoc) * @see br.com.ibnetwork.xingu.chain.Chainable#accepts(java.lang.String) */ public boolean accepts(String qName) { return elementsAccepted.contains(qName); } /* (non-Javadoc) * @see br.com.ibnetwork.xingu.chain.Chainable#addAcceptableElement(java.lang.String) */ public void addAcceptableElement(String elementName) { elementsAccepted.add(elementName); } /* (non-Javadoc) * @see br.com.ibnetwork.xingu.chain.Chainable#getChain() */ public ChainOfResponsibility getChain() { return chain; } /* (non-Javadoc) * @see br.com.ibnetwork.xingu.chain.Chainable#setChain(br.com.ibnetwork.xingu.chain.ChainOfResponsibility) */ public void setChain(ChainOfResponsibility chain) { this.chain = chain; } } |