Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Licensed 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.xml.sax;
 
 import java.io.Writer;
 import java.util.Map;
Modification of the SAX buffer with parameterization capabilities. Any {name} expression inside of the character events can be replaced by the content of another SAXBuffer if it is present in the map passed to the toSAX(ContentHandler, Map<String, SAXBuffer>) method.
 
 public class ParamSAXBuffer extends SAXBuffer {

    
If ch (in characters()) contains an unmatched '{' then we save the chars from '{' onward in previous_ch. Next call to characters() prepends the saved chars to ch before processing (and sets prevChar to null).
 
     private char[] prevChar = null;
 
     public ParamSAXBuffer() {
         super();
     }
 
     public ParamSAXBuffer(final SAXBuffer saxBuffer) {
         super(saxBuffer);
     }

    
Parses text and extracts {name} parameters for later substitution.
 
     @Override
     public void characters(char[] chint startint length)
             throws SAXException {
 
         if ( != null) {
             // prepend char's from previous_ch to ch
             final char[] buf = new char[length + .];
             System.arraycopy(, 0, buf, 0, .);
             System.arraycopy(chstartbuf.length);
             ch = buf;
             start = 0;
             length += .;
              = null;
         }
 
         final int end = start + length;
         StringBuilder name;
         int j;
         for (int i = starti < endi++) {
             if (ch[i] == '{') {
                 // Send any collected characters so far
                 if (i > start) {
                     addBit(new Characters(chstarti - start));
                 }
 
                 // Find closing brace, and construct parameter name
                 name = new StringBuilder();
                 j = i + 1;
                 for (; j < endj++) {
                     if (ch[j] == '}') {
                         break;
                     }
                     name.append(ch[j]);
                 }
                 if (j == end) {
                     // '{' without a closing '}'
                     // save char's from '{' in previous_ch in case the following
                     // call to characters() provides the '}'
                      = new char[end - i];
                     System.arraycopy(chi, 0, end - i);
                     return;
                 }
                 addBit(new Parameter(name.toString()));
 
                 // Continue processing
                 i = j;
                 start = j + 1;
                continue;
            }
        }
        // Send any tailing characters
        if (start < end) {
            addBit(new Characters(chstartend - start));
        }
    }
    @Override
    public void endElement(final String namespaceURIfinal String localName,
            final String qName)
            throws SAXException {
        flushChars();
        super.endElement(namespaceURIlocalNameqName);
    }
    @Override
    public void ignorableWhitespace(final char[] chfinal int start,
            final int length)
            throws SAXException {
        flushChars();
        super.ignorableWhitespace(chstartlength);
    }
    @Override
    public void processingInstruction(final String targetfinal String data)
            throws SAXException {
        flushChars();
        super.processingInstruction(targetdata);
    }
    @Override
    public void startDocument()
            throws SAXException {
        flushChars();
        super.startDocument();
    }
    @Override
    public void startElement(final String namespaceURIfinal String localName,
            final String qNamefinal Attributes atts)
            throws SAXException {
        flushChars();
        super.startElement(namespaceURIlocalNameqNameatts);
    }
    @Override
    public void endDocument()
            throws SAXException {
        flushChars();
        super.endDocument();
    }
    @Override
    public void comment(final char[] chfinal int startfinal int length)
            throws SAXException {
        flushChars();
        super.comment(chstartlength);
    }
    @Override
    public void endDTD()
            throws SAXException {
        flushChars();
        super.endDTD();
    }
    @Override
    public void startDTD(final String namefinal String publicId,
            final String systemId)
            throws SAXException {
        flushChars();
        super.startDTD(namepublicIdsystemId);
    }
    private void flushChars() {
        // Handle saved chars (in case we had a '{' with no matching '}').
        if ( != null) {
            addBit(new Characters(, 0, .));
             = null;
        }
    }

    

Parameters:
parameters map containing SaxBuffers
    public void toSAX(final ContentHandler contentHandler,
            final Map<StringSAXBufferparameters)
            throws SAXException {
        
        for (SaxBit saxbit : ) {
            if (saxbit instanceof Parameter) {
                ((Parametersaxbit).send(contentHandlerparameters);
            } else {
                saxbit.send(contentHandler);
            }
        }
    }
    final static class Parameter implements SaxBit {
        private final String name;
        public Parameter(final String name) {
            this. = name;
        }
        @Override
        public void send(final ContentHandler contentHandler) {
        }
        public void send(final ContentHandler contentHandler,
                final Map<StringSAXBufferparameters)
                throws SAXException {
            final SAXBuffer value = parameters.get();
            if (value != null) {
                value.toSAX(contentHandler);
            }
        }
        public void toString(final StringBuilder result,
                final Map<StringStringparameters)
                throws SAXException {
            final String value = parameters.get();
            if (value != null) {
                result.append(value);
            }
        }
        @Override
        public void dump(final Writer writer)
                throws IOException {
            writer.write("[Parameter] name=" + );
        }
    }
New to GrepCode? Check out our FAQ X