package com.cgcl.cloudesk.manage.core;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.concurrent.TimeUnit;
import com.cgcl.cloudesk.manage.app.File;
import com.cgcl.cloudesk.manage.com.AppInfo;
import com.cgcl.cloudesk.manage.com.Handler;
import com.cgcl.cloudesk.manage.com.VMInfo;
import com.cgcl.cloudesk.manage.com.VUEList;
import com.cgcl.cloudesk.manage.config.ComConfig;
import com.cgcl.cloudesk.manage.config.CoreConfig;
import com.cgcl.cloudesk.manage.config.PacketConfig;
import com.cgcl.cloudesk.manage.heartbeat.HeartBeatThread;
import com.cgcl.cloudesk.manage.log.LogService;
import com.cgcl.cloudesk.manage.net.Transmittable;
import com.cgcl.cloudesk.manage.packet.AllAppInfoReqPacket;
import com.cgcl.cloudesk.manage.packet.AllAppInfoRspPacket;
import com.cgcl.cloudesk.manage.packet.AllCustomizeAppInfoRspPacket;
import com.cgcl.cloudesk.manage.packet.CustomizeAppInfoReqPacket;
import com.cgcl.cloudesk.manage.packet.CustomizeAppInfoRspPacket;
import com.cgcl.cloudesk.manage.packet.CustomizeAppPacket;
import com.cgcl.cloudesk.manage.packet.CustomizeAppRspPacket;
import com.cgcl.cloudesk.manage.packet.GetFileListPacket;
import com.cgcl.cloudesk.manage.packet.GetFileListRspPacket;
import com.cgcl.cloudesk.manage.packet.GetGradeReqPacket;
import com.cgcl.cloudesk.manage.packet.GetGradeRspPacket;
import com.cgcl.cloudesk.manage.packet.GetUserDirPacket;
import com.cgcl.cloudesk.manage.packet.GetUserDirRspPacket;
import com.cgcl.cloudesk.manage.packet.PacketBase;
import com.cgcl.cloudesk.manage.packet.RestoreScenePacket;
import com.cgcl.cloudesk.manage.packet.RestoreSceneRspPacket;
import com.cgcl.cloudesk.manage.packet.SaveScenePacket;
import com.cgcl.cloudesk.manage.packet.SaveSceneRspPacket;
import com.cgcl.cloudesk.manage.packet.SavingAppInfoPacket;
import com.cgcl.cloudesk.manage.packet.ScoringReqPacket;
import com.cgcl.cloudesk.manage.packet.ScoringRspPacket;
import com.cgcl.cloudesk.manage.packet.UnCustomizeAppPacket;
import com.cgcl.cloudesk.manage.packet.UnCustomizeAppRspPacket;
import com.cgcl.cloudesk.manage.packet.UnMountRspPacket;
import com.cgcl.cloudesk.manage.packet.UserLoginPacket;
import com.cgcl.cloudesk.manage.packet.UserLoginRspPacket;
import com.cgcl.cloudesk.manage.packet.UserLogoutPacket;
import com.cgcl.cloudesk.manage.packet.UserRegPacket;
import com.cgcl.cloudesk.manage.packet.UserRegRspPacket;
import com.cgcl.cloudesk.manage.packet.WorksetInfoReqPacket;
import com.cgcl.cloudesk.manage.packet.WorksetInfoRspPacket;
import com.cgcl.cloudesk.manage.util.ArrayUtil;
import com.cgcl.cloudesk.manage.util.IPUtil;
import com.cgcl.cloudesk.manage.vnc.Vnc;
import com.cgcl.cloudesk.screens.act.UI;
public class Controller implements Handler, UIController, VncController {
// other components
private String worksetName = null;
private Transmittable transmitter = null;
private UI ui = null;
private Vnc vnc = null;
private String userID = null;
private VMInfo[] VMs = null;
private Map<String, String> namePathPair = null;
private LinkedList<String> gradeList = null;
private VUEList runningAppNameList = new VUEList();
private VUEList runningAppPathList = new VUEList();
private int mountCount = 0;
//private HeartBeatThread heartBeatThread = new HeartBeatThread();
//private static int firstTime = 0;
public static Vector<AppInfo> nativeAppInfosVector = new Vector<AppInfo>();
public static Vector<AppInfo> customizeAppInfosVector = new Vector<AppInfo>();
public static Vector<AppInfo> unCustomizeAppInfosVector = new Vector<AppInfo>();
public static String username;
//private VUEMobileClient vueMobileClient;
// state
private int currentState = CoreConfig.initialState;
public void setCurrentState(int currentState) {
this.currentState = currentState;
}
public VMInfo[] getVMs()
{
return VMs;
}
/**
* Initializes with transmitter, ui, vnc
* @param transmitter transmits packets
* @param ui shows information about the application
* @param vnc completes main function of the application
*/
public void init(Transmittable transmitter, UI ui, Vnc vnc)
{
this.transmitter = transmitter;
this.ui = ui;
this.vnc = vnc;
//this.vueMobileClient = vueMobileClient;
}
/*public VUEMobileClient getVUEMobileClient()
{
return this.vueMobileClient;
}*/
/**
* Starts the controller and other modules
*/
public void start()
{
transmitter.start();
ui.start();
}
/**
* Terminates the controller and other modules
*/
public void terminate()
{
transmitter.terminate();
//heartBeatThread.stop();
// to be added
}
public void handle(PacketBase packet) {
switch(currentState)
{
case CoreConfig.initialState:
handleInInitialState(packet);
break;
case CoreConfig.onlineState:
handleInOnlineState(packet);
break;
}
}
public void handleInInitialState(PacketBase packet)
{
LogService.getInstance().WriteLog("handle packet : packet type = " + Integer.toString((int)packet.getType()));
switch( packet.getType() )
{
case PacketConfig.kUserRegRspPacketType:
System.out.println("handle kUserRegRspPacketType");
UserRegRspPacket userRegRspPacket = (UserRegRspPacket)packet;
ui.notifyRegisterResult( userRegRspPacket.isBSuccess() );
break;
case PacketConfig.kUserLoginRspPacketType:
System.out.println("handle kUserLoginRspPacketType");
UserLoginRspPacket userLoginRspPacket = (UserLoginRspPacket)packet;
if( userLoginRspPacket.isBSuccess() == true)
{
currentState = CoreConfig.onlineState;
//heartBeatThread.setTransmitter(transmitter);
//heartBeatThread.setPingPacket(userID);
//heartBeatThread.start();
}
ui.notifyLoginResult( userLoginRspPacket.isBSuccess() );
break;
// to be added
}
}
@SuppressWarnings("static-access")
public void handleInOnlineState(PacketBase packet)
{
LogService.getInstance().WriteLog("handle packet : packet type = " + Integer.toString((int)packet.getType()));
switch( packet.getType() )
{
case PacketConfig.kAllAppInfoRspPacketType:
System.out.println("handle kAllAppInfoRspPacketType");
AllAppInfoRspPacket allAppInfoRspPacket = (AllAppInfoRspPacket)packet;
Controller.unCustomizeAppInfosVector = ArrayUtil.ArrayToVector(allAppInfoRspPacket.getUncustomizeApps());
Controller.customizeAppInfosVector = ArrayUtil.ArrayToVector(allAppInfoRspPacket.getCustomizeApps());
ui.notifyAllAppInfo( Controller.nativeAppInfosVector, Controller.customizeAppInfosVector, Controller.unCustomizeAppInfosVector );
break;
case PacketConfig.kCustomizeAppInfoRspPacketType:
System.out.println("handle kCustomizeAppInfoRspPacketType");
CustomizeAppInfoRspPacket customizeAppInfoRspPacket = (CustomizeAppInfoRspPacket)packet;
Controller.nativeAppInfosVector = ArrayUtil.ArrayToVector(customizeAppInfoRspPacket.getNativeApps());
Controller.customizeAppInfosVector = ArrayUtil.ArrayToVector(customizeAppInfoRspPacket.getCustomizeApps());
ui.notifyCustomizeAppInfo(customizeAppInfoRspPacket.getNativeApps(), customizeAppInfoRspPacket.getCustomizeApps(), this.namePathPair);
break;
case PacketConfig.kAllCustomizeAppInfoRspType:
System.out.println("handle kAllCustomizeAppInfoRspType");
AllCustomizeAppInfoRspPacket allCustomizeAppInfoRspPacket = (AllCustomizeAppInfoRspPacket)packet;
Controller.unCustomizeAppInfosVector = ArrayUtil.ArrayToVector(allCustomizeAppInfoRspPacket.getAllCustomizeAppInfo());
System.out.println("receive unCustomizeApp " + allCustomizeAppInfoRspPacket.getAllCustomizeAppInfo().length);
break;
case PacketConfig.kCustomizeAppRspPacketType:
System.out.println("handle kCustomizeAppRspPacketType");
CustomizeAppRspPacket customizeAppRspPacket = (CustomizeAppRspPacket)packet;
if( customizeAppRspPacket.isBSuccess())
{
Controller.customizeAppInfosVector.add(customizeAppRspPacket.getAppInfo());
/*if(!Controller.customizeAppInfosVector.contains(customizeAppRspPacket.getAppInfo()))
{
Controller.customizeAppInfosVector.addElement(customizeAppRspPacket.getAppInfo());
for(int i = 0 ; i < Controller.unCustomizeAppInfosVector.size() ; i ++)
{
AppInfo tempAppInfo = (AppInfo)Controller.unCustomizeAppInfosVector.elementAt(i);
if( customizeAppRspPacket.getAppInfo().getID().equals(tempAppInfo.getID()))
{
System.out.println("unCustomizeAppInfosVector remove at " + i);
Controller.unCustomizeAppInfosVector.removeElementAt(i);
break;
}
}
System.out.println("after customize customizeAppInfosVector size = " + Controller.customizeAppInfosVector.size());
System.out.println("after customize unCustomizeAppInfosVector size = " + Controller.unCustomizeAppInfosVector.size());
}*/
}
//ui.notifyCustomizeRequestResult(customizeAppRspPacket.isBSuccess(), customizeAppRspPacket.getAppInfo());
break;
case PacketConfig.kSaveSceneRspPacketType:
SaveSceneRspPacket saveSceneRspPacket = (SaveSceneRspPacket)packet;
if( saveSceneRspPacket.getErrorCode() == CoreConfig.succeed )
{
SavingAppInfoPacket savingAppInfoPacket = new SavingAppInfoPacket();
savingAppInfoPacket.setUserName(userID);
savingAppInfoPacket.setSaveTime(saveSceneRspPacket.getSaveTime());
savingAppInfoPacket.setRunningAppInfos(null);
System.out.println("runningAppNameList : " + runningAppNameList.toString());
System.out.println("runningAppPathList : " + runningAppPathList.toString());
transmitter.sendPacket(savingAppInfoPacket);
}
mountCount = 0;
currentState = CoreConfig.initialState;
ui.notifySaveSceneResult(saveSceneRspPacket.getErrorCode());
System.out.println("send savingAppInfoPacket");
break;
case PacketConfig.kUnmountPacketType:
System.out.println("handler kUnmountPacket");
UnMountRspPacket unMountRspPacket = new UnMountRspPacket();
mountCount--;
System.out.println("mountcount-- mountCount = " + mountCount);
if( 0 == mountCount )
{
unMountRspPacket.setUserName(userID);
unMountRspPacket.setResult(CoreConfig.saveSuccessfully);
transmitter.sendPacket(unMountRspPacket);
System.out.println("send unMountRspPacket : " + unMountRspPacket.getResult());
}
break;
case PacketConfig.kMountPacketType:
//to be modified
mountCount++;
System.out.println("mountcount++ mountCount = " + mountCount);
System.out.println("handler KMountPacket");
break;
case PacketConfig.kWorksetInfoRspPacketType:
System.out.println("handler WorksetInfoRspPacket");
WorksetInfoRspPacket worksetInfoRspPacket = (WorksetInfoRspPacket)packet;
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
ui.notifyWorksetInfo(worksetInfoRspPacket.getWorksetList());
break;
case PacketConfig.kRestoreSceneRspPacketType:
System.out.println("handler kRestoreSceneRspPacket");
VMs = ((RestoreSceneRspPacket)packet).VMs;
this.requestUserDir(userID);
break;
case PacketConfig.kUnCustomizeAppRspPacketType:
System.out.println("handler kUnCustomizeAppRspPacket");
UnCustomizeAppRspPacket unCustomizeAppRspPacket = (UnCustomizeAppRspPacket)packet;
if( unCustomizeAppRspPacket.isBSuccess() )
{
for(int i = 0 ; i < Controller.customizeAppInfosVector.size() ; i++)
{
AppInfo tmpAppInfo = (AppInfo)((Controller.customizeAppInfosVector).elementAt(i));
String appID = tmpAppInfo.getID();
if( appID.equals(unCustomizeAppRspPacket.getAppID()) )
{
Controller.unCustomizeAppInfosVector.addElement(tmpAppInfo);
Controller.customizeAppInfosVector.removeElementAt(i);
break;
}
}
}
System.out.println("after unCustomize customizeAppInfosVector size = " + Controller.customizeAppInfosVector.size());
System.out.println("after unCustomize unCustomizeAppInfosVector size = " + Controller.unCustomizeAppInfosVector.size());
//ui.notifyUnCustomizeRequestResult(unCustomizeAppRspPacket.isBSuccess(), unCustomizeAppRspPacket.getAppID());
break;
case PacketConfig.kGetUserDirRspPacketType:
GetUserDirRspPacket getUserDirRspPacket = (GetUserDirRspPacket)packet;
this.namePathPair = getUserDirRspPacket.getNamePathPair();
this.requestCustomizeAppInfo();
break;
case PacketConfig.kGetFileListPacketRspType:
GetFileListRspPacket getFileListRspPacket = (GetFileListRspPacket)packet;
List<File> fileList = getFileListRspPacket.getFileList();
ui.notifyFileList(fileList);
break;
//added by dhm 2011.7.17
case PacketConfig.kGetGradePacketRspType:
GetGradeRspPacket getGradePacket = (GetGradeRspPacket)packet;
this.gradeList = getGradePacket.getGradeDetails();
ui.notifyGetGradeResult(gradeList);
break;
case PacketConfig.kScoringPacketRspType:
ScoringRspPacket scoringRspPacket = (ScoringRspPacket)packet;
String msg = scoringRspPacket.getRspMsg();
ui.notifyScoringResult(msg);
break;
}
}
public void shiftToUI() {
ui.show();
}
public void register(String username, String password, String description) {
UserRegPacket packet = new UserRegPacket(username, password, description);
transmitter.sendPacket(packet);
System.out.println("send UserRegPacket");
}
public void login(String username, String password) {
UserLoginPacket packet = new UserLoginPacket(username, password);
userID = username;
transmitter.sendPacket(packet);
System.out.println("send UserLoginPacket");
}
public void requestAllAppInfo() {
AllAppInfoReqPacket packet = new AllAppInfoReqPacket();
packet.setUserID(userID);
transmitter.sendPacket(packet);
System.out.println("send AllAppInfoReqPacket");
}
public void requestCustomizeAppInfo()
{
CustomizeAppInfoReqPacket packet = new CustomizeAppInfoReqPacket();
packet.setUserID(userID);
packet.setUseTime(worksetName);
System.out.println("userID = " + userID + " worksetName = " + worksetName);
transmitter.sendPacket(packet);
System.out.println("send CustomizeAppInfoReqPacket");
}
public void startSelectedApp(String appName, String appPath, int hwnd , int osType) throws Exception
{
String vncIP = null;
String vmIP = null ;
int vncPort = 0;
String ostype = null;
if(osType == ComConfig.windowsType){
ostype = "windows";
}else{
ostype = "linux";
}
if(VMs[0].getOs().equals(ostype)){
vncIP = IPUtil.intToString(VMs[0].getVncPmIP());
vncPort = VMs[0].getVncPmPort();
vmIP = IPUtil.intToString(VMs[0].getIp());
}else{
vncIP = IPUtil.intToString(VMs[1].getVncPmIP());
vncPort = VMs[1].getVncPmPort();
vmIP = IPUtil.intToString(VMs[1].getIp());
}
System.out.println("vncIP:"+vncIP+" vncPort:"+vncPort+" appName"+appName+" vmIP"+vmIP+" appPath"+appPath+" hwnd"+hwnd);
vnc.startApp(vncIP, vncPort, vmIP, appName, appPath, hwnd);
runningAppNameList.insert(appName);
runningAppPathList.insert(appPath);
}
public void customizeAppsRequest(String[] appIDs)
{
CustomizeAppPacket packet = new CustomizeAppPacket();
packet.setAppIDs(appIDs);
packet.setUserID(userID);
transmitter.sendPacket(packet);
System.out.println("send CustomizeAppPacket");
}
public void unCustomizeAppsRequest(String[] appIDs)
{
for(int i = 0 ; i < appIDs.length ; i++)
{
UnCustomizeAppPacket packet = new UnCustomizeAppPacket();
packet.setUserID(userID);
packet.setAppID(appIDs[i]);
transmitter.sendPacket(packet);
System.out.println("send UnCustomizeAppPacket");
}
}
public void save()
{
SaveScenePacket packet = new SaveScenePacket();
packet.setUsername(userID);
transmitter.sendPacket(packet);
System.out.println("send SaveScenePacket");
}
public void logout() {
UserLogoutPacket packet = new UserLogoutPacket();
packet.setUsername(userID);
transmitter.sendPacket(packet);
currentState = CoreConfig.initialState;
System.out.println("send UserLogoutPacket");
}
public String notifyClient() {
// TODO Auto-generated method stub
return null;
}
public void requestWorksetList()
{
WorksetInfoReqPacket packet = new WorksetInfoReqPacket();
packet.setUserName(userID);
System.out.println("userName : " + packet.getUserName());
transmitter.sendPacket(packet);
System.out.println("send WorksetInfoReqPacket");
}
public void restoreSelectedWorkset( String worksetName ) {
this.worksetName = worksetName;
RestoreScenePacket packet = new RestoreScenePacket();
packet.setUsername(userID);
packet.setTime(worksetName);
System.out.println("worksetName : " + packet.getTime());
System.out.println("userName : " + packet.getUsername());
transmitter.sendPacket(packet);
}
public void requestUserDir(String userName)
{
GetUserDirPacket packet = new GetUserDirPacket();
packet.setUserName(userName);
transmitter.sendPacket(packet);
}
public void requestFileList(String dir)
{
GetFileListPacket packet = new GetFileListPacket();
packet.setDir(dir);
transmitter.sendPacket(packet);
}
public void notifyClient(String result) {
// TODO Auto-generated method stub
}
//added by dhm 2011.07.16
public void getGrade(String username) {
GetGradeReqPacket packet = new GetGradeReqPacket();
packet.setUserID(username);
transmitter.sendPacket(packet);
System.out.println("send GetGradeReqPacket");
}
public void scoring(LinkedList<String> scoringList) {
ScoringReqPacket packet = new ScoringReqPacket();
packet.setScoringList(scoringList);
transmitter.sendPacket(packet);
System.out.println("send ScoringReqPacket");
}
}