package railo.commons.io.res.type.s3; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import railo.loader.util.Util; import railo.runtime.text.xml.XMLUtil; /** * Die Klasse TagLibFactory liest die XML Repraesentation einer TLD ein * und laedt diese in eine Objektstruktur. * Sie tut dieses mithilfe eines Sax Parser. * Die Klasse kann sowohl einzelne Files oder gar ganze Verzeichnisse von TLD laden. */ public abstract class S3Factory extends DefaultHandler { public final static String DEFAULT_SAX_PARSER="org.apache.xerces.parsers.SAXParser"; private XMLReader xmlReader; protected String inside; protected StringBuffer content=new StringBuffer(); private boolean insideError; private boolean insideMessage; /** * Privater Konstruktor, der als Eingabe die TLD als File Objekt erhaelt. * @param saxParser String Klassenpfad zum Sax Parser. * @param file File Objekt auf die TLD. * @throws IOException * @throws SAXException */ public S3Factory() { } /** * Generelle Initialisierungsmetode der Konstruktoren. * @param saxParser String Klassenpfad zum Sax Parser. * @param is InputStream auf die TLD. * @throws SAXException * @throws IOException */ protected void init(InputStream in) throws IOException, SAXException { Reader r=null; try { InputSource is=new InputSource(in); xmlReader=XMLUtil.createXMLReader(DEFAULT_SAX_PARSER); xmlReader.setContentHandler(this); xmlReader.setErrorHandler(this); xmlReader.parse(is); } finally { Util.closeEL(r); } } @Override public final void startElement(String uri, String name, String qName, Attributes atts) { inside=qName; if(qName.equalsIgnoreCase("Error")) insideError=true; if(qName.equalsIgnoreCase("Message")) insideMessage=true; doStartElement(uri, name, qName, atts); } protected abstract void doStartElement(String uri, String name, String qName, Attributes atts); @Override public final void endElement(String uri, String name, String qName) throws SAXException { _setContent(content.toString().trim()); content=new StringBuffer(); inside=""; if(qName.equalsIgnoreCase("Error")) insideError=false; if(qName.equalsIgnoreCase("Message")) insideMessage=false; doEndElement(uri, name, qName); } public abstract void doEndElement(String uri, String name, String qName) throws SAXException; private void _setContent(String value) throws SAXException { if(insideError && insideMessage) { throw new SAXException(value); } setContent(value); /* <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>SignatureDoesNotMatch</Code> <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message> <RequestId>53DE01E3379AEF9F</RequestId> <SignatureProvided>CsJJe9qgVVxoOPyAZ48XhFd8VJs=</SignatureProvided> <StringToSignBytes>47 45 54 0a 0a 0a 57 65 64 2c 20 30 35 20 4d 61 72 20 32 30 30 38 20 31 31 3a 31 39 3a 34 33 20 47 4d 54 0a 2f</StringToSignBytes> <AWSAccessKeyId>03SG52G1QX3EVP5FEMG2</AWSAccessKeyId> <HostId>TFyQxYQuisdThJrENWZW7Q1yp5mbVabV8jGx6B0m9pB6dSG/AJhpCTEWnQpW/otb</HostId> <StringToSign>GET */ } protected abstract void setContent(String value) throws SAXException; @Override public void characters (char ch[], int start, int length) { content.append(new String(ch,start,length)); } }