001 /*
002 * Copyright (c) 2005 Marko Karppinen & Co. LLC
003 *
004 * Permission is hereby granted, free of charge, to any person obtaining a
005 * copy of this software and associated documentation files (the "Software"),
006 * to deal in the Software without restriction, including without limitation
007 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
008 * and/or sell copies of the Software, and to permit persons to whom the
009 * Software is furnished to do so, subject to the following conditions:
010 *
011 * The above copyright notice and this permission notice shall be included in
012 * all copies or substantial portions of the Software.
013 *
014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
015 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
016 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
017 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
018 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
019 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
020 * DEALINGS IN THE SOFTWARE.
021 */
022
023 package fi.karppinen.xml;
024
025 import gnu.xml.pipeline.EventConsumer;
026 import gnu.xml.pipeline.EventFilter;
027
028 import java.util.Map;
029
030 import org.xml.sax.SAXException;
031
032 /**
033 * Replaces PIs of the form <code><?string <var>key</var>?></code> with
034 * the <code>toString()</code> of the corresponding value in the <code>Map</code>
035 * given to the constructor.
036 *
037 * @version $Id: StringInjector.java,v 1.1 2006/10/30 19:57:09 hsivonen Exp $
038 * @author hsivonen
039 */
040 public class StringInjector extends EventFilter {
041
042 private Map map;
043
044 /**
045 *
046 */
047 public StringInjector(Map map) {
048 super();
049 this.map = map;
050 setContentHandler(this);
051 }
052
053 /**
054 * @param ec
055 */
056 public StringInjector(Map map, EventConsumer ec) {
057 super(ec);
058 this.map = map;
059 setContentHandler(this);
060 }
061
062 /**
063 * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String, java.lang.String)
064 */
065 public void processingInstruction(String target, String data)
066 throws SAXException {
067 if ("string".equals(target)) {
068 String trimmed = data.trim();
069 Object val = map.get(trimmed);
070 if(val != null) {
071 char[] chars = val.toString().toCharArray();
072 super.characters(chars, 0, chars.length);
073 } else {
074 throw new SAXException("No value for " + trimmed);
075 }
076 } else {
077 super.processingInstruction(target, data);
078 }
079 }
080
081 }