/* * Copyright: Almende B.V. (2014), Rotterdam, The Netherlands * License: The Apache Software License, Version 2.0 */ package com.almende.eve.agent; import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.List; import com.almende.eve.config.Config; import com.almende.eve.protocol.jsonrpc.annotation.Access; import com.almende.eve.protocol.jsonrpc.annotation.AccessType; import com.almende.eve.protocol.jsonrpc.annotation.Name; import com.almende.util.jackson.JOM; import com.fasterxml.jackson.databind.node.ObjectNode; /** * The Class TestScaleAgent. */ @Access(AccessType.PUBLIC) public class TestScaleAgent extends Agent { private URI parent = null; private final List<URI> children = new ArrayList<URI>(); private final List<URI> result = new ArrayList<URI>(); private final int[] resCount = new int[1]; /** * Instantiates a new test scale agent. * * @param id * the id * @param config * the config * @param parent * the parent * @param nofChildren * the nof children */ public TestScaleAgent(final String id, final Config config, final URI parent, final List<Integer> nofChildren) { super(id, config); this.parent = parent; getState().put("key", "value"); if (!nofChildren.isEmpty()) { for (int i = 0; i < nofChildren.get(0); i++) { Agent newAgent = new TestScaleAgent(id + "_" + i, config, getUrls().get(0), nofChildren.subList(1, nofChildren.size())); children.add(newAgent.getUrls().get(0)); } } } /** * Put leafs. * * @param res * the res * @throws IOException * Signals that an I/O exception has occurred. */ public void putLeafs(@Name("leafs") List<URI> res) throws IOException { synchronized (result) { result.addAll(res); } synchronized (resCount) { resCount[0]--; if (resCount[0] <= 0) { if (parent != null) { ObjectNode params = JOM.createObjectNode(); params.set("leafs", JOM.getInstance().valueToTree(result)); caller.call(parent, "putLeafs", params); } synchronized (result) { result.notifyAll(); } } } } /** * Request leafs. * * @throws IOException * Signals that an I/O exception has occurred. */ public void requestLeafs() throws IOException { synchronized (result) { result.clear(); } getState().get("key", String.class); resCount[0] = children.size(); if (!children.isEmpty()) { for (URI child : children) { caller.call(child, "requestLeafs", null); } } else { synchronized (result) { result.add(getUrls().get(0)); } ObjectNode params = JOM.createObjectNode(); params.set("leafs", JOM.getInstance().valueToTree(result)); caller.call(parent, "putLeafs", params); } } /** * Gets the all leafs. * * @return the all leafs * @throws IOException * IOException */ public List<URI> getAllLeafs() throws IOException { result.clear(); resCount[0] = children.size(); if (!children.isEmpty()) { for (URI child : children) { caller.call(child, "requestLeafs", null); } } synchronized (result) { try { result.wait(); } catch (InterruptedException e) {} } return result; } }