org.objectfabric.GWTPlatform.java Source code

Java tutorial

Introduction

Here is the source code for org.objectfabric.GWTPlatform.java

Source

/**
 * 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.OutputStream;
import java.io.PrintStream;
import java.util.Date;

import org.objectfabric.Workspace.Granularity;

import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.TimeZone;
import com.google.gwt.user.client.Random;
import com.google.gwt.user.client.Timer;

class GWTPlatform extends Platform {

    private static final DateTimeFormat _utcNowFormat = DateTimeFormat.getFormat("yyyy.MM.dd'-'HH:mm:ss.SSS z");

    static {
        if (!com.google.gwt.core.client.GWT.isClient())
            throw new RuntimeException("Server code has GWT imports.");

        set(new GWTPlatform());
    }

    static void loadClass() {
        if (Debug.ENABLED)
            Debug.assertion(get() instanceof GWTPlatform);
    }

    @Override
    int value() {
        return GWT;
    }

    @Override
    URI resolve(String uri, URIResolver resolver) {
        GWTURI parsed = new GWTURI(uri);
        String path = "";

        if (parsed.getPath() != null)
            path += parsed.getPath();

        if (parsed.getQuery() != null)
            path += parsed.getQuery();

        if (parsed.getFragment() != null)
            path += "#" + parsed.getFragment();

        Address address = new Address(parsed.getScheme(), parsed.getHost(), parsed.getPort());
        return resolver.resolve(address, path);
    }

    //

    @Override
    String lineSeparator() {
        return "\n";
    }

    @Override
    char fileSeparator() {
        return '/';
    }

    @Override
    String[] split(String value, char... chars) {
        return value.split("[" + new String(chars) + "]");
    }

    @Override
    Object[] copyWithTypedResize(Object[] source, int length, Object[] target) {
        if (target.length < source.length)
            target = new Object[source.length];

        System.arraycopy(source, 0, target, 0, source.length);
        return target;
    }

    @Override
    Object[] clone(Object[] array) {
        Object[] clone = new Object[array.length];
        System.arraycopy(array, 0, clone, 0, clone.length);
        return clone;
    }

    @Override
    long[] clone(long[] array) {
        long[] clone = new long[array.length];
        System.arraycopy(array, 0, clone, 0, clone.length);
        return clone;
    }

    @Override
    Buff newBuff(int capacity, boolean recycle) {
        return new GWTBuff(capacity, recycle);
    }

    Uint8Array newUint8Array(int capacity) {
        return Uint8Array.create(capacity);
    }

    @Override
    Object getReferenceQueue() {
        return null;
    }

    @Override
    Workspace newCustomWorkspace(CustomLocation store) {
        return null;
    }

    //

    @Override
    boolean randomBoolean() {
        return Random.nextBoolean();
    }

    @Override
    int randomInt(int limit) {
        return Random.nextInt(limit);
    }

    @Override
    int randomInt() {
        return Random.nextInt();
    }

    @Override
    double randomDouble() {
        return Random.nextDouble();
    }

    /**
     * TODO window.crypto.getRandomValues.
     */
    @Override
    byte[] newUID_() {
        byte[] bytes = new byte[UID.LENGTH];
        int n = 0;

        for (int i = 0; i < 4; i++) {
            int value = Random.nextInt();
            bytes[n++] = (byte) (value >>> 0);
            bytes[n++] = (byte) (value >>> 8);
            bytes[n++] = (byte) (value >>> 16);
            bytes[n++] = (byte) (value >>> 24);
        }

        return bytes;
    }

    //

    // TODO move to Platform
    @Override
    int floatToInt(float value) {
        return Float.floatToIntBits(value);
    }

    @Override
    float intToFloat(int value) {
        return Float.intBitsToFloat(value);
    }

    @Override
    long doubleToLong(double value) {
        return Double.doubleToLongBits(value);
    }

    @Override
    double longToDouble(long value) {
        return Double.longBitsToDouble(value);
    }

    //

    @Override
    String formatLog(String message) {
        String header = _utcNowFormat.format(new Date(), TimeZone.createTimeZone(0));
        return header + ", " + message;
    }

    @Override
    void logDefault(String message) {
        console(message);
    }

    native void console(String message) /*-{
                                        console.log(message);
                                        }-*/;

    @Override
    String getStackAsString(Throwable t) {
        final StringBuilder sb = new StringBuilder();

        PrintStream stream = new PrintStream((OutputStream) null) {

            @Override
            public void println(Object s) {
                sb.append(s);
            }

            @Override
            public void println(String s) {
                sb.append(s);
            }
        };

        t.printStackTrace(stream);
        return (t.getMessage() != null ? t.getMessage() : "") + sb.toString();
    }

    // Class

    @Override
    Class enclosingClass(Class c) {
        throw new UnsupportedOperationException();
    }

    @Override
    boolean isInstance(Class c, Object o) {
        throw new UnsupportedOperationException();
    }

    //

    @Override
    void sleep(long millis) {
        throw new UnsupportedOperationException();
    }

    @Override
    void assertLock(Object lock, boolean hold) {
    }

    @Override
    void execute(final Runnable runnable) {
        Timer timer = new Timer() {

            @Override
            public void run() {
                runnable.run();
            }
        };

        timer.schedule(0);
    }

    @Override
    void schedule(final Runnable runnable, int ms) {
        Timer timer = new Timer() {

            @Override
            public void run() {
                runnable.run();
            }
        };

        timer.schedule(ms);
    }

    @Override
    long approxTimeMs() {
        return System.currentTimeMillis();
    }

    @Override
    String simpleName(Class c) {
        String name = c.getName();
        String[] parts = name.split("[.]");
        return parts.length <= 1 ? name : parts[parts.length - 1];
    }

    //

    @Override
    String toXML(Object model, String schema) {
        throw new UnsupportedOperationException();
    }

    @Override
    Object fromXMLFile(String file) {
        throw new UnsupportedOperationException();
    }

    // Debug

    @Override
    Workspace newTestWorkspace(Granularity granularity) {
        return null;
    }

    @Override
    Server newTestServer() {
        return null;
    }

    @Override
    URIHandler newTestStore(String path) {
        return null;
    }

    //

    @Override
    boolean shallowEquals(Object a, Object b, Class c, String... exceptions) {
        if (c.isArray()) {
            Object[] x = (Object[]) a;
            Object[] y = (Object[]) b;

            if (x.length != y.length)
                return false;

            for (int i = 0; i < x.length; i++)
                if (!referenceLevelEquals(c.getComponentType(), x[i], y[i]))
                    return false;
        } else {
            // Cannot clone arrays in GWT, so their type might be Object[]
            if (a.getClass() != b.getClass())
                return false;
        }

        return true;
    }

    private static boolean referenceLevelEquals(Class c, Object a, Object b) {
        // Primitives will be boxed so equals
        if (c.isPrimitive())
            return a.equals(b);

        // Otherwise use ==
        return a == b;
    }

    @Override
    Object getCurrentStack() {
        throw new UnsupportedOperationException();
    }

    @Override
    void assertCurrentStack(Object previous) {
        throw new UnsupportedOperationException();
    }

    @Override
    Object getPrivateField(Object object, String name, Class c) {
        throw new UnsupportedOperationException();
    }

    @Override
    TType getTypeField(Class c) {
        throw new UnsupportedOperationException();
    }

    @Override
    void writeAndResetAtomicLongs(Object object, boolean write) {
        throw new UnsupportedOperationException();
    }
}