/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.cocoon.webapps.session.xml; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Properties; import javax.xml.transform.OutputKeys; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.ComponentSelector; import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.components.CocoonComponentManager; import org.apache.cocoon.components.source.SourceUtil; import org.apache.cocoon.serialization.Serializer; import org.apache.cocoon.xml.XMLUtils; import org.apache.cocoon.xml.dom.DOMStreamer; import org.apache.excalibur.source.ModifiableSource; import org.apache.excalibur.source.Source; import org.apache.excalibur.source.SourceException; import org.apache.excalibur.source.SourceParameters; import org.apache.excalibur.source.SourceResolver; import org.w3c.dom.DocumentFragment; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * A utility class which will soon be removed... * * @author <a href="mailto:cziegeler@s-und-n.de">Carsten Ziegeler</a> * @deprecated This block is deprecated and will be removed in future versions. * @version CVS $Id$ */ public final class XMLUtil { /** * Convert umlaute to entities */ public static String encode(String value) { StringBuffer buffer = new StringBuffer(value); for(int i = 0; i < buffer.length(); i++) { if (buffer.charAt(i) > 127) { buffer.replace(i, i+1, "__"+((int)buffer.charAt(i))+";"); } } return buffer.toString(); } /** * Convert entities to umlaute */ public static String decode(String value) { StringBuffer buffer = new StringBuffer(value); int pos; boolean found; for(int i = 0; i < buffer.length(); i++) { if (buffer.charAt(i) == '_' && buffer.charAt(i+1) == '_') { pos = i + 2; found = false; while (buffer.charAt(pos) >= '0' && buffer.charAt(pos) <= '9') { found = true; pos++; } if (found == true && pos > i + 2 && buffer.charAt(pos) == ';') { int ent = new Integer(buffer.substring(i+2, pos)).intValue(); buffer.replace(i, pos+1, ""+ (char)ent); } } } return buffer.toString(); } /** * Write a DOM Fragment to a source. * If the source is a ModifiableSource the interface is used. * If not, the source is invoked with an additional parameter named * "content" containing the XML. * * @param location URI of the Source * @param typeParameters Type of Source query. Currently, only * <code>method</code> parameter (value typically <code>GET</code> or * <code>POST</code>) is recognized. May be <code>null</code>. * @param parameters Parameters (e.g. URL params) of the source. * May be <code>null</code> * @param frag DOM fragment to serialize to the Source * @param resolver Resolver for the source. * @param serializerName The serializer to use * @throws ProcessingException */ public static void writeDOM(String location, Parameters typeParameters, SourceParameters parameters, DocumentFragment frag, SourceResolver resolver, String serializerName) throws ProcessingException { Source source = null; try { source = SourceUtil.getSource(location, typeParameters, parameters, resolver); if (source instanceof ModifiableSource) { ModifiableSource ws = (ModifiableSource) source; frag.normalize(); if (null != serializerName) { ComponentManager manager = CocoonComponentManager.getSitemapComponentManager(); ComponentSelector selector = null; Serializer serializer = null; OutputStream oStream = null; try { selector = (ComponentSelector)manager.lookup(Serializer.ROLE + "Selector"); serializer = (Serializer)selector.select(serializerName); oStream = ws.getOutputStream(); serializer.setOutputStream(oStream); serializer.startDocument(); DOMStreamer streamer = new DOMStreamer(serializer); streamer.stream(frag); serializer.endDocument(); } catch (ComponentException e) { throw new ProcessingException("Unable to lookup serializer.", e); } finally { if (oStream != null) { oStream.flush(); try { oStream.close(); } catch (Exception ignore) { } } if (selector != null) { selector.release(serializer); manager.release(selector); } } } else { Properties props = XMLUtils.createPropertiesForXML(false); props.put(OutputKeys.ENCODING, "ISO-8859-1"); final String content = XMLUtils.serializeNode(frag, props); OutputStream oStream = ws.getOutputStream(); oStream.write(content.getBytes()); oStream.flush(); oStream.close(); } } else { String content; if (null != serializerName) { ComponentManager manager = CocoonComponentManager.getSitemapComponentManager(); ComponentSelector selector = null; Serializer serializer = null; ByteArrayOutputStream oStream = new ByteArrayOutputStream(); try { selector = (ComponentSelector)manager.lookup(Serializer.ROLE + "Selector"); serializer = (Serializer)selector.select(serializerName); serializer.setOutputStream(oStream); serializer.startDocument(); DOMStreamer streamer = new DOMStreamer(serializer); streamer.stream(frag); serializer.endDocument(); } catch (ComponentException e) { throw new ProcessingException("Unable to lookup serializer.", e); } finally { oStream.flush(); try { oStream.close(); } catch (Exception ignore) { // do nothing } if (selector != null) { selector.release(serializer); manager.release(selector); } } content = oStream.toString(); } else { Properties props = XMLUtils.createPropertiesForXML(false); props.put(OutputKeys.ENCODING, "ISO-8859-1"); content = XMLUtils.serializeNode(frag, props); } if (parameters == null) { parameters = new SourceParameters(); } else { parameters = (SourceParameters) parameters.clone(); } parameters.setSingleParameterValue("content", content); source = SourceUtil.getSource(location, typeParameters, parameters, resolver); SourceUtil.toSAX(source, new DefaultHandler()); } } catch (SourceException e) { throw SourceUtil.handle(e); } catch (IOException e) { throw new ProcessingException(e); } catch (SAXException e) { throw new ProcessingException(e); } finally { resolver.release(source); } } }