001 package org.apache.commons.ognl;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements. See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership. The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License. You may obtain a copy of the License at
011 *
012 * http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied. See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022 import org.apache.commons.ognl.enhance.UnsupportedCompilationException;
023
024 /**
025 * $Id: ASTConst.java 1194869 2011-10-29 11:10:16Z mcucchiara $
026 * @author Luke Blanshard (blanshlu@netscape.net)
027 * @author Drew Davidson (drew@ognl.org)
028 */
029 public class ASTConst
030 extends SimpleNode
031 implements NodeType
032 {
033
034 private Object value;
035
036 private Class getterClass;
037
038 public ASTConst( int id )
039 {
040 super( id );
041 }
042
043 public ASTConst( OgnlParser p, int id )
044 {
045 super( p, id );
046 }
047
048 /**
049 * Called from parser actions.
050 * @param value the value to set
051 */
052 public void setValue( Object value )
053 {
054 this.value = value;
055 }
056
057 public Object getValue()
058 {
059 return value;
060 }
061
062 protected Object getValueBody( OgnlContext context, Object source )
063 throws OgnlException
064 {
065 return this.value;
066 }
067
068 public boolean isNodeConstant( OgnlContext context )
069 throws OgnlException
070 {
071 return true;
072 }
073
074 public Class getGetterClass()
075 {
076 if ( getterClass == null )
077 {
078 return null;
079 }
080
081 return getterClass;
082 }
083
084 public Class getSetterClass()
085 {
086 return null;
087 }
088
089 public String toGetSourceString( OgnlContext context, Object target )
090 {
091 if ( value == null && parent != null && ExpressionNode.class.isInstance( parent ) )
092 {
093 context.setCurrentType( null );
094 return "null";
095 }
096 else if ( value == null )
097 {
098 context.setCurrentType( null );
099 return "";
100 }
101
102 getterClass = value.getClass();
103
104 Object retval = value;
105 if ( parent != null && ASTProperty.class.isInstance( parent ) )
106 {
107 context.setCurrentObject( value );
108
109 return value.toString();
110 }
111 else if ( value != null && Number.class.isAssignableFrom( value.getClass() ) )
112 {
113 context.setCurrentType( OgnlRuntime.getPrimitiveWrapperClass( value.getClass() ) );
114 context.setCurrentObject( value );
115
116 return value.toString();
117 }
118 else if ( !( parent != null
119 && value != null
120 && NumericExpression.class.isAssignableFrom( parent.getClass() ) )
121 && String.class.isAssignableFrom( value.getClass() ) )
122 {
123 context.setCurrentType( String.class );
124
125 retval = '\"' + OgnlOps.getEscapeString( value.toString() ) + '\"';
126
127 context.setCurrentObject( retval.toString() );
128
129 return retval.toString();
130 }
131 else if ( Character.class.isInstance( value ) )
132 {
133 Character val = (Character) value;
134
135 context.setCurrentType( Character.class );
136
137 if ( Character.isLetterOrDigit( val.charValue() ) )
138 {
139 retval = "'" + ( (Character) value ).charValue() + "'";
140 }
141 else
142 {
143 retval = "'" + OgnlOps.getEscapedChar( ( (Character) value ).charValue() ) + "'";
144 }
145
146 context.setCurrentObject( retval );
147 return retval.toString();
148 }
149
150 if ( Boolean.class.isAssignableFrom( value.getClass() ) )
151 {
152 getterClass = Boolean.TYPE;
153
154 context.setCurrentType( Boolean.TYPE );
155 context.setCurrentObject( value );
156
157 return value.toString();
158 }
159
160 return value.toString();
161 }
162
163 public String toSetSourceString( OgnlContext context, Object target )
164 {
165 if ( parent == null )
166 {
167 throw new UnsupportedCompilationException( "Can't modify constant values." );
168 }
169
170 return toGetSourceString( context, target );
171 }
172
173 public <R, P> R accept( NodeVisitor<? extends R, ? super P> visitor, P data )
174 throws OgnlException
175 {
176 return visitor.visit( this, data );
177 }
178 }