001: /* Copyright 2004-2006 David N. Welton
002:
003: Licensed under the Apache License, Version 2.0 (the "License");
004: you may not use this file except in compliance with the License.
005: You may obtain a copy of the License at
006:
007: http://www.apache.org/licenses/LICENSE-2.0
008:
009: Unless required by applicable law or agreed to in writing, software
010: distributed under the License is distributed on an "AS IS" BASIS,
011: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012: See the License for the specific language governing permissions and
013: limitations under the License.
014: */
015:
016: package org.hecl;
017:
018: /**
019: * The <code>StringThing</code> class is the internal representation of string
020: * types. This is somewhat special, as all types in Hecl may be represented as
021: * strings.
022: *
023: * @author <a href="mailto:davidw@dedasys.com">David N. Welton </a>
024: * @version 1.0
025: */
026: public class StringThing implements RealThing {
027: private StringBuffer val;
028:
029: /**
030: * Creates a new, empty <code>StringThing</code> instance.
031: *
032: */
033: public StringThing() {
034: this ((String) null);
035: }
036:
037: /**
038: * Creates a new <code>StringThing</code> instance from a string.
039: *
040: * @param s
041: * a <code>String</code> value
042: */
043: public StringThing(String s) {
044: val = s != null ? new StringBuffer(s) : new StringBuffer();
045: }
046:
047: /**
048: * Creates a new <code>StringThing</code> instance from a stringbuffer.
049: *
050: * @param sb
051: * a <code>StringBuffer</code> value
052: */
053: public StringThing(StringBuffer sb) {
054: val = sb;
055: }
056:
057: public String thingclass() {
058: return "string";
059: }
060:
061: /**
062: * The <code>create</code> method creates and returns a newly allocated
063: * <code>Thing</code> with a <code>StringThing</code> internal representation.
064: *
065: * @param s A <code>String</code> value which may be <code>null</code>.
066: * @return A <code>Thing</code> value
067: */
068: public static Thing create(String s) {
069: return new Thing(new StringThing(s != null ? s : ""));
070: }
071:
072: /**
073: * The <code>setStringFromAny</code> method transforms the Thing into a
074: * string type.
075: *
076: * @param thing
077: * a <code>Thing</code> value
078: * @throws HeclException
079: */
080: private static void setStringFromAny(Thing thing) {
081: RealThing realthing = thing.getVal();
082: if (!(realthing instanceof StringThing)) {
083: thing.setVal(new StringThing(thing.toString()));
084: }
085: }
086:
087: /**
088: * <code>get</code> returns a string representation of a given Thing,
089: * transforming the thing into a string type at the same time.
090: *
091: * @param thing
092: * a <code>Thing</code> value
093: * @return a <code>String</code> value
094: * @throws HeclException
095: */
096: public static String get(Thing thing) {
097: setStringFromAny(thing);
098: return thing.toString();
099: }
100:
101: /**
102: * <code>deepcopy</code> copies the string.
103: *
104: * @return a <code>RealThing</code> value
105: */
106: public RealThing deepcopy() {
107: return new StringThing(new StringBuffer(val.toString()));
108: }
109:
110: /**
111: * <code>getStringRep</code> returns its internal value.
112: *
113: * @return a <code>String</code> value
114: */
115: public String getStringRep() {
116: return val.toString();
117: }
118:
119: /**
120: * <code>append</code> takes a character and appends it to the string.
121: *
122: * @param ch
123: * a <code>char</code> value
124: */
125: public void append(char ch) {
126: val.append(ch);
127: }
128:
129: /**
130: * <code>append</code> appends a string to the string.
131: *
132: * @param str
133: * a <code>String</code> value
134: */
135: public void append(String str) {
136: val.append(str);
137: }
138: }
|