use UmpleNotice.ump;
external interface ILang{}

class JavaDistributedTemplates {
    depend cruise.umple.compiler.*;
    depend cruise.umple.util.*;
    depend java.util.*;
    depend cruise.umple.parser.Position;

    // Add a newline to the end of the input
    private void appendln(StringBuilder buffer, String input, Object... variables)
    {
        append(buffer, input + "\n", variables);
    }

    // This method will be used to append formatted strings
    // i.e. format("Hello {0} {1}", "andrew","forward");
    private void append(StringBuilder buffer, String input, Object... variables)
    {
        buffer.append(StringFormatter.format(input,variables));
    }

    emit getproxyReadObjectCode(String remoteName, String packageName,String interfaceName)(ProxyreadObjectCode);

    ProxyreadObjectCode <<!
      public  String remoteUrl;
      public  Integer objectId;
      public  String remotePort;
      private void readObject(java.io.ObjectInputStream in) throws Exception
      {
        try
        {
          in.defaultReadObject();
        }
        catch(Exception e)
        {
          throw e;
        }
      
      boolean success = false;
      while (!success) {        
      try 
      {
      URL url = new URL(remoteUrl+":"+remotePort+"/<<=remoteName>>"+String.valueOf(objectId)+"?wsdl");
      QName qname = new QName("http://<<=packageName>>/","<<=remoteName>>Service");
      Service service = Service.create(url, qname);
      realObject=service.getPort(<<=interfaceName>>.class);

        success = true;
      } 
        catch (Exception e) 
        {
          System.err.println("Client exception: " + e.toString());
          e.printStackTrace();
        }
      }
    }
 !>>

    emit getproxyReadObjectCodeRMI(String remoteName, String packageName,String interfaceName)(ProxyreadObjectCodeRMI);

    ProxyreadObjectCodeRMI <<!
      private  <<=interfaceName>> remoteObject;
      public void setRemoteObject(<<=interfaceName>> aRemoteObject)
      {
        remoteObject=aRemoteObject;
      }
      public <<=interfaceName>> getRemoteObject()
      {
        return remoteObject;
      }
      private void readObject(java.io.ObjectInputStream in) throws Exception
      {
        try
        {
          in.defaultReadObject();
        }
        catch(Exception e)
        {
          throw e;
        }

        realObject=remoteObject;
      }
 !>>

     emit getremoteSingletonCode(String remoteName, String packageName,String interfaceName)(remoteSingleton);
 remoteSingleton <<!
  protected <<=remoteName>>()
  {
  }
  public <<=remoteName>>(String url,String port,Integer objectId)
  {
    Endpoint.publish(url+":"+port+"/<<=remoteName>>"+String.valueOf(objectId),this);
  }

 !>>
}
