@Override
  public void agentCreated() {
    hs = new HelloService(getExternalAccess());
    ps = new SendPositionService(getExternalAccess());

    addDirectService(hs);
    addDirectService(ps);

    String host = (String) getArgument("host");
    Integer port = (Integer) getArgument("port");
    Integer robotIdx = (Integer) getArgument("robId");
    Integer devIdx = (Integer) getArgument("devIndex");
    Boolean hasLaser = (Boolean) getArgument("laser");
    Boolean hasLocalize = (Boolean) getArgument("localize");

    /** Device list */
    CopyOnWriteArrayList<Device> devList = new CopyOnWriteArrayList<Device>();
    devList.add(new Device(IDevice.DEVICE_POSITION2D_CODE, host, port, devIdx));
    devList.add(new Device(IDevice.DEVICE_RANGER_CODE, host, port, devIdx));
    devList.add(new Device(IDevice.DEVICE_SONAR_CODE, host, port, devIdx));
    devList.add(new Device(IDevice.DEVICE_SIMULATION_CODE, host, port, -1));

    if (hasLocalize == true) {
      devList.add(new Device(IDevice.DEVICE_PLANNER_CODE, host, port + 1, devIdx));
      devList.add(new Device(IDevice.DEVICE_LOCALIZE_CODE, host, port + 1, devIdx));
    }

    /** Optional laser ranger */
    if (hasLaser == true)
      devList.add(new Device(IDevice.DEVICE_RANGER_CODE, host, port, devIdx + 1));

    /** Host list */
    CopyOnWriteArrayList<Host> hostList = new CopyOnWriteArrayList<Host>();
    hostList.add(new Host(host, port));

    /** Optional planner device */
    if (hasLocalize == true) hostList.add(new Host(host, port + 1));

    /** Get the device node */
    setDeviceNode(
        new DeviceNode(
            hostList.toArray(new Host[hostList.size()]),
            devList.toArray(new Device[devList.size()])));
    getDeviceNode().runThreaded();

    setRobot(new Pioneer(getDeviceNode().getDeviceListArray()));
    getRobot().setRobotId("r" + robotIdx);

    /** Check if a particular position is set */
    Position setPose =
        new Position(
            (Double) getArgument("X"), (Double) getArgument("Y"), (Double) getArgument("Angle"));

    if (setPose.equals(new Position(0, 0, 0)) == false) getRobot().setPosition(setPose);

    sendHello();
  }
 public void finishVerification(
     ActionListener<VerifyResponse> listener,
     List<DiscoveryNode> nodes,
     CopyOnWriteArrayList<VerificationFailure> errors) {
   listener.onResponse(
       new RepositoriesService.VerifyResponse(
           nodes.toArray(new DiscoveryNode[nodes.size()]),
           errors.toArray(new VerificationFailure[errors.size()])));
 }
 @Override
 public synchronized Object[] toArray(final Object[] a) {
   return copyOnWriteArrayList.toArray(a);
 }
 @Override
 public Object[] toArray() {
   return copyOnWriteArrayList.toArray();
 }