1. /*
  2. * The Apache Software License, Version 1.1
  3. *
  4. * Copyright (c) 1999 The Apache Software Foundation. All rights
  5. * reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. *
  11. * 1. Redistributions of source code must retain the above copyright
  12. * notice, this list of conditions and the following disclaimer.
  13. *
  14. * 2. Redistributions in binary form must reproduce the above copyright
  15. * notice, this list of conditions and the following disclaimer in
  16. * the documentation and/or other materials provided with the
  17. * distribution.
  18. *
  19. * 3. The end-user documentation included with the redistribution, if
  20. * any, must include the following acknowlegement:
  21. * "This product includes software developed by the
  22. * Apache Software Foundation (http://www.apache.org/)."
  23. * Alternately, this acknowlegement may appear in the software itself,
  24. * if and wherever such third-party acknowlegements normally appear.
  25. *
  26. * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
  27. * Foundation" must not be used to endorse or promote products derived
  28. * from this software without prior written permission. For written
  29. * permission, please contact apache@apache.org.
  30. *
  31. * 5. Products derived from this software may not be called "Apache"
  32. * nor may "Apache" appear in their names without prior written
  33. * permission of the Apache Group.
  34. *
  35. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38. * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42. * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45. * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46. * SUCH DAMAGE.
  47. * ====================================================================
  48. *
  49. * This software consists of voluntary contributions made by many
  50. * individuals on behalf of the Apache Software Foundation. For more
  51. * information on the Apache Software Foundation, please see
  52. * <http://www.apache.org/>.
  53. *
  54. */
  55. package org.apache.commons.el;
  56. /**
  57. *
  58. * <p>An expression representing a String literal value.
  59. *
  60. * @author Nathan Abramson - Art Technology Group
  61. * @version $Change: 181177 $$DateTime: 2001/06/26 08:45:09 $$Author: luehe $
  62. **/
  63. public class StringLiteral
  64. extends Literal
  65. {
  66. //-------------------------------------
  67. /**
  68. *
  69. * Constructor
  70. **/
  71. StringLiteral (Object pValue)
  72. {
  73. super (pValue);
  74. }
  75. //-------------------------------------
  76. /**
  77. *
  78. * Returns a StringLiteral parsed from the given token (enclosed by
  79. * single or double quotes)
  80. **/
  81. public static StringLiteral fromToken (String pToken)
  82. {
  83. return new StringLiteral (getValueFromToken (pToken));
  84. }
  85. //-------------------------------------
  86. /**
  87. *
  88. * Returns a StringLiteral with the given string value
  89. **/
  90. public static StringLiteral fromLiteralValue (String pValue)
  91. {
  92. return new StringLiteral (pValue);
  93. }
  94. //-------------------------------------
  95. /**
  96. *
  97. * Parses the given token into the literal value
  98. **/
  99. public static String getValueFromToken (String pToken)
  100. {
  101. StringBuffer buf = new StringBuffer ();
  102. int len = pToken.length () - 1;
  103. boolean escaping = false;
  104. for (int i = 1; i < len; i++) {
  105. char ch = pToken.charAt (i);
  106. if (escaping) {
  107. buf.append (ch);
  108. escaping = false;
  109. }
  110. else if (ch == '\\') {
  111. escaping = true;
  112. }
  113. else {
  114. buf.append (ch);
  115. }
  116. }
  117. return buf.toString ();
  118. }
  119. //-------------------------------------
  120. /**
  121. *
  122. * Converts the specified value to a String token, using " as the
  123. * enclosing quotes and escaping any characters that need escaping.
  124. **/
  125. public static String toStringToken (String pValue)
  126. {
  127. // See if any escaping is needed
  128. if (pValue.indexOf ('\"') < 0 &&
  129. pValue.indexOf ('\\') < 0) {
  130. return "\"" + pValue + "\"";
  131. }
  132. // Escaping is needed
  133. else {
  134. StringBuffer buf = new StringBuffer ();
  135. buf.append ('\"');
  136. int len = pValue.length ();
  137. for (int i = 0; i < len; i++) {
  138. char ch = pValue.charAt (i);
  139. if (ch == '\\') {
  140. buf.append ('\\');
  141. buf.append ('\\');
  142. }
  143. else if (ch == '\"') {
  144. buf.append ('\\');
  145. buf.append ('\"');
  146. }
  147. else {
  148. buf.append (ch);
  149. }
  150. }
  151. buf.append ('\"');
  152. return buf.toString ();
  153. }
  154. }
  155. //-------------------------------------
  156. /**
  157. *
  158. * Converts the specified value to an identifier token, escaping it
  159. * as a string literal if necessary.
  160. **/
  161. public static String toIdentifierToken (String pValue)
  162. {
  163. // See if it's a valid java identifier
  164. if (isJavaIdentifier (pValue)) {
  165. return pValue;
  166. }
  167. // Return as a String literal
  168. else {
  169. return toStringToken (pValue);
  170. }
  171. }
  172. //-------------------------------------
  173. /**
  174. *
  175. * Returns true if the specified value is a legal java identifier
  176. **/
  177. static boolean isJavaIdentifier (String pValue)
  178. {
  179. int len = pValue.length ();
  180. if (len == 0) {
  181. return false;
  182. }
  183. else {
  184. if (!Character.isJavaIdentifierStart (pValue.charAt (0))) {
  185. return false;
  186. }
  187. else {
  188. for (int i = 1; i < len; i++) {
  189. if (!Character.isJavaIdentifierPart (pValue.charAt (i))) {
  190. return false;
  191. }
  192. }
  193. return true;
  194. }
  195. }
  196. }
  197. //-------------------------------------
  198. // Expression methods
  199. //-------------------------------------
  200. /**
  201. *
  202. * Returns the expression in the expression language syntax
  203. **/
  204. public String getExpressionString ()
  205. {
  206. return toStringToken ((String) getValue ());
  207. }
  208. //-------------------------------------
  209. }