package Nameserver;

import java.rmi.*;
import java.util.*;


public class MyDNSImpl implements MyDNS{
  private String $myName = null;
  private final int $myServiceType = 1; //1 == DNS, 2 == FS
  private HashMap<String,MyBase> $myRecords = new HashMap<String,MyBase>();


public MyDNSImpl()throws RemoteException{}

public MyDNSImpl(String $pmyName)throws RemoteException{
  System.out.println("New DNS-Object:"+$pmyName);
  $myName = $pmyName;
}

public String getMyName()throws RemoteException{
  return $myName;
}
public int getMyType()throws RemoteException{
  return $myServiceType;
}

public MyBase getServiceRecord(String $name)throws RemoteException{
  System.out.println("getServiceRecord for:"+$name);
  MyBase $temp = $myRecords.get($name);
  if($temp == null){
    System.out.println("NODE UNKNOWN");
    throw new RemoteException("NODE UNKNOWN:"+$name);
  }
  return $temp;
}

public void regServiceRecord(MyBase $rec)throws RemoteException{
  String $temp[] = $rec.getMyName().split("\\.");
  System.out.println("registration attempt from: "+$rec.getMyName());
  if($myRecords.containsKey($temp[0])){
    System.out.println("Allready registered!");
    throw new RemoteException("ALLREADY REGISTERED!");
  }
  int $lvl = $temp.length;
  int $mylvl = 0; //rootserver has lvl 0 and no name!
  if($myName != null)$mylvl = ($myName.split("\\.")).length;
  System.out.println($lvl+"lvl/mylvl"+$mylvl);
  if($lvl == $mylvl+1){ //level ok - i take you!
    $myRecords.put($temp[0], $rec);
    System.out.println("accepted registration from: "+$rec.getMyName()+" of type:"+$rec.getMyType());
  }else{ //Your level is deeper - I will pass you to the next node!
    MyDNS $nextRec = (MyDNS) getServiceRecord($temp[($temp.length-1-$mylvl)]);
    System.out.println("passing down to: "+$nextRec.getMyName());
    $nextRec.regServiceRecord($rec);
  }
}

public void unregServiceRecord(MyBase $rec)throws RemoteException{
  String $temp[] = $rec.getMyName().split("\\.");
  System.out.println("unregistration attempt from: "+$rec.getMyName());
  int $lvl = $temp.length;
  int $mylvl = 0; //rootserver has lvl 0 and no name!
  if($myName != null)$mylvl = ($myName.split("\\.")).length;
  if($lvl == $mylvl+1){ //level ok - ill unreg you!
    if(!$myRecords.containsValue($rec)){
      System.out.println("Not a registered object");
      throw new RemoteException("Not a registered object!");
    }
    $myRecords.remove($temp[0]);
    System.out.println("sucessful unregistration from: "+$rec.getMyName()+" of type:"+$rec.getMyType());
  }else{ //Your level is deeper - I will pass you to the next node!
    MyDNS $nextRec = (MyDNS) getServiceRecord($temp[($temp.length-1-$mylvl)]);
    System.out.println("passing down to: "+$nextRec.getMyName());
    $nextRec.unregServiceRecord($rec);
  }
}
}