package org.reldb.rel.v0.values;
import java.io.PrintStream;
import org.reldb.rel.exceptions.ExceptionSemantic;
import org.reldb.rel.v0.generator.Generator;
import org.reldb.rel.v0.types.Type;
import org.reldb.rel.v0.types.TypeAlpha;
import org.reldb.rel.v0.types.builtin.TypeCharacter;
import org.reldb.rel.v0.vm.Context;
public class ValueCharacter extends ValueAlpha implements Comparable<Value> {
private static final long serialVersionUID = 0;
private String internalValue;
/** Return a String given a quote-delimited source string. Inverse of toParsableString(). */
public static String stripDelimitedString(String b) {
return StringUtils.unquote(b.substring(1, b.length() - 1));
}
/** Return a ValueCharacter given a quote-delimited source string. */
public static Value stripDelimited(Generator generator, String b) {
return new ValueCharacter(generator, stripDelimitedString(b));
}
public static ValueCharacter select(Generator generator, String x) {
return (ValueCharacter)generator.selectValue(TypeCharacter.getInstance(), new ValueCharacter(generator, x));
}
private ValueCharacter(Generator generator, String b) {
super(generator, TypeCharacter.getInstance(), new Value[1], 0);
internalValue = b;
}
public Value getComponentValue(int offsetInValue) {
return select(getGenerator(), internalValue);
}
public void setComponentValue(int offsetInValue, Value value) {
internalValue = value.stringValue();
}
public void toStream(Context context, Type contextualType, PrintStream p, int depth) {
Generator generator = getGenerator();
TypeAlpha type = (TypeAlpha)getType(context.getVirtualMachine().getRelDatabase());
setMST(generator.findMST(type, new ValueCharacter(generator, internalValue)));
String typeSignature = getType(generator.getDatabase()).getSignature();
if (typeSignature.equals(TypeCharacter.Name))
p.print((depth > 0) ? toParsableString(contextualType) : toString());
else
p.print(typeSignature + "(" + toParsableString(contextualType) + ")");
}
/** Convert this to a primitive boolean. */
public boolean booleanValue() {
return (internalValue.compareToIgnoreCase("true")==0) ? true : false;
}
/** Convert this to a primitive long. */
public long longValue() {
try {
return (long)Double.parseDouble(internalValue);
} catch (NumberFormatException nfe) {
throw new ExceptionSemantic("RS0390: '" + internalValue + "' isn't a valid number.");
}
}
/** Convert this to a primitive double. */
public double doubleValue() {
try {
return Double.parseDouble(internalValue);
} catch (NumberFormatException nfe) {
throw new ExceptionSemantic("RS0391: '" + internalValue + "' isn't a valid number.");
}
}
/** Convert this to a primitive String. */
public String stringValue() {
return internalValue;
}
public int hashCode() {
return internalValue.hashCode();
}
public int compareTo(Value v) {
return internalValue.compareTo(v.stringValue());
}
public String toString() {
return internalValue;
}
public String toParsableString(Type type) {
return "\"" + StringUtils.quote(internalValue) + "\"";
}
}