/**
* 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.util.concurrent.atomic.AtomicInteger;
import org.junit.Assert;
import org.objectfabric.generated.Limit32;
import org.objectfabric.generated.LimitsObjectModel;
public class DistributedClient {
public static final int GO = 1, DONE = 2, CLOSING = 3, CLOSED = 4;
public static final int LIMIT = 10;
private static Limit32 _object;
private static AtomicInteger _progress;
private static int _flags;
private static volatile boolean _callback;
private static int[] _last = new int[Limit32.FIELD_COUNT];
public static void main(AtomicInteger progress, final int clients, int client, int flags) {
if (Debug.ENABLED)
Helper.instance().ProcessName = "Client " + client;
JVMPlatform.loadClass();
_progress = progress;
_flags = flags;
LimitsObjectModel.register();
final Workspace workspace = Distributed.createClientWorkspace(flags);
workspace.addURIHandler(VMURIHandler.getInstance());
String uri;
// if ((flags & Distributed.FLAG_SEPARATE_JVMS) == 0)
uri = "vm:///object";
// else
// uri = "tcp://localhost:8080/object";
workspace.openAsync(uri, new AsyncCallback<Resource>() {
@Override
public void onSuccess(Resource result) {
_object = (Limit32) result.get();
_progress.set(GO);
_object.addListener(new IndexListener() {
public void onSet(int field) {
if (Debug.ENABLED)
Debug.assertion(!_callback);
_callback = true;
int current = (Integer) _object.getField(field);
if (clients == 1 && (field == 0 || field == 1))
Assert.assertTrue(current >= _last[field]);
_last[field] = current;
if (_last[0] == LIMIT && _last[1] == LIMIT && _last[2] == LIMIT) {
int int0 = _object.int0();
int int1 = _object.int0();
int int2 = _object.int0();
Assert.assertTrue(int0 == LIMIT && int1 == LIMIT && int2 == LIMIT);
_progress.set(DONE);
}
_callback = false;
}
});
}
@Override
public void onFailure(Exception e) {
Log.write(e);
}
});
if (Debug.THREADS)
ThreadAssert.assertCurrentIsEmpty();
}
public static int[] getEndValues() {
return _last;
}
public static void step() {
if (_progress.get() == GO) {
if (_object != null && !_object.workspace().resolver().isClosing()) {
_object.atomic(new Runnable() {
public void run() {
if (_object.int1() < LIMIT)
_object.int1(_object.int1() + 1);
for (int i = 3; i < Limit32.FIELD_COUNT; i++)
_object.setField(i, Platform.get().randomInt());
}
});
_object.atomic(new Runnable() {
public void run() {
if (_object.int2() < LIMIT)
_object.int2(_object.int2() + 1);
}
});
}
} else {
if (_progress.get() == CLOSING) {
_progress.set(CLOSED);
_object.workspace().flushNotifications();
for (int i = 0; i < Limit32.FIELD_COUNT; i++)
Assert.assertEquals(_object.getField(i), _last[i]);
_object.workspace().closeAsync(null);
}
}
}
}