@Override protected void configureServlets() { // Bind resource services bind(LanguageResourceService.class).toInstance(languageResourceService); bind(PatchResourceService.class).toInstance(patchResourceService); // Load initial language resources from servlet context languageResourceService.addLanguageResources(getServletContext()); // Load authentication provider from guacamole.properties for sake of backwards compatibility Class<AuthenticationProvider> authProviderProperty = getAuthProviderProperty(); if (authProviderProperty != null) bindAuthenticationProvider(authProviderProperty); // Init JavaScript resources with base guacamole.min.js Collection<Resource> javaScriptResources = new ArrayList<Resource>(); javaScriptResources.add(new WebApplicationResource(getServletContext(), "/guacamole.min.js")); // Init CSS resources with base guacamole.min.css Collection<Resource> cssResources = new ArrayList<Resource>(); cssResources.add(new WebApplicationResource(getServletContext(), "/guacamole.min.css")); // Load all extensions loadExtensions(javaScriptResources, cssResources); // Always bind basic auth last bindAuthenticationProvider(BasicFileAuthenticationProvider.class); // Dynamically generate app.js and app.css from extensions serve("/app.js").with(new ResourceServlet(new SequenceResource(javaScriptResources))); serve("/app.css").with(new ResourceServlet(new SequenceResource(cssResources))); // Dynamically serve all language resources for (Map.Entry<String, Resource> entry : languageResourceService.getLanguageResources().entrySet()) { // Get language key/resource pair String languageKey = entry.getKey(); Resource resource = entry.getValue(); // Serve resource within /translations serve("/translations/" + languageKey + ".json").with(new ResourceServlet(resource)); } }
/** * Serves each of the given resources as a language resource. Language resources are served from * within the "/translations" directory as JSON files, where the name of each JSON file is the * language key. * * @param resources A map of all language resources to serve, where the key of each entry in the * language key from which the name of the JSON file will be derived. */ private void serveLanguageResources(Map<String, Resource> resources) { // Add all resources to language resource service for (Map.Entry<String, Resource> translationResource : resources.entrySet()) { // Get path and resource from path/resource pair String path = translationResource.getKey(); Resource resource = translationResource.getValue(); // Derive key from path String languageKey = languageResourceService.getLanguageKey(path); if (languageKey == null) { logger.warn("Invalid language file name: \"{}\"", path); continue; } // Add language resource languageResourceService.addLanguageResource(languageKey, resource); } }