package com.marinilli.b2.c7.deploylet;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.util.*;

/**
 * Chapter 7 - ServerDeploylet manager server
 * Don't forget:  -Djava.security.policy=<full path to new policy file>
 *
 * @author Mauro Marinilli
 * @version 1.0
 */
public class ServerRepositoryImpl extends UnicastRemoteObject implements ServerRepository{
  private HashMap repository = new HashMap();

  /**
   * Constructor
   */
  public ServerRepositoryImpl() throws RemoteException {
    if (System.getSecurityManager() == null) {
      System.out.println("new RMISecurityManager()");
      System.setSecurityManager(new RMISecurityManager());
    }
    try {
      String name = "rmi://localhost/deployletRepository";
      Naming.rebind(name, this);
      System.out.println("Server bound with name \""+name+"\"");
    } catch (Exception e) {
      System.err.println("ServerRepositoryImpl - binding: " + e.toString() );
    }
  }

  /**
   * creates the server deploylet name based on its client counterpart address
   */
  public String getDeployletName(String clientHost) {
    return clientHost;
  }

  /**
   * return the specified server deploylet or create it
   */
  public Deploylet getServerDeploylet(String deployletName) {
    if (repository.containsKey(deployletName) )
      return (Deploylet)repository.get(deployletName);
    // create it from scratch
    ServerDeploylet sd = null;
    try {
      String name = deployletName + "-" + repository.keySet().size();
      sd = new ServerDeploylet(name);
      sd.applicationInstallation();
      System.out.println("ServerRepositoryImpl - added");
    } catch (Exception e) {
      System.err.println("creating ServerDeploylet: " + deployletName);
    }
    repository.put(deployletName, sd);
    return sd;
  }

  /**
   * remove the given server deploylet
   */
  public void remove(String clientHost) throws RemoteException {
    //removes it from the repository
    repository.remove(clientHost);
    System.out.println("ServerRepositoryImpl - removed: "+clientHost);
  }

  /**
   * Server Repository Main
   */
  static public void main(String[] args) {
    try {
      ServerRepositoryImpl sri = new ServerRepositoryImpl();
    } catch (Exception e) {
      System.err.println("main(): " + e.toString() );
    }
  }
}