1 23 package com.sun.enterprise.admin.wsmgmt.transform; 24 25 import com.sun.enterprise.admin.wsmgmt.config.spi.Constants; 26 import com.sun.enterprise.admin.wsmgmt.filter.spi.Filter; 27 import com.sun.enterprise.admin.wsmgmt.filter.spi.FilterContext; 28 29 import javax.xml.transform.stream.*; 30 import javax.xml.transform.*; 31 import com.sun.enterprise.admin.wsmgmt.SOAPMessageContext; 32 import javax.xml.soap.SOAPMessage ; 33 import javax.xml.soap.MessageFactory ; 34 import javax.xml.soap.SOAPPart ; 35 36 import java.io.StringBufferInputStream ; 37 import java.io.StringWriter ; 38 39 import javax.xml.parsers.FactoryConfigurationError ; 40 import javax.xml.parsers.ParserConfigurationException ; 41 import javax.xml.parsers.SAXParser ; 42 import javax.xml.parsers.SAXParserFactory ; 43 44 import org.xml.sax.SAXException ; 45 import org.xml.sax.SAXParseException ; 46 import org.xml.sax.InputSource ; 47 import org.xml.sax.XMLReader ; 48 import org.xml.sax.XMLFilter ; 49 50 import javax.xml.transform.Transformer ; 51 import javax.xml.transform.TransformerException ; 52 import javax.xml.transform.TransformerFactory ; 53 import javax.xml.transform.TransformerConfigurationException ; 54 55 import javax.xml.transform.sax.SAXTransformerFactory ; 56 import javax.xml.transform.sax.SAXSource ; 57 import javax.xml.transform.sax.SAXResult ; 58 59 import javax.xml.transform.stream.StreamSource ; 60 import javax.xml.transform.stream.StreamResult ; 61 62 import java.io.File ; 63 import java.util.LinkedList ; 64 import java.util.List ; 65 import java.util.HashMap ; 66 import com.sun.enterprise.admin.wsmgmt.config.spi.TransformationRule; 67 import com.sun.enterprise.util.SystemPropertyConstants; 68 69 import java.util.logging.Logger ; 70 import java.util.logging.Level ; 71 import com.sun.logging.LogDomains; 72 import com.sun.enterprise.util.i18n.StringManager; 73 74 77 public class FilterChain { 78 79 85 public FilterChain() throws TransformException { 86 try { 87 SAXParserFactory spf = SAXParserFactory.newInstance(); 89 SAXParser parser = spf.newSAXParser(); 90 _reader = parser.getXMLReader(); 91 92 _stf = (SAXTransformerFactory ) TransformerFactory.newInstance(); 93 _transformer = _stf.newTransformer(); 94 } catch(Exception e) { 95 throw new TransformException(e); 96 } 97 } 98 99 public synchronized void addFilter(TransformationRule[] tRules, 100 boolean reverse) throws TransformException { 101 if ((tRules == null) || (tRules.length == 0)) { 102 return; 103 } 104 if ( reverse == false) { 105 for(int idx =0; idx < tRules.length; idx++) { 106 addFilter(idx, tRules[idx]); 107 } 108 } else { 109 int index =0; 110 for(int idx = tRules.length -1; idx > -1; idx--) { 111 addFilter(index, tRules[idx]); 112 index++; 113 } 114 } 115 } 116 117 public synchronized void addFilter(int index, TransformationRule tRule) 118 throws TransformException { 119 try { 120 if (tRule == null) { 121 return; 122 } 123 String name = tRule.getName(); 124 File stylesheet = new File (tRule.getRuleFileLocation()); 127 if ( !stylesheet.isAbsolute()) { 128 String instanceRoot = System.getProperty( 130 SystemPropertyConstants.INSTANCE_ROOT_PROPERTY); 131 132 stylesheet = new File ( instanceRoot 133 + File.separator+tRule.getRuleFileLocation()); 134 } 135 XMLFilter filter = _stf.newXMLFilter(new StreamSource (stylesheet)); 136 addToList(index,name,filter); 137 } catch(Exception e) { 138 String msg = _stringMgr.getString("rule_not_compiled", 139 tRule.getRuleFileLocation(), tRule.getName()); 140 _logger.log(Level.WARNING, msg); 141 throw new TransformException(e); 142 } 143 } 144 145 public synchronized void removeFilter(int index) { 146 removeFromList(index); 147 } 148 149 private void addToList(int index, String name, XMLFilter filter) { 150 FilterData parent = null; 151 if ( index == 0) { 152 parent = null; 153 filter.setParent(_reader); 154 } else { 155 parent = (FilterData) filterList.get(index-1); 156 filter.setParent(parent.getFilter()); 157 if ( filterList.size() -1 > index) { 159 FilterData child = (FilterData) filterList.get(index); 160 if ( child != null) { 161 child.getFilter().setParent(filter); 162 } 163 } 164 } 165 166 filterList.add(index, new FilterData(name,filter)); 167 } 168 169 private void removeFromList(int index) { 170 FilterData current = (FilterData) filterList.get(index); 171 172 if ( current == null) { 173 return; 174 } 175 176 FilterData parent = null; 177 if ( index == 0) { 178 parent = null; 179 } else { 180 parent = (FilterData) filterList.get(index-1); 181 } 182 183 FilterData child = null; 184 if ( index +1 < filterList.size()) { 185 child = (FilterData) filterList.get(index+1); 186 } 187 if ( child != null) { 188 if ( parent == null) { 189 child.getFilter().setParent(_reader); 190 } else { 191 child.getFilter().setParent(parent.getFilter()); 192 } 193 } 194 } 195 196 201 public synchronized void process(FilterContext context) 202 throws TransformException { 203 204 if (( filterList.size() == 0 ) || (context == null)) { 205 return; 206 } 207 208 try { 209 210 SOAPMessageContext smc = context.getMessageContext(); 211 SOAPMessage sm = smc.getMessage(); 212 SOAPPart sp = sm.getSOAPPart(); 213 Source s = sp.getContent(); 215 216 InputSource inputSrc = SAXSource.sourceToInputSource(s); 219 SAXSource transformSource = new SAXSource ( 220 ((FilterData)filterList.getLast()).getFilter(), inputSrc); 221 222 StringWriter sw = new StringWriter (STRING_WRITER_INIT_SIZE); 223 Result r = new StreamResult (sw); 224 _transformer.transform(transformSource, r); 225 sw.flush(); 227 sw.close(); 228 StringBufferInputStream in = new StringBufferInputStream ( 229 sw.toString()); 230 MessageFactory mFactory = MessageFactory.newInstance(); 231 SOAPMessage resMsg = mFactory.createMessage(null, in); 232 smc.setMessage(resMsg); 233 234 235 } catch(Exception e) { 236 _logger.fine("XSLT transformation failed for " 237 + context.getFullyQualifiedName()); 238 throw new TransformException(e); 239 } 240 241 } 242 243 LinkedList filterList = new LinkedList (); 245 XMLReader _reader = null; 246 SAXTransformerFactory _stf = null; 247 Transformer _transformer = null; 248 249 static final int STRING_WRITER_INIT_SIZE = 4028; 251 252 private static final Logger _logger = 253 Logger.getLogger(LogDomains.ADMIN_LOGGER); 254 private static final StringManager _stringMgr = 255 StringManager.getManager(FilterChain.class); 256 257 } 258 | Popular Tags |