1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package org.apache.commons.betwixt.strategy; 19 20 import org.apache.commons.betwixt.ElementDescriptor; 21 22 /** 23 * <p>Encodes body content. 24 * </p><p> 25 * <strong>Usage:</strong> 26 * Used by {@link org.apache.commons.betwixt.io.BeanWriter} to encode body content before it is written 27 * into the textual output. 28 * This gives flexibility in this stage allowing (for example) 29 * some properties to use character escaping whilst others 30 * use <code>CDATA</code> wrapping. 31 * </p> 32 * <p><strong>Note:</strong> the word <code>encoding</code> here is used 33 * in the sense of escaping a sequence of character data. 34 * </p> 35 * @author <a href='http://commons.apache.org/'>Apache Commons Team</a> 36 * @since 0.5 37 */ 38 public abstract class MixedContentEncodingStrategy { 39 40 /** 41 * The name of the option used to specify encoding on a per-element 42 * basis is 43 * <code>org.apache.commons.betwixt.mixed-content-encoding</code> 44 */ 45 public static final String ENCODING_OPTION_NAME 46 = "org.apache.commons.betwixt.mixed-content-encoding"; 47 /** The option value for CDATA */ 48 public static final String CDATA_ENCODING = "CDATA"; 49 50 /** 51 * The standard implementation used by Betwixt by default. 52 * The default is to escape as character data unless 53 * the <code>ElementDescriptor</code> contains 54 * an option with name 55 * <code>org.apache.commons.betwixt.mixed-content-encoding</code> 56 * and value <code>CDATA</code>. 57 * This is a singleton. 58 */ 59 public static final MixedContentEncodingStrategy DEFAULT 60 = new BaseMixedContentEncodingStrategy() { 61 /** 62 * Encode by escaping character data unless 63 * the <code>ElementDescriptor</code> contains 64 * an option with name 65 * <code>org.apache.commons.betwixt.mixed-content-encoding</code> 66 * and value <code>CDATA</code>. 67 */ 68 protected boolean encodeAsCDATA(ElementDescriptor element) { 69 boolean result = false; 70 if (element != null ) { 71 String optionValue = element.getOptions().getValue(ENCODING_OPTION_NAME); 72 result = CDATA_ENCODING.equals(optionValue); 73 } 74 return result; 75 } 76 }; 77 78 /** 79 * Encodes element content within a <code>CDATA</code> section. 80 * This is a singleton. 81 */ 82 public static final MixedContentEncodingStrategy CDATA 83 = new BaseMixedContentEncodingStrategy() { 84 /** 85 * Always encode by escaping character data. 86 */ 87 protected boolean encodeAsCDATA(ElementDescriptor element) { 88 return true; 89 } 90 }; 91 92 /** 93 * Encodes by escaping character data. 94 * This is a singleton. 95 */ 96 public static final MixedContentEncodingStrategy ESCAPED_CHARACTERS 97 = new BaseMixedContentEncodingStrategy() { 98 /** 99 * Always encode by escaping character data. 100 */ 101 protected boolean encodeAsCDATA(ElementDescriptor element) { 102 return false; 103 } 104 }; 105 106 107 /** 108 * Encodes the body content into a form suitable for output as 109 * (textual) xml. 110 * @param bodyContent the raw (unescaped) character data, not null 111 * @param element the <code>ElementDescriptor</code> describing the element 112 * whose content is being encoded. 113 * @return the encoded (escaped) character data, not null 114 */ 115 public abstract String encode(String bodyContent, ElementDescriptor element); 116 }