/**
* This file is part of ObjectFabric (http://objectfabric.org).
*
* ObjectFabric is licensed under the Apache License, Version 2.0, the terms
* of which may be found at http://www.apache.org/licenses/LICENSE-2.0.html.
*
* Copyright ObjectFabric Inc.
*
* This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
package org.objectfabric;
class FileWriterTArrayVersion extends FileWriterTArray {
public FileWriterTArrayVersion(Generator generator, String packag, Class<?> type) {
super(generator, "TArrayVersion", packag, type);
}
@Override
protected void replaceSpecific(StringBuilder template) {
String nl = JVMPlatform.LINE_SEPARATOR;
if (_type == TObject.class) {
Utils.replace(template, "float", "TObject");
Utils.replace(template, "Float", "TObject");
}
if (_type == Object.class) {
Utils.replace(template, "float", "Object");
Utils.replace(template, "Float", "Object");
}
if (_type == byte[].class)
Utils.replace(template, "new float[arrayLength]", "new byte[arrayLength][]");
//
Immutable immutable = Immutable.parse(_type.getName());
if (immutable != null) {
StringBuilder wb = new StringBuilder();
Immutable primitive = immutable.isPrimitive() ? immutable.nonBoxed() : immutable;
if (immutable.fixedLength()) {
wl(wb, " if (!writer.canWrite" + primitive + "()) {");
wl(wb, " writer.interrupt(null);");
wl(wb, " return;");
wl(wb, " }");
wl(wb, "");
}
wl(wb, " writer.write" + primitive + "(get(index));");
if (!immutable.fixedLength()) {
wl(wb, "");
wl(wb, " if (writer.interrupted()) {");
wl(wb, " writer.interrupt(null);");
wl(wb, " return;");
wl(wb, " }");
}
Utils.replace(template, " // Write" + nl, wb.toString());
StringBuilder rb = new StringBuilder();
if (immutable.fixedLength()) {
wl(rb, " if (!reader.canRead" + primitive + "()) {");
wl(rb, " reader.interrupt(null);");
wl(rb, " return;");
wl(rb, " }");
wl(rb, "");
}
wl(rb, " " + primitive.java() + " value = reader.read" + primitive + "();");
if (!immutable.fixedLength()) {
wl(rb, "");
wl(rb, " if (reader.interrupted()) {");
wl(rb, " reader.interrupt(null);");
wl(rb, " return;");
wl(rb, " }");
}
wl(rb, "");
wl(rb, " for (int i = versions.length - 1; i >= 0; i--)");
wl(rb, " ((TArrayVersionTemplate) versions[i]).set(index, value);");
Utils.replace(template, " // Read" + nl, rb.toString());
} else if (_type == TObject.class) {
StringBuilder wb = new StringBuilder();
wl(wb, " writer.writeTObject(get(index));");
wl(wb, "");
wl(wb, " if (writer.interrupted()) {");
wl(wb, " writer.interrupt(null);");
wl(wb, " return;");
wl(wb, " }");
Utils.replace(template, " // Write" + nl, wb.toString());
StringBuilder rb = new StringBuilder();
wl(rb, " TObject[] objects = reader.readTObject();");
wl(rb, "");
wl(rb, " if (reader.interrupted()) {");
wl(rb, " reader.interrupt(null);");
wl(rb, " return;");
wl(rb, " }");
wl(rb, "");
wl(rb, " for (int i = versions.length - 1; i >= 0; i--)");
wl(rb, " ((TArrayVersionTemplate) versions[i]).set(index, objects[i]);");
Utils.replace(template, " // Read" + nl, rb.toString());
} else {
StringBuilder wb = new StringBuilder();
wl(wb, " UnknownObjectSerializer.write(writer, get(index));");
wl(wb, "");
wl(wb, " if (writer.interrupted()) {");
wl(wb, " writer.interrupt(null);");
wl(wb, " return;");
wl(wb, " }");
Utils.replace(template, " // Write" + nl, wb.toString());
StringBuilder rb = new StringBuilder();
wl(rb, " Object object = UnknownObjectSerializer.read(reader);");
wl(rb, "");
wl(rb, " if (reader.interrupted()) {");
wl(rb, " reader.interrupt(null);");
wl(rb, " return;");
wl(rb, " }");
wl(rb, "");
wl(rb, " for (int i = versions.length - 1; i >= 0; i--) {");
wl(rb, " Object value = object;");
wl(rb, "");
wl(rb, " if (value instanceof TObject[])");
wl(rb, " value = ((TObject[]) value)[i];");
wl(rb, "");
wl(rb, " ((TArrayVersionTemplate) versions[i]).set(index, value);");
wl(rb, " }");
Utils.replace(template, " // Read" + nl, rb.toString());
}
}
private static void wl(StringBuilder sb, String line) {
sb.append(line);
sb.append(JVMPlatform.LINE_SEPARATOR);
}
}