public boolean addProperty(String managed_element_uuid, String name, String value)
      throws PropertyExistException, InvalidNameException {
    ManagedElement me1 = getLocalElement(managed_element_uuid);
    if (me1 != null) {
      return me1.addProperty(name, value);
    } else {
      String auri = agent.getExternalAgentUri(managed_element_uuid);
      if (auri != null) {
        CMessage msg = new CMessage();
        msg.setTo(auri);
        msg.setObject("runtimemodel");
        msg.setBody("addProperty");
        msg.addHeader("uuid", managed_element_uuid);
        msg.addHeader("name", name);
        msg.addHeader("value", value);
        try {
          CMessage resultmsg = sendAndWait(msg);
          if (resultmsg != null) {
            if (resultmsg.getBody() != null) {
              if (resultmsg.getBody().toString().equalsIgnoreCase("true")) {
                return true;
              }
            }
          }
        } catch (TimeOutException e) {
          e.printStackTrace();
        }
      }
    }

    return false; // To change body of implemented methods use File | Settings | File Templates.
  }
 public boolean hasReferencedElement(
     String managed_element_uuid, String reference_name, String referenced_element_uuri) {
   ManagedElement me1 = getLocalElement(managed_element_uuid);
   if (me1 != null) {
     Reference r = me1.getReference(reference_name);
     if (r != null) {
       return r.hasReferencedElement(referenced_element_uuri);
     }
   } else {
     String auri = agent.getExternalAgentUri(managed_element_uuid);
     if (auri != null) {
       CMessage msg = new CMessage();
       msg.setTo(auri);
       msg.setObject("runtimemodel");
       msg.setBody("hasReferencedElement");
       msg.addHeader("uuid", managed_element_uuid);
       msg.addHeader("name", reference_name);
       msg.addHeader("refuuid", referenced_element_uuri);
       try {
         CMessage resultmsg = sendAndWait(msg);
         if (resultmsg != null) {
           if (resultmsg.getBody() != null) {
             if (resultmsg.getBody().toString().equalsIgnoreCase("true")) {
               return true;
             }
           }
         }
       } catch (TimeOutException e) {
         e.printStackTrace();
       }
     }
   }
   return false;
 }
 public void send(CMessage msg) throws Exception {
   if (msg != null) {
     msg.setFrom(getCubeAgent().getUri());
     msg.setReplyTo(getCubeAgent().getUri());
     /*if (msg.getTo() != null && !msg.getTo().contains("/ext/"))
     msg.setTo(msg.getTo() + "/ext/" + getExtensionFactory().getExtensionId());*/
     getCubeAgent().getCommunicator().sendMessage(msg);
   }
 }
 public String getPropertyValue(String managed_element_uuid, String name) {
   ManagedElement me1 = getLocalElement(managed_element_uuid);
   if (me1 != null) {
     // System.out.println(".... get property value (local) of element: " + managed_element_uuid);
     return me1.getProperty(name);
   } else {
     // System.out.println(".... get property value (remote) of element: " + managed_element_uuid);
     String auri = agent.getExternalAgentUri(managed_element_uuid);
     if (auri != null) {
       CMessage msg = new CMessage();
       msg.setTo(auri);
       msg.setObject("runtimemodel");
       msg.setBody("getPropertyValue");
       msg.addHeader("uuid", managed_element_uuid);
       msg.addHeader("name", name);
       try {
         CMessage resultmsg = sendAndWait(msg);
         if (resultmsg != null) {
           if (resultmsg.getBody() != null) {
             return resultmsg.getBody().toString();
           }
         }
       } catch (TimeOutException e) {
         e.printStackTrace();
       }
     } else {
       System.out.println(
           ".... get property value: impossible to find agent uri of instance "
               + managed_element_uuid);
     }
   }
   return null;
 }
  public List<String> getReferencedElements(String managed_element_uuid, String reference_name) {

    List<String> result = new ArrayList<String>();
    ManagedElement me1 = getLocalElement(managed_element_uuid);
    if (me1 != null) {
      Reference r = me1.getReference(reference_name);
      if (r != null) {
        return r.getReferencedElements();
      } else {
        // System.out.println("CONTROLLER: no reference with name: " + reference_name);
      }
    } else {
      String auri = agent.getExternalAgentUri(managed_element_uuid);
      if (auri != null) {
        CMessage msg = new CMessage();
        msg.setTo(auri);
        msg.setObject("runtimemodel");
        msg.setBody("getReferencedElements");
        msg.addHeader("uuid", managed_element_uuid);
        msg.addHeader("name", reference_name);
        try {
          CMessage resultmsg = sendAndWait(msg);
          if (resultmsg != null) {
            if (resultmsg.getBody() != null) {
              String[] tmp = resultmsg.getBody().toString().split(",");
              for (int i = 0; i < tmp.length; i++) {
                if (tmp[i] != null && tmp[i].length() > 0) {
                  String[] tmp2 = tmp[i].split("###");
                  String agenturi = tmp2[0];
                  String elementuuid = tmp2[1];
                  if (!agenturi.equalsIgnoreCase(getCubeAgent().getUri())) {
                    this.agent.addExternalElement(elementuuid, agenturi);
                  }
                  result.add(elementuuid);
                }
              }
            }
          }
        } catch (TimeOutException e) {
          e.printStackTrace();
        }
      }
    }
    return result;
  }
  public CMessage sendAndWait(CMessage msg) throws TimeOutException {
    if (msg != null) {
      msg.setFrom(getCubeAgent().getUri());
      msg.setReplyTo(getCubeAgent().getUri());
      /*if (msg.getTo() != null && !msg.getTo().contains("/ext/"))
      msg.setTo(msg.getTo() + "/ext/" + getExtensionFactory().getExtensionId());*/
      // String to = msg.getTo();
      msg.setCorrelation(++correlation);
      waitingCorrelation = msg.getCorrelation();
      // System.out.println(msg.toString());
      try {
        this.waitingMessage = null;

        this.getCubeAgent().getCommunicator().sendMessage(msg);
      } catch (Exception e) {
        // this.getCubeAgent().getLogger().warning("The Plugin could not send a message to " + to +
        // "!");
      }
      try {
        long initialTime = System.currentTimeMillis();
        long currentTime = initialTime;
        long waitingTime = TIMEOUT;
        synchronized (csplock) {
          while (((currentTime < (initialTime + TIMEOUT)) && waitingTime > 1)
              && (this.waitingMessage == null)) {
            csplock.wait(waitingTime);
            currentTime = System.currentTimeMillis();
            waitingTime = waitingTime - (currentTime - initialTime);
          }
        }
      } catch (InterruptedException e) {
        // this.getCubeAgent().getLogger().warning("The Plugin waits for a response message from " +
        // to + " but no answer! timeout excedded!");
      }
      return this.waitingMessage;
    } else {
      return null;
    }
  }
 public void receiveMessage(CMessage msg) {
   if (msg.getCorrelation() == waitingCorrelation) {
     this.waitingMessage = msg;
     if (csplock != null) {
       synchronized (csplock) {
         csplock.notify();
       }
     }
     waitingCorrelation = -1;
   }
   try {
     handleMessage(msg);
   } catch (Exception ex) {
     // getCubeAgent().getLogger().error("[AbstractPlugin.receiveMessage] " + ex.getMessage());
   }
 }
 public ManagedElement getRemoteElement(String managed_element_uuid) {
   String auri = agent.getExternalAgentUri(managed_element_uuid);
   if (auri != null) {
     CMessage msg = new CMessage();
     msg.setTo(auri);
     msg.setObject("runtimemodel");
     msg.setBody("getRemoteElement");
     msg.addHeader("uuid", managed_element_uuid);
     try {
       CMessage resultmsg = sendAndWait(msg);
       if (resultmsg != null) {
         return resultmsg.getAttachement();
       }
     } catch (TimeOutException e) {
       e.printStackTrace();
     }
   }
   return null;
 }
  protected void handleMessage(CMessage msg) throws Exception {

    if (msg != null) {
      if (msg.getBody() != null) {
        if (msg.getBody().toString().equalsIgnoreCase("getPropertyValue")) {
          Object uuid = msg.getHeader("uuid");
          Object name = msg.getHeader("name");

          String p = null;
          if (uuid != null && name != null) {
            p = getPropertyValue(uuid.toString(), name.toString());
          }
          CMessage resmsg = new CMessage();
          resmsg.setTo(msg.getFrom());
          resmsg.setCorrelation(msg.getCorrelation());
          resmsg.setObject(msg.getObject());
          resmsg.setBody(p);
          try {
            getCubeAgent().getCommunicator().sendMessage(resmsg);
          } catch (CommunicationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        } else if (msg.getBody().toString().equalsIgnoreCase("addProperty")) {
          Object uuid = msg.getHeader("uuid");
          Object name = msg.getHeader("name");
          Object value = msg.getHeader("value");

          boolean p = false;
          if (uuid != null && name != null && value != null) {
            p = addProperty(uuid.toString(), name.toString(), value.toString());
          }
          CMessage resmsg = new CMessage();
          resmsg.setTo(msg.getFrom());
          resmsg.setCorrelation(msg.getCorrelation());
          resmsg.setObject(msg.getObject());
          if (p == true) resmsg.setBody("true");
          else resmsg.setBody("false");
          try {
            getCubeAgent().getCommunicator().sendMessage(resmsg);
          } catch (CommunicationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        } else if (msg.getBody().toString().equalsIgnoreCase("getReferencedElements")) {
          Object uuid = msg.getHeader("uuid");
          Object name = msg.getHeader("name");

          String resultat = "";
          if (uuid != null && name != null) {
            List<String> res = getReferencedElements(uuid.toString(), name.toString());
            for (String r : res) {
              resultat +=
                  this.agent.getRuntimeModelController().getAgentOfElement(r) + "###" + r + ",";
            }
          }
          CMessage resmsg = new CMessage();
          resmsg.setTo(msg.getFrom());
          resmsg.setCorrelation(msg.getCorrelation());
          resmsg.setObject(msg.getObject());
          resmsg.setBody(resultat);

          try {
            getCubeAgent().getCommunicator().sendMessage(resmsg);
          } catch (CommunicationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        } else if (msg.getBody().toString().equalsIgnoreCase("addReferencedElement")) {
          Object uuid = msg.getHeader("uuid");
          Object name = msg.getHeader("name");
          Object onlyone = msg.getHeader("onlyone");
          Object refuuid = msg.getHeader("refuuid");

          boolean p = false;
          if (uuid != null && name != null && refuuid != null) {
            this.agent.addExternalElement(refuuid.toString(), msg.getFrom().toString());
            p =
                addReferencedElement(
                    uuid.toString(),
                    name.toString(),
                    onlyone.toString().equalsIgnoreCase("true") ? true : false,
                    refuuid.toString());
          }
          CMessage resmsg = new CMessage();
          resmsg.setTo(msg.getFrom());
          resmsg.setCorrelation(msg.getCorrelation());
          resmsg.setObject(msg.getObject());
          if (p == true) resmsg.setBody("true");
          else resmsg.setBody("false");
          try {
            getCubeAgent().getCommunicator().sendMessage(resmsg);
          } catch (CommunicationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        } else if (msg.getBody().toString().equalsIgnoreCase("removeReferencedElement")) {
          Object uuid = msg.getHeader("uuid");
          Object name = msg.getHeader("name");
          Object refuuid = msg.getHeader("refuuid");

          boolean p = false;
          if (uuid != null && name != null && refuuid != null) {
            p = removeReferencedElement(uuid.toString(), name.toString(), refuuid.toString());
          }
          CMessage resmsg = new CMessage();
          resmsg.setTo(msg.getFrom());
          resmsg.setCorrelation(msg.getCorrelation());
          resmsg.setObject(msg.getObject());
          if (p == true) resmsg.setBody("true");
          else resmsg.setBody("false");
          try {
            getCubeAgent().getCommunicator().sendMessage(resmsg);
          } catch (CommunicationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        } else if (msg.getBody().toString().equalsIgnoreCase("hasReferencedElement")) {
          Object uuid = msg.getHeader("uuid");
          Object name = msg.getHeader("name");
          Object refuuid = msg.getHeader("refuuid");

          boolean p = false;
          if (uuid != null && name != null && refuuid != null) {
            p = hasReferencedElement(uuid.toString(), name.toString(), refuuid.toString());
          }
          CMessage resmsg = new CMessage();
          resmsg.setTo(msg.getFrom());
          resmsg.setCorrelation(msg.getCorrelation());
          resmsg.setObject(msg.getObject());
          if (p == true) resmsg.setBody("true");
          else resmsg.setBody("false");
          try {
            getCubeAgent().getCommunicator().sendMessage(resmsg);
          } catch (CommunicationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        } else if (msg.getBody().toString().equalsIgnoreCase("getRemoteElement")) {
          Object uuid = msg.getHeader("uuid");
          ManagedElement me = null;
          if (uuid != null) {
            me = getLocalElement(uuid.toString());
          }
          CMessage resmsg = new CMessage();
          resmsg.setTo(msg.getFrom());
          resmsg.setCorrelation(msg.getCorrelation());
          resmsg.setAttachement(me);
          resmsg.setObject(msg.getObject());
          try {
            getCubeAgent().getCommunicator().sendMessage(resmsg);
          } catch (CommunicationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
      }
    }
  }
 public boolean addReferencedElement(
     String managed_element_uuid,
     String reference_name,
     boolean onlyone,
     String referenced_element_uuid)
     throws InvalidNameException {
   ManagedElement me1 = getLocalElement(managed_element_uuid);
   if (me1 != null) {
     // System.out.println("add Local Reference Element ...");
     Reference r = me1.getReference(reference_name);
     if (r == null) {
       // System.out.println("Reference '"+reference_name+"' does not exists! we will create it!");
       r = me1.addReference(reference_name, onlyone);
     }
     if (r != null) {
       r.addReferencedElement(referenced_element_uuid);
       return true;
     }
   } else {
     // System.out.println("add Remote Reference Element ...");
     String auri = agent.getExternalAgentUri(managed_element_uuid);
     if (auri != null) {
       CMessage msg = new CMessage();
       msg.setTo(auri);
       msg.setObject("runtimemodel");
       msg.setBody("addReferencedElement");
       msg.addHeader("uuid", managed_element_uuid);
       msg.addHeader("name", reference_name);
       msg.addHeader("onlyone", onlyone == true ? "true" : "false");
       msg.addHeader("refuuid", referenced_element_uuid);
       try {
         CMessage resultmsg = sendAndWait(msg);
         if (resultmsg != null) {
           if (resultmsg.getBody() != null) {
             if (resultmsg.getBody().toString().equalsIgnoreCase("true")) {
               return true;
             }
           }
         }
       } catch (TimeOutException e) {
         e.printStackTrace();
       }
     } else {
       System.out.println("External agent of element '" + managed_element_uuid + "' not found!");
     }
   }
   return false;
 }