All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.objectfabric.FileWriterTArray Maven / Gradle / Ivy

The newest version!
/**
 * 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;

import java.io.File;
import java.io.FileReader;

class FileWriterTArray extends FileGenerator {

    protected final String _name;

    protected final Class _type;

    public FileWriterTArray(Generator generator, String packag, Class type) {
        this(generator, "TArray", packag, type);
    }

    public FileWriterTArray(Generator generator, String name, String packag, Class type) {
        super(generator, packag, name + getName(type));

        _name = name;
        _type = type;
    }

    protected static String getName(Class type) {
        if (type == byte[].class)
            return "Binary";

        return type != Object.class ? type.getSimpleName() : "";
    }

    @Override
    protected void body() {
        StringBuilder template = getTemplate("src/main/java/org/objectfabric/" + _name + "Template.java");
        replaceSpecific(template);
        replaceCommon(template);
        write(template);
    }

    static StringBuilder getTemplate(String path) {
        try {
            File file = new File(path);
            FileReader reader = new FileReader(file);
            char[] chars = new char[(int) file.length()];
            reader.read(chars);
            return new StringBuilder(new String(chars));
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }

    protected void replaceSpecific(StringBuilder template) {
        if (_type == TObject.class)
            Utils.replace(template, "Immutable.FLOAT.type()", "TObject.TYPE");

        if (_type == Object.class) {
            Utils.replace(template, ", Immutable.FLOAT.type()", "");
            Utils.replace(template, "_genericParameters = new TType[] { Immutable.FLOAT.type() };", "_genericParameters = null;");
            Utils.replace(template, "implements Iterable", "implements Iterable ");
            Utils.replace(template, "public final float get", "public final E get");
            Utils.replace(template, "return value;", "return (E) value;");
            Utils.replace(template, "set(int index, float value)", "set(int index, E value)");
            Utils.replace(template, "java.util.Iterator", "java.util.Iterator");
            Utils.replace(template, "public Float next()", "public E next()");
            Utils.replace(template, "CAN_BE_TOBJECT = false;", "CAN_BE_TOBJECT = true;");
        }

        Immutable immutable = Immutable.parse(_type.getName());

        if (immutable != null) {
            Utils.replace(template, "/* generic_declaration */", " ");
            Immutable nonBoxed = immutable;

            if (immutable.isPrimitive())
                nonBoxed = immutable.nonBoxed();

            StringBuilder constant = new StringBuilder(nonBoxed.toString().toUpperCase());

            for (int i = nonBoxed.toString().length() - 1; i > 0; i--)
                if (Character.isUpperCase(nonBoxed.toString().charAt(i)))
                    constant = constant.insert(i, '_');

            Utils.replace(template, "Immutable.FLOAT", "Immutable." + constant);
        } else if (_type == TObject.class) {
            Utils.replace(template, "float", "E");
            Utils.replace(template, "Float", "E");
            Utils.replace(template, "/* generic_declaration */", " ");
        } else if (_type == Object.class) {
            Utils.replace(template, "float", "Object");
            Utils.replace(template, "Float", "Object");
            Utils.replace(template, "/* generic_declaration */", " ");
        }

        if (_type != TObject.class) {
            Utils.replace(template, "/* generic start */", "/* generic start ");
            Utils.replace(template, "/* generic end */", " generic end */");
        }

        if (_type == TObject.class) {
            Utils.replace(template, "IS_TOBJECT = false;", "IS_TOBJECT = true;");
            Utils.replace(template, "CAN_BE_TOBJECT = false;", "CAN_BE_TOBJECT = true;");
        }
    }

    private final void replaceCommon(StringBuilder template) {
        Immutable immutable = Immutable.parse(_type.getName());
        Immutable nonBoxed = null;

        if (immutable != null) {
            nonBoxed = immutable;

            if (immutable.isPrimitive()) {
                nonBoxed = immutable.nonBoxed();
                Utils.replace(template, "float", nonBoxed.java());
                Utils.replace(template, "Float", _type.getSimpleName());
            } else {
                if (_type != byte[].class) {
                    Utils.replace(template, "float", _type.getName());
                    Utils.replace(template, "Float", _type.getName());
                } else {
                    Utils.replace(template, "float", "byte[]");
                    Utils.replace(template, "Float", "byte[]");
                }
            }

            Utils.replace(template, "Template", getName(_type));
        } else if (_type == TObject.class) {
            Utils.replace(template, "Template", "TObject");
        } else if (_type == Object.class) {
            Utils.replace(template, "Template", "");
        }

        if (nonBoxed != null)
            Utils.replace(template, "0 /* Default */", nonBoxed.defaultString());
        else
            Utils.replace(template, "0 /* Default */", "null");
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy