@Test
  public void testDeserializeCustom() {
    SFSSerializer sfsSerializer = new SFSSerializer();
    ISFSObject entityObj = new SFSObject();
    entityObj.putInt("intField", 10);
    ISFSArray subArray = new SFSArray();
    ISFSArray subCustomArray = new SFSArray();
    SFSObject subObj1 = new SFSObject();
    SFSObject subCustomObj = new SFSObject();
    subObj1.putLong("longField", 30L);
    subCustomObj.putLong("longField", 99L);
    subArray.addSFSObject(subObj1);
    subCustomArray.addSFSObject(subCustomObj);

    entityObj.putSFSArray("wildcardList", subArray);
    entityObj.putSFSArray("wildcardedListCustom", subCustomArray);

    Entity entity = new Entity();
    sfsSerializer.deserialize(entity, entityObj);

    assertNotNull("Wildcarded deserialized list must not be null!", entity.getWildcardList());
    assertFalse(
        "Wildcarded deserialized list must not be empty!", entity.getWildcardList().isEmpty());
    assertEquals(30L, ((SubEntity) entity.getWildcardList().get(0)).getLongField().longValue());
    assertEquals(
        99L, ((SubEntity) entity.getWildcardedListCustom().get(0)).getLongField().longValue());
  }
  @Override
  public void handleServerEvent(ISFSEvent event) throws SFSException {
    trace("--------------------------------------------------------");
    // Grab parameters from client request
    userName = (String) event.getParameter(SFSEventParam.LOGIN_NAME);
    cryptedPass = (String) event.getParameter(SFSEventParam.LOGIN_PASSWORD);
    session = (ISession) event.getParameter(SFSEventParam.SESSION);

    customData = (SFSObject) event.getParameter(SFSEventParam.LOGIN_IN_DATA);

    String joinRoom = AuthorizeExtension.LOBBY;

    if (customData == null || customData.getUtfString("session") == null) {
      lobbyLoginAsGuestOrRegistered(event);
    } else {
      joinRoom = customData.getUtfString("room");
      generateSession = customData.getUtfString("session");
      customRoomLogin(event);
    }

    trace("Session loggin in: ", generateSession);

    session.setProperty("room", joinRoom);
    session.setProperty("isRegistered", isRegistered);
    session.setProperty("session", generateSession);
  }
  public Room CreateTournamentRoom(String roomName, String tournamentId, int maxPlayers)
      throws SFSCreateRoomException {
    CreateRoomSettings settings = new CreateRoomSettings();
    settings.setName(roomName);
    settings.setGroupId("games");
    settings.setGame(true);
    settings.setMaxSpectators(0);
    settings.setMaxUsers(maxPlayers);
    settings.setExtension(new RoomExtensionSettings("SFJugger", MainExtension.class.getName()));
    settings.setAutoRemoveMode(SFSRoomRemoveMode.NEVER_REMOVE);
    settings.setHidden(false);
    settings.setMaxVariablesAllowed(15);

    List<RoomVariable> roomVars = new ArrayList<RoomVariable>();

    roomVars.add(new SFSRoomVariable("map", "urban_map_RR3_fix", false, false, true));
    roomVars.add(new SFSRoomVariable("ruleClass", PVPGameRule.class.getName(), false, false, true));
    roomVars.add(new SFSRoomVariable("visible", true, false, false, true));
    roomVars.add(new SFSRoomVariable("isTournament", true, false, false, true));
    roomVars.add(new SFSRoomVariable("tournamentId", tournamentId, false, false, true));

    GameSettingModel gSettings = new GameSettingModel();
    gSettings.isWithPractice = false;
    gSettings.teamCount = 2;
    gSettings.maxTime = 0;
    gSettings.maxScore = 35;

    SFSObject data = new SFSObject();
    data.putClass("gameSetting", gSettings);
    roomVars.add(new SFSRoomVariable("gameVar", data, false, false, true));
    settings.setRoomVariables(roomVars);

    return getApi().createRoom(getParentZone(), settings, null, false, null, false, false);
    // return getApi().createRoom(getParentZone(), settings, null);
  }
  public void handleServerEvent(ISFSEvent event) throws SFSException {

    User user = (User) event.getParameter(SFSEventParam.USER);

    trace("ClueGameExtension UserDisconnectEventHandler got user: "******"room");

    if (uv == null) return;

    Room room = (Room) getParentExtension().getParentZone().getRoomByName(uv.getStringValue());

    trace("ClueGameExtension UserDisconnectEventHandler got room: " + room);

    // handles both the user disconnected event and the user exit room events

    if (room != null) {
      // set the game to over
      if (room.getUserList().size() < 3) {
        room.removeVariable("isGameStarted");
      }
    }

    // send the note to all other players
    List<User> users = room.getUserList();
    ISFSObject resObj = SFSObject.newInstance();
    resObj.putUtfString(
        "message",
        "Game is over because there are less than 3 players.  A player has disconnected from the server.");
    send("gameOver", resObj, users);
  }
  @Test
  public void testDeserialize() {
    SFSSerializer sfsSerializer = new SFSSerializer();

    ISFSObject subEntityObj = new SFSObject();
    subEntityObj.putLong("longField", 20L);
    ISFSObject entityObj = new SFSObject();
    entityObj.putInt("intField", 10);
    entityObj.putSFSObject("subEntity", subEntityObj);
    entityObj.putUtfString("notDeserializable", "value1");
    entityObj.putUtfString("notSerializable", "value2");
    entityObj.putUtfString("enumField", "white");
    entityObj.putUtfString("changedName", "changedValue");
    entityObj.putUtfString("fieldWithoutGetter", "value");
    entityObj.putInt("fieldCustomSerializable", 10);
    entityObj.putUtfString("totallyIgnoredField", "value");

    entityObj.putUtfStringArray("colors", Arrays.asList("black", "black", "white"));

    ISFSArray subArray = new SFSArray();
    SFSObject subObj1 = new SFSObject();
    subObj1.putLong("longField", 30L);
    subObj1.putUtfStringArray("stringsList", Arrays.asList("testString"));
    SFSObject subObj2 = new SFSObject();
    subArray.addSFSObject(subObj1);
    subArray.addSFSObject(subObj2);

    entityObj.putSFSArray("subEntities", subArray);

    Entity entity = sfsSerializer.deserialize(Entity.class, entityObj);

    assertEquals(Entity.Color.white, entity.getEnumField());
    assertEquals(Entity.Color.white, entity.getColors().get(2));
    assertEquals(entityObj.getInt("intField"), entity.getIntField());
    assertEquals((Long) 10L, entity.fieldCustomSerializable);
    assertEquals(entityObj.getUtfString("fieldWithoutGetter"), entity.fieldWithoutGetter);
    assertEquals(entityObj.getUtfString("notSerializable"), entity.getNotSerializable());
    assertEquals(entityObj.getUtfString("changedName"), entity.getNameToBeChanged());
    assertNull(entity.getNotDeserializable());
    assertNull(entity.totallyIgnoredField);
    assertEquals(subEntityObj.getLong("longField"), entity.getSubEntity().getLongField());

    assertNotNull(entity.getSubEntities());
    assertFalse(entity.getSubEntities().isEmpty());
    assertEquals(30L, entity.getSubEntities().get(0).getLongField().longValue());
    assertEquals("testString", entity.getSubEntities().get(0).getStringsList().get(0));
  }
  @Override
  public void handleClientRequest(User paramUser, ISFSObject paramISFSObject) {
    String data = paramISFSObject.getUtfString("data");

    ISFSObject parserObj = SFSObject.newFromJsonData(data);
    System.out.println("username : "******"username"));
    System.out.println("address :" + parserObj.getUtfString("address"));
    //		String from = "*****@*****.**";
    //		String to = "*****@*****.**";
    //		Email myEmail = new SFSEmail(from, to, "Test mail", "Hello from SFS2X");
    //		try {
    //			SmartFoxServer.getInstance().getMailService().sendMail(myEmail);
    //		} catch (MessagingException e) {
    //			e.printStackTrace();
    //			trace(e.getMessage());
    //		}
    send("zcq", parserObj, paramUser);
  }