package com.cosylab.acs.perftest.client;
import java.util.Vector;
import org.omg.CORBA.ORB;
import alma.acs.component.client.ComponentClient;
import com.cosylab.acs.perftest.client.ComponentClientSingleton;
import alma.perftest.SimpleBACIComponent;
import alma.perftest.ComplexBACIComponent;
import alma.ACS.RWlong;
import alma.ACS.CBlongPOA;
import alma.ACS.CBvoidPOA;
import alma.ACSErr.Completion;
import alma.ACSErr.CompletionHolder;
import alma.ACS.Monitorlong;
import alma.ACS.CBDescIn;
import alma.ACS.CBDescOut;
/**
* BACI Components Test Client
* Client application that performs tests on C++ built BACI components.
*
* @author anzez
*/
public class BCTClient
{
class CBvoidImpl extends CBvoidPOA
{
private long m_num;
private boolean m_done;
public synchronized void done(Completion completion, CBDescOut desc) {
if (--m_num == 0) {
m_done = true;
this.notify();
}
}
public synchronized void working(Completion completion, CBDescOut desc) {
}
public boolean negotiate(long arg0, CBDescOut arg1) {
return false;
}
public void setReturns(long num) {
m_num = num;
m_done = false;
}
public boolean isDone() {
return m_done;
}
}
class CBlongImpl extends CBlongPOA
{
private long m_num;
private boolean m_done;
private Vector m_queue = new Vector();
public synchronized void done(int value, Completion completion, CBDescOut desc) {
if (--m_num == 0) {
m_done = true;
this.notify();
}
}
public synchronized void working(int value, Completion completion, CBDescOut desc) {
if (desc.id_tag == 1208) {
if (--m_num == 0) {
m_done = true;
this.notify();
}
}
else {
m_queue.add(new java.lang.Long(System.currentTimeMillis()));
this.notify();
}
}
public boolean negotiate(long arg0, CBDescOut arg1) {
return false;
}
public void setReturns(long num) {
m_num = num;
m_done = false;
}
public boolean isDone() {
return m_done;
}
public boolean isEmptyQueue() {
return m_queue.size() == 0;
}
public void clearQueue() {
m_queue.clear();
}
public long nextTime() {
if (m_queue.size() == 0)
return 0;
return ((java.lang.Long)m_queue.remove(0)).longValue();
}
}
private static final String[] SBCs = new String[] {"SBC01", "SBC02", "SBC03", "SBC04", "SBC05", "SBC06", "SBC07", "SBC08", "SBC09", "SBC10", "SBC11", "SBC12", "SBC13", "SBC14", "SBC15", "SBC16"};
private static final String[] CBCs = new String[] {"CBC01", "CBC02", "CBC03", "CBC04", "CBC05", "CBC06", "CBC07", "CBC08", "CBC09", "CBC10", "CBC11", "CBC12", "CBC13", "CBC14", "CBC15", "CBC16"};
private static final String m_deviceName = "SBC00";
private static final CBDescIn descIn = new CBDescIn(50000, 50000, 1208);
private static final CBDescIn descIn2 = new CBDescIn(50000, 50000, 1209);
private SimpleBACIComponent m_SBC;
private RWlong m_property;
private CBlongImpl m_cbReturned = new CBlongImpl();
private CBvoidImpl m_cbNotified = new CBvoidImpl();
private long m_startTime, m_midTime, m_endTime;
private long m_lastTime;
private Monitorlong m_monitor = null;
public BCTClient() throws Exception {
m_SBC = alma.perftest.SimpleBACIComponentHelper.narrow(ComponentClientSingleton.getInstance().getContainerServices().getComponent(m_deviceName));
m_property = m_SBC.property();
}
public long getStartTime() {
return m_startTime;
}
public long getMidTime() {
return m_midTime;
}
public long getEndTime() {
return m_endTime;
}
/**
* TEST_1_3_1 & TEST_1_3_3
* @param loop
*/
public boolean activateSBC(long count) {
if (count > 16) return false;
SimpleBACIComponent[] SBC = new SimpleBACIComponent[(int)count];
ComponentClient cc = ComponentClientSingleton.getInstance();
m_startTime = System.currentTimeMillis();
try {
for (int i = 0; i < count; i++)
SBC[i] = alma.perftest.SimpleBACIComponentHelper.narrow(cc.getContainerServices().getComponent(SBCs[i]));
} catch (Exception e) { return false; }
m_midTime = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
SBC[i] = null;
cc.getContainerServices().releaseComponent(SBCs[i]);
}
m_endTime = System.currentTimeMillis();
return true;
}
/**
* TEST_1_3_2 & TEST_1_3_4
* @param loop
*/
public boolean activateCBC(long count) {
if (count > 16) return false;
ComplexBACIComponent[] CBC = new ComplexBACIComponent[(int)count];
ComponentClient cc = ComponentClientSingleton.getInstance();
m_startTime = System.currentTimeMillis();
try {
for (int i = 0; i < count; i++)
CBC[i] = alma.perftest.ComplexBACIComponentHelper.narrow(cc.getContainerServices().getComponent(CBCs[i]));
} catch (Exception e) { return false; }
m_midTime = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
CBC[i] = null;
cc.getContainerServices().releaseComponent(CBCs[i]);
}
m_endTime = System.currentTimeMillis();
return true;
}
/**
* TEST_2_1_1 & TEST_3_1_1
* @param loop
*/
public void getPropertySync(long loop) {
CompletionHolder completionHolder = new CompletionHolder();
m_startTime = System.currentTimeMillis();
for(int i = 0; i < loop; i++)
m_property.get_sync(completionHolder);
m_endTime = System.currentTimeMillis();
}
/**
* TEST_2_1_2 & TEST_3_1_2
* @param loop
*/
public void setPropertySync(long loop) {
m_startTime = System.currentTimeMillis();
for(int i = 0; i < loop; i++)
m_property.set_sync(0);
m_endTime = System.currentTimeMillis();
}
/**
* TEST_2_1_3 & TEST_3_1_3
* @param loop
* @return
*/
public boolean getDeviceCharacteristic(long loop) {
try {
m_startTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++)
m_SBC.get_characteristic_by_name("characteristic");
m_endTime = System.currentTimeMillis();
} catch (Exception e) { return false; }
return true;
}
/**
* TEST_2_1_4 & TEST_3_1_4
* @param loop
* @return
*/
public boolean getPropertyCharacteristic(long loop) {
try {
m_startTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++)
m_property.get_characteristic_by_name("description");
m_endTime = System.currentTimeMillis();
} catch (Exception e) { return false; }
return true;
}
/**
* TEST_2_1_5 & TEST_3_1_5
* @param loop
*/
public void methodSync(long loop) {
m_startTime = System.currentTimeMillis();
for(int i = 0; i < loop; i++)
m_SBC.method();
m_endTime = System.currentTimeMillis();
}
/**
* TEST_2_2_1_* & TEST_3_2_1_*
* @param loop
* @param delay
* @return
*/
public boolean getPropertyAsync(long loop, long delay) {
m_cbReturned.setReturns(loop);
ORB orb = ComponentClientSingleton.getInstance().getORB();
m_startTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
m_property.get_async(m_cbReturned._this(orb), descIn);
try { Thread.sleep(delay); } catch(Exception e) {}
}
m_midTime = System.currentTimeMillis();
synchronized (m_cbReturned) {
if (!m_cbReturned.isDone())
try { m_cbReturned.wait(); } catch(InterruptedException ie) {}
m_endTime = System.currentTimeMillis();
}
return m_cbReturned.isDone();
}
/**
* TEST_2_2_2_* & TEST_3_2_2_*
* @param loop
* @param delay
* @return
*/
public boolean setPropertyAsync(long loop, long delay) {
m_cbNotified.setReturns(loop);
ORB orb = ComponentClientSingleton.getInstance().getORB();
m_startTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
m_property.set_async(0, m_cbNotified._this(orb), descIn);
try { Thread.sleep(delay); } catch(Exception e) {}
}
m_midTime = System.currentTimeMillis();
synchronized (m_cbNotified) {
if (!m_cbNotified.isDone())
try { m_cbNotified.wait(); } catch (InterruptedException ie) {}
m_endTime = System.currentTimeMillis();
}
return m_cbNotified.isDone();
}
/**
* TEST_2_2_3_* & TEST_3_2_3_*
* @param loop
* @param delay
* @return
*/
public boolean actionAsync(long loop, long delay) {
m_cbNotified.setReturns(loop);
ORB orb = ComponentClientSingleton.getInstance().getORB();
m_startTime = System.currentTimeMillis();
for(int i = 0; i < loop; i++) {
m_SBC.action(m_cbNotified._this(orb), descIn);
try { Thread.sleep(delay); } catch(Exception e) {}
}
m_midTime = System.currentTimeMillis();
synchronized (m_cbNotified)
{
if (!m_cbNotified.isDone())
try { m_cbNotified.wait(); } catch (InterruptedException ie) {}
m_endTime = System.currentTimeMillis();
}
return m_cbNotified.isDone();
}
/**
* TEST_2_3_1 & TEST_3_3_1 (initialization)
* @param time
*/
public void startMonitor(long time) {
m_lastTime = 0;
m_cbReturned.clearQueue();
m_monitor = m_property.create_monitor(m_cbReturned._this(ComponentClientSingleton.getInstance().getORB()), descIn2);
m_monitor.set_timer_trigger(time * 10000); // time is in ms
}
/**
* TEST_2_3_1 & TEST_3_3_1 (finalization)
*
*/
public void stopMonitor() {
if (m_monitor != null) {
m_monitor.destroy();
m_monitor = null;
}
}
/**
* TEST_2_3_1 & TEST_3_3_1
* @return
*/
public boolean getNextMonitorResponse() {
if (m_monitor == null) return false;
m_startTime = m_lastTime;
synchronized (m_cbReturned) {
while (m_cbReturned.isEmptyQueue()) {
try { m_cbReturned.wait(); } catch (InterruptedException e) {}
}
}
m_endTime = m_cbReturned.nextTime();
m_lastTime = m_endTime;
return true;
}
/**
* TEST_2_3_2 & TEST_3_3_2
* @param loop
* @param delayIn100ns
* @return
*/
public boolean monitors(long loop, long delayIn100ns) {
ORB orb = ComponentClientSingleton.getInstance().getORB();
Monitorlong monitor;
monitor = m_property.create_monitor(m_cbReturned._this(orb), descIn);
monitor.set_timer_trigger(delayIn100ns);
synchronized (m_cbReturned)
{
m_cbReturned.setReturns(loop);
m_startTime = System.currentTimeMillis();
try { m_cbReturned.wait(); } catch (InterruptedException ie) {}
m_endTime = System.currentTimeMillis();
}
monitor.destroy();
return m_cbReturned.isDone();
}
/**
* TEST_2_3_3
* @param loop
*/
public void createMonitor(long loop) {
Monitorlong monitors[] = new Monitorlong[(int)loop];
ORB orb = ComponentClientSingleton.getInstance().getORB();
m_startTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++)
monitors[i] = m_property.create_monitor(m_cbReturned._this(orb), descIn);
m_midTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++)
monitors[i].destroy();
m_endTime = System.currentTimeMillis();
}
/**
* TEST_2_6 & TEST_3_6
* @param loop
*/
public void getCOB(long loop) {
SimpleBACIComponent[] SBC = new SimpleBACIComponent[(int)loop];
ComponentClient cc = ComponentClientSingleton.getInstance();
m_startTime = System.currentTimeMillis();
try {
for (int i = 0; i < loop; i++)
SBC[i] = alma.perftest.SimpleBACIComponentHelper.narrow(cc.getContainerServices().getComponent(m_deviceName));
} catch (Exception e) {}
m_endTime = System.currentTimeMillis();
}
public static void main(String[] args) {
System.setProperty("ACS.manager", "corbaloc::localhost:3000/Manager");
String managerLoc = System.getProperty("ACS.manager");
if (managerLoc == null) {
System.out
.println("Java property 'ACS.manager' must be set to the corbaloc of the ACS manager!");
System.exit(-1);
}
String clientName = "SimpleBACIComponentClient";
BCTClient sbcc = null;
try {
ComponentClientSingleton.prepareInstance(null, managerLoc, clientName);
sbcc = new BCTClient();
int n = 0;
// System.out.println(sbcc.getPropertyAsync(3, 1000));
sbcc.getPropertyAsync(256, 0);
// sbcc.startMonitor(256);
System.out.println("Time for 100 is: " + (sbcc.getEndTime() - sbcc.getStartTime()));
/* sbcc.startMonitor(1000);
sbcc.getNextMonitorResponse();
for (int i = 0; i < 1; i++) {
sbcc.getNextMonitorResponse();
System.out.println("Time is: " + (sbcc.getEndTime() - sbcc.getStartTime()));
}
sbcc.stopMonitor();*/
}
catch (Exception e) {
e.printStackTrace(System.err);
}
finally {
try { ComponentClientSingleton.destroyInstance(); }
catch (Exception e1) {}
}
}
}