00001
00002 package de.aitools.aq.value.single;
00003
00004 import java.io.PrintStream;
00005 import java.util.Scanner;
00006
00007 import com.sun.jna.Memory;
00008 import com.sun.jna.Native;
00009 import com.sun.jna.Pointer;
00010
00011 import de.aitools.aq.check.A;
00012 import de.aitools.aq.value.Value;
00013
00018 public class SingleString extends Value {
00019
00020 public static final int NATIVE_TYPE_ID = 105;
00021
00022 private static final int SIZEOF_STRING_SIZE = Value.SIZEOF_SHORT;
00023
00024 public SingleString() {
00025 e = new String();
00026 }
00027
00028 public SingleString(String e) {
00029 setString(e);
00030 }
00031
00032 public SingleString(SingleString string) {
00033 e = string.e;
00034 }
00035
00036 public String getString() {
00037 return e;
00038 }
00039
00040 public void setString(String e) {
00041 A.CHECK_NOT_NULL(e);
00042 this.e = e;
00043 }
00044
00045 @Override
00046 public void copyFrom(Pointer buffer) {
00047 short stringSize = buffer.getShort(0);
00048 e = Native.toString(buffer.getByteArray(
00049 SIZEOF_STRING_SIZE, stringSize));
00050 }
00051
00052 @Override
00053 public void copyTo(Pointer buffer) {
00054 byte[] bytes = Native.toByteArray(e);
00055 A.CHECK(bytes.length <= Short.MAX_VALUE, "Too long string");
00056 buffer.setShort(0, (short) bytes.length);
00057 buffer.write(SIZEOF_STRING_SIZE, bytes, 0, bytes.length);
00058 }
00059
00060 @Override
00061 public boolean parseFrom(Scanner sc) {
00062 if (sc.hasNext()) e = sc.next();
00063 else return false;
00064 return true;
00065 }
00066
00067 @Override
00068 public PrintStream printTo(PrintStream stream) {
00069 A.CHECK(e.indexOf('\t') == -1, "No tabulator allowed in string");
00070 stream.print(e);
00071 return stream;
00072 }
00073
00074 @Override
00075 public Memory getSharedMemory() {
00076 return new Memory(getSerializedSize());
00077 }
00078
00079 @Override
00080 public int getSerializedSize() {
00081 return SIZEOF_STRING_SIZE + Native.toByteArray(e).length;
00082 }
00083
00084 @Override
00085 public int hashCode() {
00086 final int prime = 31;
00087 int result = 1;
00088 result = prime * result + ((e == null) ? 0 : e.hashCode());
00089 return result;
00090 }
00091
00092 @Override
00093 public boolean equals(Object obj) {
00094 if (this == obj)
00095 return true;
00096 if (obj == null)
00097 return false;
00098 if (getClass() != obj.getClass())
00099 return false;
00100 SingleString other = (SingleString) obj;
00101 if (e == null) {
00102 if (other.e != null)
00103 return false;
00104 } else if (!e.equals(other.e))
00105 return false;
00106 return true;
00107 }
00108
00109 private String e;
00110 }