/* * Copyright 2011 Chad Retz * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.gwtnode.dev.debug; import java.util.ArrayList; import java.util.List; import org.gwtnode.core.node.buffer.Buffer; import org.gwtnode.dev.debug.message.Value; /** * Builder for a buffer for OOPHM * * @author Chad Retz */ public class BufferBuilder { private final List<Object> objects = new ArrayList<Object>(); private int length = 0; public <T> BufferBuilder appendArray(T[] values) { append(values.length); for (int i = 0; i < values.length; i++) { append(values[i]); } return this; } public BufferBuilder append(Object object) { if (object == null) { return this; } else if (object.getClass() == Boolean.class || "boolean".equals(object.getClass().getName())) { length++; } else if (object.getClass() == Byte.class || "byte".equals(object.getClass().getName())) { length++; } else if (object.getClass() == Character.class || "char".equals(object.getClass().getName())) { length += 2; } else if (object.getClass() == Short.class || "short".equals(object.getClass().getName())) { length += 2; } else if (object.getClass() == Integer.class || "int".equals(object.getClass().getName())) { length += 4; } else if (object.getClass() == Float.class || "float".equals(object.getClass().getName())) { length += 4; } else if (object.getClass() == Double.class || "double".equals(object.getClass().getName())) { length += 8; } else if (object.getClass() == String.class) { length += BufferStream.getStringByteLength((String) object); } else if (object.getClass() == Value.class) { append(((Value<?>) object).getType()); if (((Value<?>) object).getValue() != null) { return append(((Value<?>) object).getValue()); } else { return this; } } else if (object instanceof Enum) { length++; } else { throw new IllegalArgumentException("Unknown object type: " + object.getClass()); } objects.add(object); return this; } public Buffer toBuffer() { Buffer buffer = Buffer.create(length); int offset = 0; for (Object object : objects) { if (object.getClass() == Boolean.class || "boolean".equals(object.getClass().getName())) { buffer.set(offset, (byte) (((Boolean) object) ? 1 : 0)); offset++; } else if (object.getClass() == Byte.class || "byte".equals(object.getClass().getName())) { buffer.set(offset, (Byte) object); offset++; } else if (object.getClass() == Character.class || "char".equals(object.getClass().getName())) { buffer.writeInt16BE((short) ((Character) object).charValue(), offset); offset += 2; } else if (object.getClass() == Short.class || "short".equals(object.getClass().getName())) { buffer.writeInt16BE((Short) object, offset); offset += 2; } else if (object.getClass() == Integer.class || "int".equals(object.getClass().getName())) { buffer.writeInt32BE((Integer) object, offset); offset += 4; } else if (object.getClass() == Float.class || "float".equals(object.getClass().getName())) { buffer.writeFloatBE((Float) object, offset); offset += 4; } else if (object.getClass() == Double.class || "double".equals(object.getClass().getName())) { buffer.writeDoubleBE((Double) object, offset); offset += 8; } else if (object.getClass() == String.class) { buffer.writeInt32BE(Buffer.byteLength((String) object), offset); buffer.write((String) object, offset + 4); offset += BufferStream.getStringByteLength((String) object); } else if (object instanceof Enum) { buffer.set(offset, (byte) ((Enum<?>) object).ordinal()); offset++; } else { throw new IllegalArgumentException("Unknown object type: " + object.getClass()); } } return buffer; } }