8383import org .osgi .service .event .Event ;
8484import org .osgi .service .event .EventAdmin ;
8585import org .osgi .service .event .EventProperties ;
86- import org .osgi .service .http .NamespaceException ;
8786import org .osgi .service .servlet .context .ServletContextHelper ;
8887import org .osgi .service .servlet .whiteboard .HttpWhiteboardConstants ;
8988import org .slf4j .Logger ;
9695
9796public class Console implements SelfConfiguringComponent {
9897
99- private static final String SESSION_CONTEXT_NAME = "sessionContext" ;
100-
101- private static final String RESOURCE_CONTEXT_NAME = "resourceContext" ;
98+ private static final String SESSION_CONTEXT_NAME_PREFIX = "sessionContext-" ;
99+ private static final String RESOURCE_CONTEXT_NAME_PREFIX = "resourceContext-" ;
102100
103101 private static final String SESSION = "/session" ;
104102
@@ -117,6 +115,8 @@ public class Console implements SelfConfiguringComponent {
117115 private static final String PASSWORD_AUTH_PATH = LOGIN_MODULE_PATH + "/password" ;
118116 private static final String CERT_AUTH_PATH = LOGIN_MODULE_PATH + "/cert" ;
119117
118+ private static final String XSRF_PATH = "/xsrf" ;
119+
120120 private static final Logger logger = LoggerFactory .getLogger (Console .class );
121121
122122 private String appRoot ;
@@ -138,6 +138,9 @@ public class Console implements SelfConfiguringComponent {
138138 private final Set <ServiceRegistration <ResourcesService >> resources = new CopyOnWriteArraySet <>();
139139 private final Set <ServiceRegistration <Servlet >> servlets = new CopyOnWriteArraySet <>();
140140
141+ private final Set <String > authenticationPaths = new HashSet <>(
142+ Arrays .asList (AUTH_PATH , PASSWORD_AUTH_PATH , CERT_AUTH_PATH ));
143+
141144 private BundleContext bundleContext ;
142145
143146 private static Console instance ;
@@ -268,14 +271,11 @@ private void doUpdate(ConsoleOptions options) {
268271 setAppRoot (options .getAppRoot ());
269272 setSessionMaxInactiveInterval (options .getSessionMaxInactivityInterval ());
270273
271- try {
272- initHTTPService ();
273- } catch (NamespaceException e ) {
274- logger .warn ("Error Registering Web Resources" , e );
275- }
274+ initResourcesAndServlets ();
275+
276276 }
277277
278- protected void deactivate (BundleContext context ) {
278+ protected void deactivate () {
279279 logger .info ("deactivate..." );
280280
281281 unregisterAll ();
@@ -289,13 +289,16 @@ protected void deactivate(BundleContext context) {
289289
290290 private synchronized void unregisterAll () {
291291
292- this .contexts .forEach (ServiceRegistration ::unregister );
292+ this .wiresBlinkService .stop ();
293+ this .eventService .stop ();
294+
293295 this .resources .forEach (ServiceRegistration ::unregister );
294296 this .servlets .forEach (ServiceRegistration ::unregister );
297+ this .contexts .forEach (ServiceRegistration ::unregister );
295298
296- this .wiresBlinkService . stop ();
297-
298- this .eventService . stop ();
299+ this .contexts . clear ();
300+ this . resources . clear ();
301+ this .servlets . clear ();
299302
300303 }
301304
@@ -409,8 +412,6 @@ private void updateAuditContext(final HttpSession session) {
409412
410413 }
411414
412- final Set <String > authenticationPaths = new HashSet <>(Arrays .asList (AUTH_PATH , PASSWORD_AUTH_PATH , CERT_AUTH_PATH ));
413-
414415 private SecurityHandler createSessionHandlerChain () {
415416
416417 final Set <String > eventPaths = new HashSet <>(Arrays .asList (DENALI_MODULE_PATH + EVENT_PATH , "/sse" ));
@@ -429,7 +430,7 @@ private SecurityHandler createSessionHandlerChain() {
429430 final RoutingSecurityHandler routingHandler = new RoutingSecurityHandler (
430431 defaultHandler .sendErrorOnFailure (401 ));
431432
432- // exception on authentication paths, allow access without authenticaton but
433+ // exception on authentication paths, allow access without authentication but
433434 // create a session
434435 routingHandler .addRouteHandler (this .authenticationPaths ::contains ,
435436 chain (baseHandler , new CreateSessionSecurityHandler ()));
@@ -446,92 +447,94 @@ private SecurityHandler createSessionHandlerChain() {
446447 // exception on login session and xsrf path, like default but without locked
447448 // session checking
448449 routingHandler .addRouteHandler (
449- Arrays .asList (LOGIN_MODULE_PATH + SESSION , LOGIN_MODULE_PATH + "/xsrf" )::contains ,
450+ Arrays .asList (LOGIN_MODULE_PATH + SESSION , LOGIN_MODULE_PATH + XSRF_PATH )::contains ,
450451 chain (baseHandler , sessionAuthHandler , sessionExpirationHandler ));
451452
452453 return routingHandler ;
453454 }
454455
455- private synchronized void initHTTPService () throws NamespaceException {
456+ private synchronized void initResourcesAndServlets () {
456457
457458 this .eventService = new GwtEventServiceImpl ();
458459 this .wiresBlinkService = new WiresBlinkServlet ();
459460
460461 ServletContextHelper resourceContextHelper = new HttpServletContextHelper (new BaseSecurityHandler ());
461462 ServletContextHelper sessionContextHelper = new HttpServletContextHelper (createSessionHandlerChain ());
462463
463- registerContextHelper (RESOURCE_CONTEXT_NAME , "/" , resourceContextHelper , 5 );
464- registerContextHelper (SESSION_CONTEXT_NAME , "/" , sessionContextHelper , 10 );
464+ String resourceContextName = RESOURCE_CONTEXT_NAME_PREFIX + System .nanoTime ();
465+ String sessionContextName = SESSION_CONTEXT_NAME_PREFIX + System .nanoTime ();
466+
467+ registerContextHelper (resourceContextName , "/" , resourceContextHelper , 5 );
468+ registerContextHelper (sessionContextName , "/" , sessionContextHelper , 10 );
465469
466- registerResources (ADMIN_ROOT + "/*" , "www" , new AdminResources (), RESOURCE_CONTEXT_NAME );
467- registerResources (AUTH_PATH , "www/auth.html" , new AuthorizationResources (), SESSION_CONTEXT_NAME );
468- registerResources (CONSOLE_PATH , "www/denali.html" , new ConsoleResources (), SESSION_CONTEXT_NAME );
470+ registerResources (ADMIN_ROOT + "/*" , "www" , new AdminResources (), resourceContextName );
471+ registerResources (AUTH_PATH , "www/auth.html" , new AuthorizationResources (), sessionContextName );
472+ registerResources (CONSOLE_PATH , "www/denali.html" , new ConsoleResources (), sessionContextName );
469473
470474 registerServlet ("gwtLoginInfoService" , LOGIN_MODULE_PATH + "/loginInfo" , new GwtLoginInfoServiceImpl (),
471- RESOURCE_CONTEXT_NAME );
472- registerServlet ("redirectServlet" , "/" , new RedirectServlet ("/" ::equals , this .appRoot ), RESOURCE_CONTEXT_NAME );
475+ resourceContextName );
476+ registerServlet ("redirectServlet" , "/" , new RedirectServlet ("/" ::equals , this .appRoot ), resourceContextName );
473477
474478 registerServlet ("notFoundAuthResourceServlet" , AUTH_RESOURCE_PATH , new SendStatusServlet (404 ),
475- RESOURCE_CONTEXT_NAME );
479+ resourceContextName );
476480 registerServlet ("notFoundConsoleResourceServlet" , CONSOLE_RESOURCE_PATH , new SendStatusServlet (404 ),
477- RESOURCE_CONTEXT_NAME );
481+ resourceContextName );
478482
479483 registerServlet ("gwtPasswordAuthenticationService" , PASSWORD_AUTH_PATH ,
480- new GwtPasswordAuthenticationServiceImpl (this .userManager , CONSOLE_PATH ), SESSION_CONTEXT_NAME );
484+ new GwtPasswordAuthenticationServiceImpl (this .userManager , CONSOLE_PATH ), sessionContextName );
481485 registerServlet ("sslAuthenticationServlet" , CERT_AUTH_PATH ,
482- new SslAuthenticationServlet (CONSOLE_PATH , this .userManager ), SESSION_CONTEXT_NAME );
486+ new SslAuthenticationServlet (CONSOLE_PATH , this .userManager ), sessionContextName );
483487
484488 registerServlet ("gwtKeystoreServiceImpl" , DENALI_MODULE_PATH + "/keystore" , new GwtKeystoreServiceImpl (),
485- SESSION_CONTEXT_NAME );
489+ sessionContextName );
486490 registerServlet ("gwtSslManagerServiceImpl" , DENALI_MODULE_PATH + "/ssl" , new GwtSslManagerServiceImpl (),
487- SESSION_CONTEXT_NAME );
491+ sessionContextName );
488492
489493 registerServlet ("denaliSessionService" , DENALI_MODULE_PATH + SESSION ,
490- new GwtSessionServiceImpl (this .userManager ), SESSION_CONTEXT_NAME );
494+ new GwtSessionServiceImpl (this .userManager ), sessionContextName );
491495
492496 registerServlet ("loginSessionService" , LOGIN_MODULE_PATH + SESSION , new GwtSessionServiceImpl (this .userManager ),
493- SESSION_CONTEXT_NAME );
494- registerServlet ("xsrfLoginServlet" , LOGIN_MODULE_PATH + "/xsrf" , new GwtSecurityTokenServiceImpl (),
495- SESSION_CONTEXT_NAME );
496- registerServlet ("xsrfDenaliServlet" , DENALI_MODULE_PATH + "/xsrf" , new GwtSecurityTokenServiceImpl (),
497- SESSION_CONTEXT_NAME );
497+ sessionContextName );
498+ registerServlet ("xsrfLoginServlet" , LOGIN_MODULE_PATH + XSRF_PATH , new GwtSecurityTokenServiceImpl (),
499+ sessionContextName );
500+ registerServlet ("xsrfDenaliServlet" , DENALI_MODULE_PATH + XSRF_PATH , new GwtSecurityTokenServiceImpl (),
501+ sessionContextName );
498502 registerServlet ("statusService" , DENALI_MODULE_PATH + "/status" , new GwtStatusServiceImpl (),
499- SESSION_CONTEXT_NAME );
503+ sessionContextName );
500504 registerServlet ("deviceService" , DENALI_MODULE_PATH + "/device" , new GwtDeviceServiceImpl (),
501- SESSION_CONTEXT_NAME );
502- registerServlet ("logService" , DENALI_MODULE_PATH + "/logservice" , new GwtLogServiceImpl (),
503- SESSION_CONTEXT_NAME );
505+ sessionContextName );
506+ registerServlet ("logService" , DENALI_MODULE_PATH + "/logservice" , new GwtLogServiceImpl (), sessionContextName );
504507 registerServlet ("networkService" , DENALI_MODULE_PATH + "/network" , new GwtNetworkServiceImpl (),
505- SESSION_CONTEXT_NAME );
508+ sessionContextName );
506509 registerServlet ("componentService" , DENALI_MODULE_PATH + "/component" , new GwtComponentServiceImpl (),
507- SESSION_CONTEXT_NAME );
510+ sessionContextName );
508511 registerServlet ("packageService" , DENALI_MODULE_PATH + "/package" ,
509- new GwtPackageServiceImpl (this .sslManagerService ::get ), SESSION_CONTEXT_NAME );
512+ new GwtPackageServiceImpl (this .sslManagerService ::get ), sessionContextName );
510513 registerServlet ("snapshotServiceImpl" , DENALI_MODULE_PATH + "/snapshot" , new GwtSnapshotServiceImpl (),
511- SESSION_CONTEXT_NAME );
514+ sessionContextName );
512515 registerServlet ("certificateService" , DENALI_MODULE_PATH + "/certificate" , new GwtCertificatesServiceImpl (),
513- SESSION_CONTEXT_NAME );
516+ sessionContextName );
514517 registerServlet ("securityService" , DENALI_MODULE_PATH + "/security" , new GwtSecurityServiceImpl (),
515- SESSION_CONTEXT_NAME );
518+ sessionContextName );
516519 registerServlet ("usersService" , DENALI_MODULE_PATH + "/users" , new GwtUserServiceImpl (this .userManager ),
517- SESSION_CONTEXT_NAME );
518- registerServlet ("fileServlet" , DENALI_MODULE_PATH + "/file/*" , new FileServlet (), SESSION_CONTEXT_NAME );
520+ sessionContextName );
521+ registerServlet ("fileServlet" , DENALI_MODULE_PATH + "/file/*" , new FileServlet (), sessionContextName );
519522 registerServlet ("deviceSnapshotsServlet" , DENALI_MODULE_PATH + "/device_snapshots" ,
520- new DeviceSnapshotsServlet (), SESSION_CONTEXT_NAME );
523+ new DeviceSnapshotsServlet (), sessionContextName );
521524 registerServlet ("channelServlet" , DENALI_MODULE_PATH + "/assetsUpDownload" , new ChannelServlet (),
522- SESSION_CONTEXT_NAME );
523- registerServlet ("logServlet" , DENALI_MODULE_PATH + "/log" , new LogServlet (), SESSION_CONTEXT_NAME );
524- registerServlet ("skinServlet" , DENALI_MODULE_PATH + "/skin/*" , new SkinServlet (), RESOURCE_CONTEXT_NAME );
525+ sessionContextName );
526+ registerServlet ("logServlet" , DENALI_MODULE_PATH + "/log" , new LogServlet (), sessionContextName );
527+ registerServlet ("skinServlet" , DENALI_MODULE_PATH + "/skin/*" , new SkinServlet (), resourceContextName );
525528 registerServlet ("cloudServices" , DENALI_MODULE_PATH + "/cloudservices" , new GwtCloudConnectionServiceImpl (),
526- SESSION_CONTEXT_NAME );
529+ sessionContextName );
527530 registerServlet ("wireGraphService" , DENALI_MODULE_PATH + "/wires" , new GwtWireGraphServiceImpl (),
528- SESSION_CONTEXT_NAME );
531+ sessionContextName );
529532 registerServlet ("wiresSnapshotServlet" , DENALI_MODULE_PATH + "/wiresSnapshot" , new WiresSnapshotServlet (),
530- SESSION_CONTEXT_NAME );
533+ sessionContextName );
531534 registerServlet ("driverAndAssetService" , DENALI_MODULE_PATH + "/assetservices" ,
532- new GwtDriverAndAssetServiceImpl (), SESSION_CONTEXT_NAME );
533- registerServlet ("wiresBlinkService" , ADMIN_ROOT + "/sse" , this .wiresBlinkService , SESSION_CONTEXT_NAME );
534- registerServlet ("eventService" , DENALI_MODULE_PATH + EVENT_PATH , this .eventService , SESSION_CONTEXT_NAME );
535+ new GwtDriverAndAssetServiceImpl (), sessionContextName );
536+ registerServlet ("wiresBlinkService" , ADMIN_ROOT + "/sse" , this .wiresBlinkService , sessionContextName );
537+ registerServlet ("eventService" , DENALI_MODULE_PATH + EVENT_PATH , this .eventService , sessionContextName );
535538
536539 this .eventService .start ();
537540 }
@@ -548,37 +551,51 @@ private void registerContextHelper(String contextName, String contextPath, Servl
548551 .registerService (ServletContextHelper .class , contextHelper , new Hashtable <>(props ));
549552
550553 this .contexts .add (contextService );
554+
555+ logger .debug ("registered context helper with id: {} , name: {} , path {}" , //
556+ contextService .getReference ().getProperty (Constants .SERVICE_ID ), contextName , contextPath );
551557 }
552558
553559 private void registerResources (String pattern , String prefix , ResourcesService resourcesService ,
554560 String contextHelperName ) {
555561 Map <String , Object > props = new HashMap <>();
556562
563+ String contextHelperSelector = "(" + HttpWhiteboardConstants .HTTP_WHITEBOARD_CONTEXT_NAME + "="
564+ + contextHelperName + ")" ;
565+
557566 props .put (HttpWhiteboardConstants .HTTP_WHITEBOARD_RESOURCE_PATTERN , pattern );
558567 props .put (HttpWhiteboardConstants .HTTP_WHITEBOARD_RESOURCE_PREFIX , prefix );
559- props .put (HttpWhiteboardConstants .HTTP_WHITEBOARD_CONTEXT_SELECT ,
560- "(" + HttpWhiteboardConstants .HTTP_WHITEBOARD_CONTEXT_NAME + "=" + contextHelperName + ")" );
568+ props .put (HttpWhiteboardConstants .HTTP_WHITEBOARD_CONTEXT_SELECT , contextHelperSelector );
561569
562570 ServiceRegistration <ResourcesService > resourcesS = this .bundleContext .registerService (ResourcesService .class ,
563571 resourcesService , new Hashtable <>(props ));
564572
565573 this .resources .add (resourcesS );
574+
575+ logger .debug ("registered resource with id: {} , pattern: {} , prefix {} , contextHelper {}" , //
576+ resourcesS .getReference ().getProperty (Constants .SERVICE_ID ), pattern , prefix , contextHelperSelector );
566577 }
567578
568579 private void registerServlet (String servletName , String servletPattern , HttpServlet servlet ,
569580 String contextHelperName ) {
570581
571582 Map <String , String > props = new HashMap <>();
572583
584+ String contextHelperSelector = "(" + HttpWhiteboardConstants .HTTP_WHITEBOARD_CONTEXT_NAME + "="
585+ + contextHelperName + ")" ;
586+
573587 props .put (HttpWhiteboardConstants .HTTP_WHITEBOARD_SERVLET_NAME , servletName );
574588 props .put (HttpWhiteboardConstants .HTTP_WHITEBOARD_SERVLET_PATTERN , servletPattern );
575- props .put (HttpWhiteboardConstants .HTTP_WHITEBOARD_CONTEXT_SELECT ,
576- "(" + HttpWhiteboardConstants .HTTP_WHITEBOARD_CONTEXT_NAME + "=" + contextHelperName + ")" );
589+ props .put (HttpWhiteboardConstants .HTTP_WHITEBOARD_CONTEXT_SELECT , contextHelperSelector );
577590
578591 ServiceRegistration <Servlet > servletService = this .bundleContext .registerService (Servlet .class , servlet ,
579592 new Hashtable <>(props ));
580593
581594 this .servlets .add (servletService );
595+
596+ logger .debug ("registered servlet with id: {} , name: {} , pattern {} , contextHelper {}" , //
597+ servletService .getReference ().getProperty (Constants .SERVICE_ID ), servletName , servletPattern ,
598+ contextHelperSelector );
582599 }
583600
584601 public interface ResourcesService {
@@ -609,4 +626,5 @@ public UserManager getUserManager() {
609626 public ComponentConfiguration getConfiguration () throws KuraException {
610627 return consoleOptions .getConfiguration ();
611628 }
629+
612630}
0 commit comments