@ -45,6 +45,7 @@ import java.util.Date;
import java.util.HashMap ;
import java.util.HashMap ;
import java.util.LinkedList ;
import java.util.LinkedList ;
import java.util.List ;
import java.util.List ;
import java.util.UUID ;
import java.util.Map ;
import java.util.Map ;
/ * *
/ * *
@ -72,6 +73,7 @@ public class RemoteSessionManagementServiceImpl implements RemoteSessionManageme
sessionQueryParamList . add ( session . getQueryString ( ) ) ;
sessionQueryParamList . add ( session . getQueryString ( ) ) ;
sessionQueryParam . put ( RemoteSessionConstants . QUERY_STRING , sessionQueryParamList ) ;
sessionQueryParam . put ( RemoteSessionConstants . QUERY_STRING , sessionQueryParamList ) ;
if ( operationId = = null ) {
// Validate the token
// Validate the token
OAuthAuthenticator oAuthAuthenticator = RemoteSessionManagementDataHolder . getInstance ( ) . getOauthAuthenticator ( ) ;
OAuthAuthenticator oAuthAuthenticator = RemoteSessionManagementDataHolder . getInstance ( ) . getOauthAuthenticator ( ) ;
AuthenticationInfo authenticationInfo = oAuthAuthenticator . isAuthenticated ( sessionQueryParam ) ;
AuthenticationInfo authenticationInfo = oAuthAuthenticator . isAuthenticated ( sessionQueryParam ) ;
@ -101,15 +103,15 @@ public class RemoteSessionManagementServiceImpl implements RemoteSessionManageme
session . setMaxIdleTimeout ( RemoteSessionManagementDataHolder . getInstance ( ) . getMaxIdleTimeout ( ) ) ;
session . setMaxIdleTimeout ( RemoteSessionManagementDataHolder . getInstance ( ) . getMaxIdleTimeout ( ) ) ;
// if session initiated using operation id means request came from device
// if session initiated using operation id means request came from device
if ( operationId ! = null ) {
// if (operationId != null) {
// create new device session
// // create new device session
initializeDeviceSession ( session , authenticationInfo . getTenantDomain ( ) , deviceType , deviceId ,
// initializeDeviceSession(session, authenticationInfo.getTenantDomain(), deviceType, deviceId,
operationId ) ;
// operationId);
} else {
// } else {
// create new client session
// create new client session
initializeClientSession ( session , authenticationInfo . getTenantDomain ( ) , deviceType ,
initializeClientSession ( session , authenticationInfo . getTenantDomain ( ) , deviceType ,
deviceId ) ;
deviceId ) ;
}
// }
log . info ( "Current remote sessions count: " + RemoteSessionManagementDataHolder . getInstance ( )
log . info ( "Current remote sessions count: " + RemoteSessionManagementDataHolder . getInstance ( )
. getSessionMap ( ) . size ( ) ) ;
. getSessionMap ( ) . size ( ) ) ;
@ -133,6 +135,28 @@ public class RemoteSessionManagementServiceImpl implements RemoteSessionManageme
} else {
} else {
throw new RemoteSessionManagementException ( "Invalid token" ) ;
throw new RemoteSessionManagementException ( "Invalid token" ) ;
}
}
} else {
// set common settings for session
session . setMaxBinaryMessageBufferSize ( RemoteSessionManagementDataHolder . getInstance ( )
. getMaxMessageBufferSize ( ) ) ;
session . setMaxTextMessageBufferSize ( RemoteSessionManagementDataHolder . getInstance ( )
. getMaxMessageBufferSize ( ) ) ;
session . setMaxIdleTimeout ( RemoteSessionManagementDataHolder . getInstance ( ) . getMaxIdleTimeout ( ) ) ;
String uuid = session . getQueryString ( ) ;
if ( uuid ! = null & & uuid . isEmpty ( ) ) {
log . error ( "Could not find a UUID related to the remote session" ) ;
} else {
String tenantDomain = RemoteSessionManagementDataHolder . getInstance ( ) . getUuidToTenantMap ( ) . remove ( uuid ) ;
if ( tenantDomain = = null | | tenantDomain . isEmpty ( ) ) {
log . error ( "Invalid UUID, could not create the remote session" ) ;
} else {
// create new device session
initializeDeviceSession ( session , tenantDomain , deviceType , deviceId , operationId , uuid ) ;
}
}
}
}
}
@Override
@Override
@ -194,6 +218,7 @@ public class RemoteSessionManagementServiceImpl implements RemoteSessionManageme
. getId ( ) ) ;
. getId ( ) ) ;
if ( remoteSession ! = null ) {
if ( remoteSession ! = null ) {
//String operationId = remoteSession.getOperationId();
//String operationId = remoteSession.getOperationId();
RemoteSessionManagementDataHolder . getInstance ( ) . getUuidToTenantMap ( ) . remove ( remoteSession . getUuidToValidateDevice ( ) ) ;
String deviceKey = remoteSession . getTenantDomain ( ) + "/" + remoteSession . getDeviceType ( ) + "/" +
String deviceKey = remoteSession . getTenantDomain ( ) + "/" + remoteSession . getDeviceType ( ) + "/" +
remoteSession . getDeviceId ( ) ;
remoteSession . getDeviceId ( ) ;
RemoteSession lastSession = RemoteSessionManagementDataHolder . getInstance ( )
RemoteSession lastSession = RemoteSessionManagementDataHolder . getInstance ( )
@ -239,8 +264,9 @@ public class RemoteSessionManagementServiceImpl implements RemoteSessionManageme
private void initializeClientSession ( Session session , String tenantDomain , String deviceType , String deviceId ) throws RemoteSessionManagementException ,
private void initializeClientSession ( Session session , String tenantDomain , String deviceType , String deviceId ) throws RemoteSessionManagementException ,
OperationManagementException , InvalidDeviceException {
OperationManagementException , InvalidDeviceException {
String uuidToValidateDevice = UUID . randomUUID ( ) . toString ( ) ;
RemoteSession clientRemote = new RemoteSession ( session , tenantDomain , deviceType , deviceId , RemoteSessionConstants
RemoteSession clientRemote = new RemoteSession ( session , tenantDomain , deviceType , deviceId , RemoteSessionConstants
. CONNECTION_TYPE . CLIENT );
. CONNECTION_TYPE . CLIENT , uuidToValidateDevice );
String deviceKey = tenantDomain + "/" + deviceType + "/" + deviceId ;
String deviceKey = tenantDomain + "/" + deviceType + "/" + deviceId ;
// Create new remote control operation to start the session
// Create new remote control operation to start the session
RemoteSession activeSession = RemoteSessionManagementDataHolder . getInstance ( ) . getActiveDeviceClientSessionMap
RemoteSession activeSession = RemoteSessionManagementDataHolder . getInstance ( ) . getActiveDeviceClientSessionMap
@ -277,6 +303,12 @@ public class RemoteSessionManagementServiceImpl implements RemoteSessionManageme
operation . setControl ( Operation . Control . NO_REPEAT ) ;
operation . setControl ( Operation . Control . NO_REPEAT ) ;
JSONObject payload = new JSONObject ( ) ;
JSONObject payload = new JSONObject ( ) ;
payload . put ( "serverUrl" , RemoteSessionManagementDataHolder . getInstance ( ) . getServerUrl ( ) ) ;
payload . put ( "serverUrl" , RemoteSessionManagementDataHolder . getInstance ( ) . getServerUrl ( ) ) ;
payload . put ( "uuidToValidateDevice" , uuidToValidateDevice ) ;
String uuidToTenantMap = RemoteSessionManagementDataHolder . getInstance ( ) . getUuidToTenantMap
( ) . putIfAbsent ( uuidToValidateDevice , tenantDomain ) ;
if ( log . isDebugEnabled ( ) ) {
log . debug ( "UUID " + uuidToTenantMap + " is generated against the tenant : " + tenantDomain ) ;
}
operation . setPayLoad ( payload . toString ( ) ) ;
operation . setPayLoad ( payload . toString ( ) ) ;
String date = new SimpleDateFormat ( RemoteSessionConstants . DATE_FORMAT_NOW ) . format ( new Date ( ) ) ;
String date = new SimpleDateFormat ( RemoteSessionConstants . DATE_FORMAT_NOW ) . format ( new Date ( ) ) ;
operation . setCreatedTimeStamp ( date ) ;
operation . setCreatedTimeStamp ( date ) ;
@ -287,6 +319,7 @@ public class RemoteSessionManagementServiceImpl implements RemoteSessionManageme
clientRemote . setOperationId ( activity . getActivityId ( ) . replace ( DeviceManagementConstants
clientRemote . setOperationId ( activity . getActivityId ( ) . replace ( DeviceManagementConstants
. OperationAttributes . ACTIVITY , "" ) ) ;
. OperationAttributes . ACTIVITY , "" ) ) ;
RemoteSessionManagementDataHolder . getInstance ( ) . getSessionMap ( ) . put ( session . getId ( ) , clientRemote ) ;
RemoteSessionManagementDataHolder . getInstance ( ) . getSessionMap ( ) . put ( session . getId ( ) , clientRemote ) ;
log . info ( "Client remote session opened for session id: " + session . getId ( ) + " device Type : " +
log . info ( "Client remote session opened for session id: " + session . getId ( ) + " device Type : " +
deviceType + " , " + "deviceId : " + deviceId ) ;
deviceType + " , " + "deviceId : " + deviceId ) ;
} else {
} else {
@ -307,7 +340,7 @@ public class RemoteSessionManagementServiceImpl implements RemoteSessionManageme
* @throws RemoteSessionManagementException throws when session has errors with accessing device resources
* @throws RemoteSessionManagementException throws when session has errors with accessing device resources
* /
* /
private void initializeDeviceSession ( Session session , String tenantDomain , String deviceType , String deviceId ,
private void initializeDeviceSession ( Session session , String tenantDomain , String deviceType , String deviceId ,
String operationId ) throws RemoteSessionManagementException {
String operationId , String uuidToValidateDevice ) throws RemoteSessionManagementException {
String deviceKey = tenantDomain + "/" + deviceType + "/" + deviceId ;
String deviceKey = tenantDomain + "/" + deviceType + "/" + deviceId ;
RemoteSession activeSession = RemoteSessionManagementDataHolder . getInstance ( )
RemoteSession activeSession = RemoteSessionManagementDataHolder . getInstance ( )
. getActiveDeviceClientSessionMap ( ) . get ( deviceKey ) ;
. getActiveDeviceClientSessionMap ( ) . get ( deviceKey ) ;
@ -317,7 +350,7 @@ public class RemoteSessionManagementServiceImpl implements RemoteSessionManageme
if ( clientRemote ! = null ) {
if ( clientRemote ! = null ) {
if ( clientRemote . getOperationId ( ) . equals ( operationId ) ) {
if ( clientRemote . getOperationId ( ) . equals ( operationId ) ) {
RemoteSession deviceRemote = new RemoteSession ( session , tenantDomain , deviceType , deviceId ,
RemoteSession deviceRemote = new RemoteSession ( session , tenantDomain , deviceType , deviceId ,
RemoteSessionConstants . CONNECTION_TYPE . DEVICE );
RemoteSessionConstants . CONNECTION_TYPE . DEVICE , uuidToValidateDevice );
deviceRemote . setOperationId ( operationId ) ;
deviceRemote . setOperationId ( operationId ) ;
deviceRemote . setPeerSession ( clientRemote ) ;
deviceRemote . setPeerSession ( clientRemote ) ;
clientRemote . setPeerSession ( deviceRemote ) ;
clientRemote . setPeerSession ( deviceRemote ) ;