You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@guacamole.apache.org by jm...@apache.org on 2016/03/29 06:20:20 UTC
[11/51] [abbrv] incubator-guacamole-client git commit: GUACAMOLE-1:
Remove useless .net.basic subpackage, now that everything is being renamed.
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/648a6c96/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/Extension.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/Extension.java b/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/Extension.java
deleted file mode 100644
index 120690a..0000000
--- a/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/Extension.java
+++ /dev/null
@@ -1,515 +0,0 @@
-/*
- * Copyright (C) 2015 Glyptodon LLC
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package org.apache.guacamole.net.basic.extension;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipException;
-import java.util.zip.ZipFile;
-import org.codehaus.jackson.JsonParseException;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.apache.guacamole.GuacamoleException;
-import org.apache.guacamole.GuacamoleServerException;
-import org.apache.guacamole.net.auth.AuthenticationProvider;
-import org.apache.guacamole.net.basic.resource.ClassPathResource;
-import org.apache.guacamole.net.basic.resource.Resource;
-
-/**
- * A Guacamole extension, which may provide custom authentication, static
- * files, theming/branding, etc.
- *
- * @author Michael Jumper
- */
-public class Extension {
-
- /**
- * The Jackson parser for parsing the language JSON files.
- */
- private static final ObjectMapper mapper = new ObjectMapper();
-
- /**
- * The name of the manifest file that describes the contents of a
- * Guacamole extension.
- */
- private static final String MANIFEST_NAME = "guac-manifest.json";
-
- /**
- * The parsed manifest file of this extension, describing the location of
- * resources within the extension.
- */
- private final ExtensionManifest manifest;
-
- /**
- * The classloader to use when reading resources from this extension,
- * including classes and static files.
- */
- private final ClassLoader classLoader;
-
- /**
- * Map of all JavaScript resources defined within the extension, where each
- * key is the path to that resource within the extension.
- */
- private final Map<String, Resource> javaScriptResources;
-
- /**
- * Map of all CSS resources defined within the extension, where each key is
- * the path to that resource within the extension.
- */
- private final Map<String, Resource> cssResources;
-
- /**
- * Map of all HTML patch resources defined within the extension, where each
- * key is the path to that resource within the extension.
- */
- private final Map<String, Resource> htmlResources;
-
- /**
- * Map of all translation resources defined within the extension, where
- * each key is the path to that resource within the extension.
- */
- private final Map<String, Resource> translationResources;
-
- /**
- * Map of all resources defined within the extension which are not already
- * associated as JavaScript, CSS, or translation resources, where each key
- * is the path to that resource within the extension.
- */
- private final Map<String, Resource> staticResources;
-
- /**
- * The collection of all AuthenticationProvider classes defined within the
- * extension.
- */
- private final Collection<Class<AuthenticationProvider>> authenticationProviderClasses;
-
- /**
- * The resource for the small favicon for the extension. If provided, this
- * will replace the default Guacamole icon.
- */
- private final Resource smallIcon;
-
- /**
- * The resource foe the large favicon for the extension. If provided, this
- * will replace the default Guacamole icon.
- */
- private final Resource largeIcon;
-
- /**
- * Returns a new map of all resources corresponding to the collection of
- * paths provided. Each resource will be associated with the given
- * mimetype, and stored in the map using its path as the key.
- *
- * @param mimetype
- * The mimetype to associate with each resource.
- *
- * @param paths
- * The paths corresponding to the resources desired.
- *
- * @return
- * A new, unmodifiable map of resources corresponding to the
- * collection of paths provided, where the key of each entry in the
- * map is the path for the resource stored in that entry.
- */
- private Map<String, Resource> getClassPathResources(String mimetype, Collection<String> paths) {
-
- // If no paths are provided, just return an empty map
- if (paths == null)
- return Collections.<String, Resource>emptyMap();
-
- // Add classpath resource for each path provided
- Map<String, Resource> resources = new HashMap<String, Resource>(paths.size());
- for (String path : paths)
- resources.put(path, new ClassPathResource(classLoader, mimetype, path));
-
- // Callers should not rely on modifying the result
- return Collections.unmodifiableMap(resources);
-
- }
-
- /**
- * Returns a new map of all resources corresponding to the map of resource
- * paths provided. Each resource will be associated with the mimetype
- * stored in the given map using its path as the key.
- *
- * @param resourceTypes
- * A map of all paths to their corresponding mimetypes.
- *
- * @return
- * A new, unmodifiable map of resources corresponding to the
- * collection of paths provided, where the key of each entry in the
- * map is the path for the resource stored in that entry.
- */
- private Map<String, Resource> getClassPathResources(Map<String, String> resourceTypes) {
-
- // If no paths are provided, just return an empty map
- if (resourceTypes == null)
- return Collections.<String, Resource>emptyMap();
-
- // Add classpath resource for each path/mimetype pair provided
- Map<String, Resource> resources = new HashMap<String, Resource>(resourceTypes.size());
- for (Map.Entry<String, String> resource : resourceTypes.entrySet()) {
-
- // Get path and mimetype from entry
- String path = resource.getKey();
- String mimetype = resource.getValue();
-
- // Store as path/resource pair
- resources.put(path, new ClassPathResource(classLoader, mimetype, path));
-
- }
-
- // Callers should not rely on modifying the result
- return Collections.unmodifiableMap(resources);
-
- }
-
- /**
- * Retrieve the AuthenticationProvider subclass having the given name. If
- * the class having the given name does not exist or isn't actually a
- * subclass of AuthenticationProvider, an exception will be thrown.
- *
- * @param name
- * The name of the AuthenticationProvider class to retrieve.
- *
- * @return
- * The subclass of AuthenticationProvider having the given name.
- *
- * @throws GuacamoleException
- * If no such class exists, or if the class with the given name is not
- * a subclass of AuthenticationProvider.
- */
- @SuppressWarnings("unchecked") // We check this ourselves with isAssignableFrom()
- private Class<AuthenticationProvider> getAuthenticationProviderClass(String name)
- throws GuacamoleException {
-
- try {
-
- // Get authentication provider class
- Class<?> authenticationProviderClass = classLoader.loadClass(name);
-
- // Verify the located class is actually a subclass of AuthenticationProvider
- if (!AuthenticationProvider.class.isAssignableFrom(authenticationProviderClass))
- throw new GuacamoleServerException("Authentication providers MUST extend the AuthenticationProvider class.");
-
- // Return located class
- return (Class<AuthenticationProvider>) authenticationProviderClass;
-
- }
- catch (ClassNotFoundException e) {
- throw new GuacamoleException("Authentication provider class not found.", e);
- }
-
- }
-
- /**
- * Returns a new collection of all AuthenticationProvider subclasses having
- * the given names. If any class does not exist or isn't actually a
- * subclass of AuthenticationProvider, an exception will be thrown, and
- * no further AuthenticationProvider classes will be loaded.
- *
- * @param names
- * The names of the AuthenticationProvider classes to retrieve.
- *
- * @return
- * A new collection of all AuthenticationProvider subclasses having the
- * given names.
- *
- * @throws GuacamoleException
- * If any given class does not exist, or if any given class is not a
- * subclass of AuthenticationProvider.
- */
- private Collection<Class<AuthenticationProvider>> getAuthenticationProviderClasses(Collection<String> names)
- throws GuacamoleException {
-
- // If no classnames are provided, just return an empty list
- if (names == null)
- return Collections.<Class<AuthenticationProvider>>emptyList();
-
- // Define all auth provider classes
- Collection<Class<AuthenticationProvider>> classes = new ArrayList<Class<AuthenticationProvider>>(names.size());
- for (String name : names)
- classes.add(getAuthenticationProviderClass(name));
-
- // Callers should not rely on modifying the result
- return Collections.unmodifiableCollection(classes);
-
- }
-
- /**
- * Loads the given file as an extension, which must be a .jar containing
- * a guac-manifest.json file describing its contents.
- *
- * @param parent
- * The classloader to use as the parent for the isolated classloader of
- * this extension.
- *
- * @param file
- * The file to load as an extension.
- *
- * @throws GuacamoleException
- * If the provided file is not a .jar file, does not contain the
- * guac-manifest.json, or if guac-manifest.json is invalid and cannot
- * be parsed.
- */
- public Extension(final ClassLoader parent, final File file) throws GuacamoleException {
-
- try {
-
- // Open extension
- ZipFile extension = new ZipFile(file);
-
- try {
-
- // Retrieve extension manifest
- ZipEntry manifestEntry = extension.getEntry(MANIFEST_NAME);
- if (manifestEntry == null)
- throw new GuacamoleServerException("Extension " + file.getName() + " is missing " + MANIFEST_NAME);
-
- // Parse manifest
- manifest = mapper.readValue(extension.getInputStream(manifestEntry), ExtensionManifest.class);
- if (manifest == null)
- throw new GuacamoleServerException("Contents of " + MANIFEST_NAME + " must be a valid JSON object.");
-
- }
-
- // Always close zip file, if possible
- finally {
- extension.close();
- }
-
- try {
-
- // Create isolated classloader for this extension
- classLoader = AccessController.doPrivileged(new PrivilegedExceptionAction<ClassLoader>() {
-
- @Override
- public ClassLoader run() throws GuacamoleException {
-
- try {
-
- // Classloader must contain only the extension itself
- return new URLClassLoader(new URL[]{file.toURI().toURL()}, parent);
-
- }
- catch (MalformedURLException e) {
- throw new GuacamoleException(e);
- }
-
- }
-
- });
-
- }
-
- // Rethrow any GuacamoleException
- catch (PrivilegedActionException e) {
- throw (GuacamoleException) e.getException();
- }
-
- }
-
- // Abort load if not a valid zip file
- catch (ZipException e) {
- throw new GuacamoleServerException("Extension is not a valid zip file: " + file.getName(), e);
- }
-
- // Abort if manifest cannot be parsed (invalid JSON)
- catch (JsonParseException e) {
- throw new GuacamoleServerException(MANIFEST_NAME + " is not valid JSON: " + file.getName(), e);
- }
-
- // Abort if zip file cannot be read at all due to I/O errors
- catch (IOException e) {
- throw new GuacamoleServerException("Unable to read extension: " + file.getName(), e);
- }
-
- // Define static resources
- cssResources = getClassPathResources("text/css", manifest.getCSSPaths());
- javaScriptResources = getClassPathResources("text/javascript", manifest.getJavaScriptPaths());
- htmlResources = getClassPathResources("text/html", manifest.getHTMLPaths());
- translationResources = getClassPathResources("application/json", manifest.getTranslationPaths());
- staticResources = getClassPathResources(manifest.getResourceTypes());
-
- // Define authentication providers
- authenticationProviderClasses = getAuthenticationProviderClasses(manifest.getAuthProviders());
-
- // Get small icon resource if provided
- if (manifest.getSmallIcon() != null)
- smallIcon = new ClassPathResource(classLoader, "image/png", manifest.getSmallIcon());
- else
- smallIcon = null;
-
- // Get large icon resource if provided
- if (manifest.getLargeIcon() != null)
- largeIcon = new ClassPathResource(classLoader, "image/png", manifest.getLargeIcon());
- else
- largeIcon = null;
- }
-
- /**
- * Returns the version of the Guacamole web application for which this
- * extension was built.
- *
- * @return
- * The version of the Guacamole web application for which this
- * extension was built.
- */
- public String getGuacamoleVersion() {
- return manifest.getGuacamoleVersion();
- }
-
- /**
- * Returns the name of this extension, as declared in the extension's
- * manifest.
- *
- * @return
- * The name of this extension.
- */
- public String getName() {
- return manifest.getName();
- }
-
- /**
- * Returns the namespace of this extension, as declared in the extension's
- * manifest.
- *
- * @return
- * The namespace of this extension.
- */
- public String getNamespace() {
- return manifest.getNamespace();
- }
-
- /**
- * Returns a map of all declared JavaScript resources associated with this
- * extension, where the key of each entry in the map is the path to that
- * resource within the extension .jar. JavaScript resources are declared
- * within the extension manifest.
- *
- * @return
- * All declared JavaScript resources associated with this extension.
- */
- public Map<String, Resource> getJavaScriptResources() {
- return javaScriptResources;
- }
-
- /**
- * Returns a map of all declared CSS resources associated with this
- * extension, where the key of each entry in the map is the path to that
- * resource within the extension .jar. CSS resources are declared within
- * the extension manifest.
- *
- * @return
- * All declared CSS resources associated with this extension.
- */
- public Map<String, Resource> getCSSResources() {
- return cssResources;
- }
-
- /**
- * Returns a map of all declared HTML patch resources associated with this
- * extension, where the key of each entry in the map is the path to that
- * resource within the extension .jar. HTML patch resources are declared
- * within the extension manifest.
- *
- * @return
- * All declared HTML patch resources associated with this extension.
- */
- public Map<String, Resource> getHTMLResources() {
- return htmlResources;
- }
-
- /**
- * Returns a map of all declared translation resources associated with this
- * extension, where the key of each entry in the map is the path to that
- * resource within the extension .jar. Translation resources are declared
- * within the extension manifest.
- *
- * @return
- * All declared translation resources associated with this extension.
- */
- public Map<String, Resource> getTranslationResources() {
- return translationResources;
- }
-
- /**
- * Returns a map of all declared resources associated with this extension,
- * where these resources are not already associated as JavaScript, CSS, or
- * translation resources. The key of each entry in the map is the path to
- * that resource within the extension .jar. Static resources are declared
- * within the extension manifest.
- *
- * @return
- * All declared static resources associated with this extension.
- */
- public Map<String, Resource> getStaticResources() {
- return staticResources;
- }
-
- /**
- * Returns all declared authentication providers classes associated with
- * this extension. Authentication providers are declared within the
- * extension manifest.
- *
- * @return
- * All declared authentication provider classes with this extension.
- */
- public Collection<Class<AuthenticationProvider>> getAuthenticationProviderClasses() {
- return authenticationProviderClasses;
- }
-
- /**
- * Returns the resource for the small favicon for the extension. If
- * provided, this will replace the default Guacamole icon.
- *
- * @return
- * The resource for the small favicon.
- */
- public Resource getSmallIcon() {
- return smallIcon;
- }
-
- /**
- * Returns the resource for the large favicon for the extension. If
- * provided, this will replace the default Guacamole icon.
- *
- * @return
- * The resource for the large favicon.
- */
- public Resource getLargeIcon() {
- return largeIcon;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/648a6c96/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/ExtensionManifest.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/ExtensionManifest.java b/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/ExtensionManifest.java
deleted file mode 100644
index 44efdae..0000000
--- a/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/ExtensionManifest.java
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
- * Copyright (C) 2015 Glyptodon LLC
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package org.apache.guacamole.net.basic.extension;
-
-import java.util.Collection;
-import java.util.Map;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * Java representation of the JSON manifest contained within every Guacamole
- * extension, identifying an extension and describing its contents.
- *
- * @author Michael Jumper
- */
-public class ExtensionManifest {
-
- /**
- * The version of Guacamole for which this extension was built.
- * Compatibility rules built into the web application will guard against
- * incompatible extensions being loaded.
- */
- private String guacamoleVersion;
-
- /**
- * The name of the extension associated with this manifest. The extension
- * name is human-readable, and used for display purposes only.
- */
- private String name;
-
- /**
- * The namespace of the extension associated with this manifest. The
- * extension namespace is required for internal use, and is used wherever
- * extension-specific files or resources need to be isolated from those of
- * other extensions.
- */
- private String namespace;
-
- /**
- * The paths of all JavaScript resources within the .jar of the extension
- * associated with this manifest.
- */
- private Collection<String> javaScriptPaths;
-
- /**
- * The paths of all CSS resources within the .jar of the extension
- * associated with this manifest.
- */
- private Collection<String> cssPaths;
-
- /**
- * The paths of all HTML patch resources within the .jar of the extension
- * associated with this manifest.
- */
- private Collection<String> htmlPaths;
-
- /**
- * The paths of all translation JSON files within this extension, if any.
- */
- private Collection<String> translationPaths;
-
- /**
- * The mimetypes of all resources within this extension which are not
- * already declared as JavaScript, CSS, or translation resources, if any.
- * The key of each entry is the resource path, while the value is the
- * corresponding mimetype.
- */
- private Map<String, String> resourceTypes;
-
- /**
- * The names of all authentication provider classes within this extension,
- * if any.
- */
- private Collection<String> authProviders;
-
- /**
- * The path to the small favicon. If provided, this will replace the default
- * Guacamole icon.
- */
- private String smallIcon;
-
- /**
- * The path to the large favicon. If provided, this will replace the default
- * Guacamole icon.
- */
- private String largeIcon;
-
- /**
- * Returns the version of the Guacamole web application for which the
- * extension was built, such as "0.9.7".
- *
- * @return
- * The version of the Guacamole web application for which the extension
- * was built.
- */
- public String getGuacamoleVersion() {
- return guacamoleVersion;
- }
-
- /**
- * Sets the version of the Guacamole web application for which the
- * extension was built, such as "0.9.7".
- *
- * @param guacamoleVersion
- * The version of the Guacamole web application for which the extension
- * was built.
- */
- public void setGuacamoleVersion(String guacamoleVersion) {
- this.guacamoleVersion = guacamoleVersion;
- }
-
- /**
- * Returns the name of the extension associated with this manifest. The
- * name is human-readable, for display purposes only, and is defined within
- * the manifest by the "name" property.
- *
- * @return
- * The name of the extension associated with this manifest.
- */
- public String getName() {
- return name;
- }
-
- /**
- * Sets the name of the extension associated with this manifest. The name
- * is human-readable, for display purposes only, and is defined within the
- * manifest by the "name" property.
- *
- * @param name
- * The name of the extension associated with this manifest.
- */
- public void setName(String name) {
- this.name = name;
- }
-
- /**
- * Returns the namespace of the extension associated with this manifest.
- * The namespace is required for internal use, and is used wherever
- * extension-specific files or resources need to be isolated from those of
- * other extensions. It is defined within the manifest by the "namespace"
- * property.
- *
- * @return
- * The namespace of the extension associated with this manifest.
- */
- public String getNamespace() {
- return namespace;
- }
-
- /**
- * Sets the namespace of the extension associated with this manifest. The
- * namespace is required for internal use, and is used wherever extension-
- * specific files or resources need to be isolated from those of other
- * extensions. It is defined within the manifest by the "namespace"
- * property.
- *
- * @param namespace
- * The namespace of the extension associated with this manifest.
- */
- public void setNamespace(String namespace) {
- this.namespace = namespace;
- }
-
- /**
- * Returns the paths to all JavaScript resources within the extension.
- * These paths are defined within the manifest by the "js" property as an
- * array of strings, where each string is a path relative to the root of
- * the extension .jar.
- *
- * @return
- * A collection of paths to all JavaScript resources within the
- * extension.
- */
- @JsonProperty("js")
- public Collection<String> getJavaScriptPaths() {
- return javaScriptPaths;
- }
-
- /**
- * Sets the paths to all JavaScript resources within the extension. These
- * paths are defined within the manifest by the "js" property as an array
- * of strings, where each string is a path relative to the root of the
- * extension .jar.
- *
- * @param javaScriptPaths
- * A collection of paths to all JavaScript resources within the
- * extension.
- */
- @JsonProperty("js")
- public void setJavaScriptPaths(Collection<String> javaScriptPaths) {
- this.javaScriptPaths = javaScriptPaths;
- }
-
- /**
- * Returns the paths to all CSS resources within the extension. These paths
- * are defined within the manifest by the "js" property as an array of
- * strings, where each string is a path relative to the root of the
- * extension .jar.
- *
- * @return
- * A collection of paths to all CSS resources within the extension.
- */
- @JsonProperty("css")
- public Collection<String> getCSSPaths() {
- return cssPaths;
- }
-
- /**
- * Sets the paths to all CSS resources within the extension. These paths
- * are defined within the manifest by the "js" property as an array of
- * strings, where each string is a path relative to the root of the
- * extension .jar.
- *
- * @param cssPaths
- * A collection of paths to all CSS resources within the extension.
- */
- @JsonProperty("css")
- public void setCSSPaths(Collection<String> cssPaths) {
- this.cssPaths = cssPaths;
- }
-
- /**
- * Returns the paths to all HTML patch resources within the extension. These
- * paths are defined within the manifest by the "html" property as an array
- * of strings, where each string is a path relative to the root of the
- * extension .jar.
- *
- * @return
- * A collection of paths to all HTML patch resources within the
- * extension.
- */
- @JsonProperty("html")
- public Collection<String> getHTMLPaths() {
- return htmlPaths;
- }
-
- /**
- * Sets the paths to all HTML patch resources within the extension. These
- * paths are defined within the manifest by the "html" property as an array
- * of strings, where each string is a path relative to the root of the
- * extension .jar.
- *
- * @param htmlPatchPaths
- * A collection of paths to all HTML patch resources within the
- * extension.
- */
- @JsonProperty("html")
- public void setHTMLPaths(Collection<String> htmlPatchPaths) {
- this.htmlPaths = htmlPatchPaths;
- }
-
- /**
- * Returns the paths to all translation resources within the extension.
- * These paths are defined within the manifest by the "translations"
- * property as an array of strings, where each string is a path relative to
- * the root of the extension .jar.
- *
- * @return
- * A collection of paths to all translation resources within the
- * extension.
- */
- @JsonProperty("translations")
- public Collection<String> getTranslationPaths() {
- return translationPaths;
- }
-
- /**
- * Sets the paths to all translation resources within the extension. These
- * paths are defined within the manifest by the "translations" property as
- * an array of strings, where each string is a path relative to the root of
- * the extension .jar.
- *
- * @param translationPaths
- * A collection of paths to all translation resources within the
- * extension.
- */
- @JsonProperty("translations")
- public void setTranslationPaths(Collection<String> translationPaths) {
- this.translationPaths = translationPaths;
- }
-
- /**
- * Returns a map of all resources to their corresponding mimetypes, for all
- * resources not already declared as JavaScript, CSS, or translation
- * resources. These paths and corresponding types are defined within the
- * manifest by the "resources" property as an object, where each property
- * name is a path relative to the root of the extension .jar, and each
- * value is a mimetype.
- *
- * @return
- * A map of all resources within the extension to their corresponding
- * mimetypes.
- */
- @JsonProperty("resources")
- public Map<String, String> getResourceTypes() {
- return resourceTypes;
- }
-
- /**
- * Sets the map of all resources to their corresponding mimetypes, for all
- * resources not already declared as JavaScript, CSS, or translation
- * resources. These paths and corresponding types are defined within the
- * manifest by the "resources" property as an object, where each property
- * name is a path relative to the root of the extension .jar, and each
- * value is a mimetype.
- *
- * @param resourceTypes
- * A map of all resources within the extension to their corresponding
- * mimetypes.
- */
- @JsonProperty("resources")
- public void setResourceTypes(Map<String, String> resourceTypes) {
- this.resourceTypes = resourceTypes;
- }
-
- /**
- * Returns the classnames of all authentication provider classes within the
- * extension. These classnames are defined within the manifest by the
- * "authProviders" property as an array of strings, where each string is an
- * authentication provider classname.
- *
- * @return
- * A collection of classnames of all authentication providers within
- * the extension.
- */
- public Collection<String> getAuthProviders() {
- return authProviders;
- }
-
- /**
- * Sets the classnames of all authentication provider classes within the
- * extension. These classnames are defined within the manifest by the
- * "authProviders" property as an array of strings, where each string is an
- * authentication provider classname.
- *
- * @param authProviders
- * A collection of classnames of all authentication providers within
- * the extension.
- */
- public void setAuthProviders(Collection<String> authProviders) {
- this.authProviders = authProviders;
- }
-
- /**
- * Returns the path to the small favicon, relative to the root of the
- * extension.
- *
- * @return
- * The path to the small favicon.
- */
- public String getSmallIcon() {
- return smallIcon;
- }
-
- /**
- * Sets the path to the small favicon. This will replace the default
- * Guacamole icon.
- *
- * @param smallIcon
- * The path to the small favicon.
- */
- public void setSmallIcon(String smallIcon) {
- this.smallIcon = smallIcon;
- }
-
- /**
- * Returns the path to the large favicon, relative to the root of the
- * extension.
- *
- * @return
- * The path to the large favicon.
- */
- public String getLargeIcon() {
- return largeIcon;
- }
-
- /**
- * Sets the path to the large favicon. This will replace the default
- * Guacamole icon.
- *
- * @param largeIcon
- * The path to the large favicon.
- */
- public void setLargeIcon(String largeIcon) {
- this.largeIcon = largeIcon;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/648a6c96/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/ExtensionModule.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/ExtensionModule.java b/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/ExtensionModule.java
deleted file mode 100644
index 7fcf6d4..0000000
--- a/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/ExtensionModule.java
+++ /dev/null
@@ -1,450 +0,0 @@
-/*
- * Copyright (C) 2015 Glyptodon LLC
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package org.apache.guacamole.net.basic.extension;
-
-import com.google.inject.Provides;
-import com.google.inject.servlet.ServletModule;
-import java.io.File;
-import java.io.FileFilter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import org.apache.guacamole.net.basic.BasicFileAuthenticationProvider;
-import org.apache.guacamole.GuacamoleException;
-import org.apache.guacamole.GuacamoleServerException;
-import org.apache.guacamole.environment.Environment;
-import org.apache.guacamole.net.auth.AuthenticationProvider;
-import org.apache.guacamole.net.basic.properties.BasicGuacamoleProperties;
-import org.apache.guacamole.net.basic.resource.Resource;
-import org.apache.guacamole.net.basic.resource.ResourceServlet;
-import org.apache.guacamole.net.basic.resource.SequenceResource;
-import org.apache.guacamole.net.basic.resource.WebApplicationResource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * A Guice Module which loads all extensions within the
- * GUACAMOLE_HOME/extensions directory, if any.
- *
- * @author Michael Jumper
- */
-public class ExtensionModule extends ServletModule {
-
- /**
- * Logger for this class.
- */
- private final Logger logger = LoggerFactory.getLogger(ExtensionModule.class);
-
- /**
- * The version strings of all Guacamole versions whose extensions are
- * compatible with this release.
- */
- private static final List<String> ALLOWED_GUACAMOLE_VERSIONS =
- Collections.unmodifiableList(Arrays.asList(
- "*",
- "0.9.9"
- ));
-
- /**
- * The name of the directory within GUACAMOLE_HOME containing any .jars
- * which should be included in the classpath of all extensions.
- */
- private static final String LIB_DIRECTORY = "lib";
-
- /**
- * The name of the directory within GUACAMOLE_HOME containing all
- * extensions.
- */
- private static final String EXTENSIONS_DIRECTORY = "extensions";
-
- /**
- * The string that the filenames of all extensions must end with to be
- * recognized as extensions.
- */
- private static final String EXTENSION_SUFFIX = ".jar";
-
- /**
- * The Guacamole server environment.
- */
- private final Environment environment;
-
- /**
- * All currently-bound authentication providers, if any.
- */
- private final List<AuthenticationProvider> boundAuthenticationProviders =
- new ArrayList<AuthenticationProvider>();
-
- /**
- * Service for adding and retrieving language resources.
- */
- private final LanguageResourceService languageResourceService;
-
- /**
- * Service for adding and retrieving HTML patch resources.
- */
- private final PatchResourceService patchResourceService;
-
- /**
- * Returns the classloader that should be used as the parent classloader
- * for all extensions. If the GUACAMOLE_HOME/lib directory exists, this
- * will be a classloader that loads classes from within the .jar files in
- * that directory. Lacking the GUACAMOLE_HOME/lib directory, this will
- * simply be the classloader associated with the ExtensionModule class.
- *
- * @return
- * The classloader that should be used as the parent classloader for
- * all extensions.
- *
- * @throws GuacamoleException
- * If an error occurs while retrieving the classloader.
- */
- private ClassLoader getParentClassLoader() throws GuacamoleException {
-
- // Retrieve lib directory
- File libDir = new File(environment.getGuacamoleHome(), LIB_DIRECTORY);
-
- // If lib directory does not exist, use default class loader
- if (!libDir.isDirectory())
- return ExtensionModule.class.getClassLoader();
-
- // Return classloader which loads classes from all .jars within the lib directory
- return DirectoryClassLoader.getInstance(libDir);
-
- }
-
- /**
- * Creates a module which loads all extensions within the
- * GUACAMOLE_HOME/extensions directory.
- *
- * @param environment
- * The environment to use when configuring authentication.
- */
- public ExtensionModule(Environment environment) {
- this.environment = environment;
- this.languageResourceService = new LanguageResourceService(environment);
- this.patchResourceService = new PatchResourceService();
- }
-
- /**
- * Reads the value of the now-deprecated "auth-provider" property from
- * guacamole.properties, returning the corresponding AuthenticationProvider
- * class. If no authentication provider could be read, or the property is
- * not present, null is returned.
- *
- * As this property is deprecated, this function will also log warning
- * messages if the property is actually specified.
- *
- * @return
- * The value of the deprecated "auth-provider" property, or null if the
- * property is not present.
- */
- @SuppressWarnings("deprecation") // We must continue to use this property until it is truly no longer supported
- private Class<AuthenticationProvider> getAuthProviderProperty() {
-
- // Get and bind auth provider instance, if defined via property
- try {
-
- // Use "auth-provider" property if present, but warn about deprecation
- Class<AuthenticationProvider> authenticationProvider = environment.getProperty(BasicGuacamoleProperties.AUTH_PROVIDER);
- if (authenticationProvider != null)
- logger.warn("The \"auth-provider\" and \"lib-directory\" properties are now deprecated. Please use the \"extensions\" and \"lib\" directories within GUACAMOLE_HOME instead.");
-
- return authenticationProvider;
-
- }
- catch (GuacamoleException e) {
- logger.warn("Value of deprecated \"auth-provider\" property within guacamole.properties is not valid: {}", e.getMessage());
- logger.debug("Error reading authentication provider from guacamole.properties.", e);
- }
-
- return null;
-
- }
-
- /**
- * Binds the given AuthenticationProvider class such that any service
- * requiring access to the AuthenticationProvider can obtain it via
- * injection, along with any other bound AuthenticationProviders.
- *
- * @param authenticationProvider
- * The AuthenticationProvider class to bind.
- */
- private void bindAuthenticationProvider(Class<? extends AuthenticationProvider> authenticationProvider) {
-
- // Bind authentication provider
- logger.debug("[{}] Binding AuthenticationProvider \"{}\".",
- boundAuthenticationProviders.size(), authenticationProvider.getName());
- boundAuthenticationProviders.add(new AuthenticationProviderFacade(authenticationProvider));
-
- }
-
- /**
- * Binds each of the the given AuthenticationProvider classes such that any
- * service requiring access to the AuthenticationProvider can obtain it via
- * injection.
- *
- * @param authProviders
- * The AuthenticationProvider classes to bind.
- */
- private void bindAuthenticationProviders(Collection<Class<AuthenticationProvider>> authProviders) {
-
- // Bind each authentication provider within extension
- for (Class<AuthenticationProvider> authenticationProvider : authProviders)
- bindAuthenticationProvider(authenticationProvider);
-
- }
-
- /**
- * Returns a list of all currently-bound AuthenticationProvider instances.
- *
- * @return
- * A List of all currently-bound AuthenticationProvider. The List is
- * not modifiable.
- */
- @Provides
- public List<AuthenticationProvider> getAuthenticationProviders() {
- return Collections.unmodifiableList(boundAuthenticationProviders);
- }
-
- /**
- * 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);
-
- }
-
- }
-
- /**
- * Serves each of the given resources under the given prefix. The path of
- * each resource relative to the prefix is the key of its entry within the
- * map.
- *
- * @param prefix
- * The prefix under which each resource should be served.
- *
- * @param resources
- * A map of all resources to serve, where the key of each entry in the
- * map is the desired path of that resource relative to the prefix.
- */
- private void serveStaticResources(String prefix, Map<String, Resource> resources) {
-
- // Add all resources under given prefix
- for (Map.Entry<String, Resource> staticResource : resources.entrySet()) {
-
- // Get path and resource from path/resource pair
- String path = staticResource.getKey();
- Resource resource = staticResource.getValue();
-
- // Serve within namespace-derived path
- serve(prefix + path).with(new ResourceServlet(resource));
-
- }
-
- }
-
- /**
- * Returns whether the given version of Guacamole is compatible with this
- * version of Guacamole as far as extensions are concerned.
- *
- * @param guacamoleVersion
- * The version of Guacamole the extension was built for.
- *
- * @return
- * true if the given version of Guacamole is compatible with this
- * version of Guacamole, false otherwise.
- */
- private boolean isCompatible(String guacamoleVersion) {
- return ALLOWED_GUACAMOLE_VERSIONS.contains(guacamoleVersion);
- }
-
- /**
- * Loads all extensions within the GUACAMOLE_HOME/extensions directory, if
- * any, adding their static resource to the given resoure collections.
- *
- * @param javaScriptResources
- * A modifiable collection of static JavaScript resources which may
- * receive new JavaScript resources from extensions.
- *
- * @param cssResources
- * A modifiable collection of static CSS resources which may receive
- * new CSS resources from extensions.
- */
- private void loadExtensions(Collection<Resource> javaScriptResources,
- Collection<Resource> cssResources) {
-
- // Retrieve and validate extensions directory
- File extensionsDir = new File(environment.getGuacamoleHome(), EXTENSIONS_DIRECTORY);
- if (!extensionsDir.isDirectory())
- return;
-
- // Retrieve list of all extension files within extensions directory
- File[] extensionFiles = extensionsDir.listFiles(new FileFilter() {
-
- @Override
- public boolean accept(File file) {
- return file.isFile() && file.getName().endsWith(EXTENSION_SUFFIX);
- }
-
- });
-
- // Verify contents are accessible
- if (extensionFiles == null) {
- logger.warn("Although GUACAMOLE_HOME/" + EXTENSIONS_DIRECTORY + " exists, its contents cannot be read.");
- return;
- }
-
- // Sort files lexicographically
- Arrays.sort(extensionFiles);
-
- // Load each extension within the extension directory
- for (File extensionFile : extensionFiles) {
-
- logger.debug("Loading extension: \"{}\"", extensionFile.getName());
-
- try {
-
- // Load extension from file
- Extension extension = new Extension(getParentClassLoader(), extensionFile);
-
- // Validate Guacamole version of extension
- if (!isCompatible(extension.getGuacamoleVersion())) {
- logger.debug("Declared Guacamole version \"{}\" of extension \"{}\" is not compatible with this version of Guacamole.",
- extension.getGuacamoleVersion(), extensionFile.getName());
- throw new GuacamoleServerException("Extension \"" + extension.getName() + "\" is not "
- + "compatible with this version of Guacamole.");
- }
-
- // Add any JavaScript / CSS resources
- javaScriptResources.addAll(extension.getJavaScriptResources().values());
- cssResources.addAll(extension.getCSSResources().values());
-
- // Attempt to load all authentication providers
- bindAuthenticationProviders(extension.getAuthenticationProviderClasses());
-
- // Add any translation resources
- serveLanguageResources(extension.getTranslationResources());
-
- // Add all HTML patch resources
- patchResourceService.addPatchResources(extension.getHTMLResources().values());
-
- // Add all static resources under namespace-derived prefix
- String staticResourcePrefix = "/app/ext/" + extension.getNamespace() + "/";
- serveStaticResources(staticResourcePrefix, extension.getStaticResources());
-
- // Serve up the small favicon if provided
- if(extension.getSmallIcon() != null)
- serve("/images/logo-64.png").with(new ResourceServlet(extension.getSmallIcon()));
-
- // Serve up the large favicon if provided
- if(extension.getLargeIcon()!= null)
- serve("/images/logo-144.png").with(new ResourceServlet(extension.getLargeIcon()));
-
- // Log successful loading of extension by name
- logger.info("Extension \"{}\" loaded.", extension.getName());
-
- }
- catch (GuacamoleException e) {
- logger.error("Extension \"{}\" could not be loaded: {}", extensionFile.getName(), e.getMessage());
- logger.debug("Unable to load extension.", e);
- }
-
- }
-
- }
-
- @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));
-
- }
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/648a6c96/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/LanguageResourceService.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/LanguageResourceService.java b/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/LanguageResourceService.java
deleted file mode 100644
index 6423b5d..0000000
--- a/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/LanguageResourceService.java
+++ /dev/null
@@ -1,442 +0,0 @@
-/*
- * Copyright (C) 2015 Glyptodon LLC
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package org.apache.guacamole.net.basic.extension;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import javax.servlet.ServletContext;
-import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.node.JsonNodeFactory;
-import org.codehaus.jackson.node.ObjectNode;
-import org.apache.guacamole.GuacamoleException;
-import org.apache.guacamole.environment.Environment;
-import org.apache.guacamole.net.basic.properties.BasicGuacamoleProperties;
-import org.apache.guacamole.net.basic.resource.ByteArrayResource;
-import org.apache.guacamole.net.basic.resource.Resource;
-import org.apache.guacamole.net.basic.resource.WebApplicationResource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Service which provides access to all built-in languages as resources, and
- * allows other resources to be added or overlaid against existing resources.
- *
- * @author Michael Jumper
- */
-public class LanguageResourceService {
-
- /**
- * Logger for this class.
- */
- private final Logger logger = LoggerFactory.getLogger(LanguageResourceService.class);
-
- /**
- * The path to the translation folder within the webapp.
- */
- private static final String TRANSLATION_PATH = "/translations";
-
- /**
- * The JSON property for the human readable display name.
- */
- private static final String LANGUAGE_DISPLAY_NAME_KEY = "NAME";
-
- /**
- * The Jackson parser for parsing the language JSON files.
- */
- private static final ObjectMapper mapper = new ObjectMapper();
-
- /**
- * The regular expression to use for parsing the language key from the
- * filename.
- */
- private static final Pattern LANGUAGE_KEY_PATTERN = Pattern.compile(".*/([a-z]+(_[A-Z]+)?)\\.json");
-
- /**
- * The set of all language keys which are explicitly listed as allowed
- * within guacamole.properties, or null if all defined languages should be
- * allowed.
- */
- private final Set<String> allowedLanguages;
-
- /**
- * Map of all language resources by language key. Language keys are
- * language and country code pairs, separated by an underscore, like
- * "en_US". The country code and underscore SHOULD be omitted in the case
- * that only one dialect of that language is defined, or in the case of the
- * most universal or well-supported of all supported dialects of that
- * language.
- */
- private final Map<String, Resource> resources = new HashMap<String, Resource>();
-
- /**
- * Creates a new service for tracking and parsing available translations
- * which reads its configuration from the given environment.
- *
- * @param environment
- * The environment from which the configuration properties of this
- * service should be read.
- */
- public LanguageResourceService(Environment environment) {
-
- Set<String> parsedAllowedLanguages;
-
- // Parse list of available languages from properties
- try {
- parsedAllowedLanguages = environment.getProperty(BasicGuacamoleProperties.ALLOWED_LANGUAGES);
- logger.debug("Available languages will be restricted to: {}", parsedAllowedLanguages);
- }
-
- // Warn of failure to parse
- catch (GuacamoleException e) {
- parsedAllowedLanguages = null;
- logger.error("Unable to parse list of allowed languages: {}", e.getMessage());
- logger.debug("Error parsing list of allowed languages.", e);
- }
-
- this.allowedLanguages = parsedAllowedLanguages;
-
- }
-
- /**
- * Derives a language key from the filename within the given path, if
- * possible. If the filename is not a valid language key, null is returned.
- *
- * @param path
- * The path containing the filename to derive the language key from.
- *
- * @return
- * The derived language key, or null if the filename is not a valid
- * language key.
- */
- public String getLanguageKey(String path) {
-
- // Parse language key from filename
- Matcher languageKeyMatcher = LANGUAGE_KEY_PATTERN.matcher(path);
- if (!languageKeyMatcher.matches())
- return null;
-
- // Return parsed key
- return languageKeyMatcher.group(1);
-
- }
-
- /**
- * Merges the given JSON objects. Any leaf node in overlay will overwrite
- * the corresponding path in original.
- *
- * @param original
- * The original JSON object to which changes should be applied.
- *
- * @param overlay
- * The JSON object containing changes that should be applied.
- *
- * @return
- * The newly constructed JSON object that is the result of merging
- * original and overlay.
- */
- private JsonNode mergeTranslations(JsonNode original, JsonNode overlay) {
-
- // If we are at a leaf node, the result of merging is simply the overlay
- if (!overlay.isObject() || original == null)
- return overlay;
-
- // Create mutable copy of original
- ObjectNode newNode = JsonNodeFactory.instance.objectNode();
- Iterator<String> fieldNames = original.getFieldNames();
- while (fieldNames.hasNext()) {
- String fieldName = fieldNames.next();
- newNode.put(fieldName, original.get(fieldName));
- }
-
- // Merge each field
- fieldNames = overlay.getFieldNames();
- while (fieldNames.hasNext()) {
- String fieldName = fieldNames.next();
- newNode.put(fieldName, mergeTranslations(original.get(fieldName), overlay.get(fieldName)));
- }
-
- return newNode;
-
- }
-
- /**
- * Parses the given language resource, returning the resulting JsonNode.
- * If the resource cannot be read because it does not exist, null is
- * returned.
- *
- * @param resource
- * The language resource to parse. Language resources must have the
- * mimetype "application/json".
- *
- * @return
- * A JsonNode representing the root of the parsed JSON tree, or null if
- * the given resource does not exist.
- *
- * @throws IOException
- * If an error occurs while parsing the resource as JSON.
- */
- private JsonNode parseLanguageResource(Resource resource) throws IOException {
-
- // Get resource stream
- InputStream stream = resource.asStream();
- if (stream == null)
- return null;
-
- // Parse JSON tree
- try {
- JsonNode tree = mapper.readTree(stream);
- return tree;
- }
-
- // Ensure stream is always closed
- finally {
- stream.close();
- }
-
- }
-
- /**
- * Returns whether a language having the given key should be allowed to be
- * loaded. If language availability restrictions are imposed through
- * guacamole.properties, this may return false in some cases. By default,
- * this function will always return true. Note that just because a language
- * key is allowed to be loaded does not imply that the language key is
- * valid.
- *
- * @param languageKey
- * The language key of the language to test.
- *
- * @return
- * true if the given language key should be allowed to be loaded, false
- * otherwise.
- */
- private boolean isLanguageAllowed(String languageKey) {
-
- // If no list is provided, all languages are implicitly available
- if (allowedLanguages == null)
- return true;
-
- return allowedLanguages.contains(languageKey);
-
- }
-
- /**
- * Adds or overlays the given language resource, which need not exist in
- * the ServletContext. If a language resource is already defined for the
- * given language key, the strings from the given resource will be overlaid
- * on top of the existing strings, augmenting or overriding the available
- * strings for that language.
- *
- * @param key
- * The language key of the resource being added. Language keys are
- * pairs consisting of a language code followed by an underscore and
- * country code, such as "en_US".
- *
- * @param resource
- * The language resource to add. This resource must have the mimetype
- * "application/json".
- */
- public void addLanguageResource(String key, Resource resource) {
-
- // Skip loading of language if not allowed
- if (!isLanguageAllowed(key)) {
- logger.debug("OMITTING language: \"{}\"", key);
- return;
- }
-
- // Merge language resources if already defined
- Resource existing = resources.get(key);
- if (existing != null) {
-
- try {
-
- // Read the original language resource
- JsonNode existingTree = parseLanguageResource(existing);
- if (existingTree == null) {
- logger.warn("Base language resource \"{}\" does not exist.", key);
- return;
- }
-
- // Read new language resource
- JsonNode resourceTree = parseLanguageResource(resource);
- if (resourceTree == null) {
- logger.warn("Overlay language resource \"{}\" does not exist.", key);
- return;
- }
-
- // Merge the language resources
- JsonNode mergedTree = mergeTranslations(existingTree, resourceTree);
- resources.put(key, new ByteArrayResource("application/json", mapper.writeValueAsBytes(mergedTree)));
-
- logger.debug("Merged strings with existing language: \"{}\"", key);
-
- }
- catch (IOException e) {
- logger.error("Unable to merge language resource \"{}\": {}", key, e.getMessage());
- logger.debug("Error merging language resource.", e);
- }
-
- }
-
- // Otherwise, add new language resource
- else {
- resources.put(key, resource);
- logger.debug("Added language: \"{}\"", key);
- }
-
- }
-
- /**
- * Adds or overlays all languages defined within the /translations
- * directory of the given ServletContext. If no such language files exist,
- * nothing is done. If a language is already defined, the strings from the
- * will be overlaid on top of the existing strings, augmenting or
- * overriding the available strings for that language. The language key
- * for each language file is derived from the filename.
- *
- * @param context
- * The ServletContext from which language files should be loaded.
- */
- public void addLanguageResources(ServletContext context) {
-
- // Get the paths of all the translation files
- Set<?> resourcePaths = context.getResourcePaths(TRANSLATION_PATH);
-
- // If no translation files found, nothing to add
- if (resourcePaths == null)
- return;
-
- // Iterate through all the found language files and add them to the map
- for (Object resourcePathObject : resourcePaths) {
-
- // Each resource path is guaranteed to be a string
- String resourcePath = (String) resourcePathObject;
-
- // Parse language key from path
- String languageKey = getLanguageKey(resourcePath);
- if (languageKey == null) {
- logger.warn("Invalid language file name: \"{}\"", resourcePath);
- continue;
- }
-
- // Add/overlay new resource
- addLanguageResource(
- languageKey,
- new WebApplicationResource(context, "application/json", resourcePath)
- );
-
- }
-
- }
-
- /**
- * Returns a set of all unique language keys currently associated with
- * language resources stored in this service. The returned set cannot be
- * modified.
- *
- * @return
- * A set of all unique language keys currently associated with this
- * service.
- */
- public Set<String> getLanguageKeys() {
- return Collections.unmodifiableSet(resources.keySet());
- }
-
- /**
- * Returns a map of all languages currently associated with this service,
- * where the key of each map entry is the language key. The returned map
- * cannot be modified.
- *
- * @return
- * A map of all languages currently associated with this service.
- */
- public Map<String, Resource> getLanguageResources() {
- return Collections.unmodifiableMap(resources);
- }
-
- /**
- * Returns a mapping of all language keys to their corresponding human-
- * readable language names. If an error occurs while parsing a language
- * resource, its key/name pair will simply be omitted. The returned map
- * cannot be modified.
- *
- * @return
- * A map of all language keys and their corresponding human-readable
- * names.
- */
- public Map<String, String> getLanguageNames() {
-
- Map<String, String> languageNames = new HashMap<String, String>();
-
- // For each language key/resource pair
- for (Map.Entry<String, Resource> entry : resources.entrySet()) {
-
- // Get language key and resource
- String languageKey = entry.getKey();
- Resource resource = entry.getValue();
-
- // Get stream for resource
- InputStream resourceStream = resource.asStream();
- if (resourceStream == null) {
- logger.warn("Expected language resource does not exist: \"{}\".", languageKey);
- continue;
- }
-
- // Get name node of language
- try {
- JsonNode tree = mapper.readTree(resourceStream);
- JsonNode nameNode = tree.get(LANGUAGE_DISPLAY_NAME_KEY);
-
- // Attempt to read language name from node
- String languageName;
- if (nameNode == null || (languageName = nameNode.getTextValue()) == null) {
- logger.warn("Root-level \"" + LANGUAGE_DISPLAY_NAME_KEY + "\" string missing or invalid in language \"{}\"", languageKey);
- languageName = languageKey;
- }
-
- // Add language key/name pair to map
- languageNames.put(languageKey, languageName);
-
- }
-
- // Continue with next language if unable to read
- catch (IOException e) {
- logger.warn("Unable to read language resource \"{}\".", languageKey);
- logger.debug("Error reading language resource.", e);
- }
-
- }
-
- return Collections.unmodifiableMap(languageNames);
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/648a6c96/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/PatchResourceService.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/PatchResourceService.java b/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/PatchResourceService.java
deleted file mode 100644
index 76ef104..0000000
--- a/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/PatchResourceService.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2016 Glyptodon LLC
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package org.apache.guacamole.net.basic.extension;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import org.apache.guacamole.net.basic.resource.Resource;
-
-/**
- * Service which provides access to all HTML patches as resources, and allows
- * other patch resources to be added.
- *
- * @author Michael Jumper
- */
-public class PatchResourceService {
-
- /**
- * A list of all HTML patch resources currently defined, in the order they
- * should be applied.
- */
- private final List<Resource> resources = new ArrayList<Resource>();
-
- /**
- * Adds the given HTML patch resource such that it will apply to the
- * Guacamole UI. The patch will be applied by the JavaScript side of the
- * web application in the order that addPatchResource() is invoked.
- *
- * @param resource
- * The HTML patch resource to add. This resource must have the mimetype
- * "text/html".
- */
- public void addPatchResource(Resource resource) {
- resources.add(resource);
- }
-
- /**
- * Adds the given HTML patch resources such that they will apply to the
- * Guacamole UI. The patches will be applied by the JavaScript side of the
- * web application in the order provided.
- *
- * @param resources
- * The HTML patch resources to add. Each resource must have the
- * mimetype "text/html".
- */
- public void addPatchResources(Collection<Resource> resources) {
- for (Resource resource : resources)
- addPatchResource(resource);
- }
-
- /**
- * Returns a list of all HTML patches currently associated with this
- * service, in the order they should be applied. The returned list cannot
- * be modified.
- *
- * @return
- * A list of all HTML patches currently associated with this service.
- */
- public List<Resource> getPatchResources() {
- return Collections.unmodifiableList(resources);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/648a6c96/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/package-info.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/package-info.java b/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/package-info.java
deleted file mode 100644
index 9675904..0000000
--- a/guacamole/src/main/java/org/apache/guacamole/net/basic/extension/package-info.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2015 Glyptodon LLC
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * Classes which represent and facilitate the loading of extensions to the
- * Guacamole web application.
- */
-package org.apache.guacamole.net.basic.extension;
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/648a6c96/guacamole/src/main/java/org/apache/guacamole/net/basic/log/LogModule.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/net/basic/log/LogModule.java b/guacamole/src/main/java/org/apache/guacamole/net/basic/log/LogModule.java
deleted file mode 100644
index 739460d..0000000
--- a/guacamole/src/main/java/org/apache/guacamole/net/basic/log/LogModule.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2015 Glyptodon LLC
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package org.apache.guacamole.net.basic.log;
-
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.joran.JoranConfigurator;
-import ch.qos.logback.core.joran.spi.JoranException;
-import ch.qos.logback.core.util.StatusPrinter;
-import com.google.inject.AbstractModule;
-import java.io.File;
-import org.apache.guacamole.environment.Environment;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Initializes the logging subsystem.
- *
- * @author Michael Jumper
- */
-public class LogModule extends AbstractModule {
-
- /**
- * Logger for this class.
- */
- private final Logger logger = LoggerFactory.getLogger(LogModule.class);
-
- /**
- * The Guacamole server environment.
- */
- private final Environment environment;
-
- /**
- * Creates a new LogModule which uses the given environment to determine
- * the logging configuration.
- *
- * @param environment
- * The environment to use when configuring logging.
- */
- public LogModule(Environment environment) {
- this.environment = environment;
- }
-
- @Override
- protected void configure() {
-
- // Only load logback configuration if GUACAMOLE_HOME exists
- File guacamoleHome = environment.getGuacamoleHome();
- if (!guacamoleHome.isDirectory())
- return;
-
- // Check for custom logback.xml
- File logbackConfiguration = new File(guacamoleHome, "logback.xml");
- if (!logbackConfiguration.exists())
- return;
-
- logger.info("Loading logback configuration from \"{}\".", logbackConfiguration);
-
- LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
- context.reset();
-
- try {
-
- // Initialize logback
- JoranConfigurator configurator = new JoranConfigurator();
- configurator.setContext(context);
- configurator.doConfigure(logbackConfiguration);
-
- // Dump any errors that occur during logback init
- StatusPrinter.printInCaseOfErrorsOrWarnings(context);
-
- }
- catch (JoranException e) {
- logger.error("Initialization of logback failed: {}", e.getMessage());
- logger.debug("Unable to load logback configuration..", e);
- }
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/648a6c96/guacamole/src/main/java/org/apache/guacamole/net/basic/package-info.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/net/basic/package-info.java b/guacamole/src/main/java/org/apache/guacamole/net/basic/package-info.java
deleted file mode 100644
index 183b530..0000000
--- a/guacamole/src/main/java/org/apache/guacamole/net/basic/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2013 Glyptodon LLC
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * Classes specific to the general-purpose web application implemented by
- * the Guacamole project using the Guacamole APIs.
- */
-package org.apache.guacamole.net.basic;
-
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/648a6c96/guacamole/src/main/java/org/apache/guacamole/net/basic/properties/AuthenticationProviderProperty.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/net/basic/properties/AuthenticationProviderProperty.java b/guacamole/src/main/java/org/apache/guacamole/net/basic/properties/AuthenticationProviderProperty.java
deleted file mode 100644
index 1c15131..0000000
--- a/guacamole/src/main/java/org/apache/guacamole/net/basic/properties/AuthenticationProviderProperty.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2015 Glyptodon LLC
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package org.apache.guacamole.net.basic.properties;
-
-import org.apache.guacamole.GuacamoleException;
-import org.apache.guacamole.net.auth.AuthenticationProvider;
-import org.apache.guacamole.properties.GuacamoleProperty;
-
-/**
- * A GuacamoleProperty whose value is the name of a class to use to
- * authenticate users. This class must implement AuthenticationProvider. Use
- * of this property type is deprecated in favor of the
- * GUACAMOLE_HOME/extensions directory.
- *
- * @author Michael Jumper
- */
-@Deprecated
-public abstract class AuthenticationProviderProperty implements GuacamoleProperty<Class<AuthenticationProvider>> {
-
- @Override
- @SuppressWarnings("unchecked") // Explicitly checked within by isAssignableFrom()
- public Class<AuthenticationProvider> parseValue(String authProviderClassName) throws GuacamoleException {
-
- // If no property provided, return null.
- if (authProviderClassName == null)
- return null;
-
- // Get auth provider instance
- try {
-
- // Get authentication provider class
- Class<?> authProviderClass = org.apache.guacamole.net.basic.GuacamoleClassLoader.getInstance().loadClass(authProviderClassName);
-
- // Verify the located class is actually a subclass of AuthenticationProvider
- if (!AuthenticationProvider.class.isAssignableFrom(authProviderClass))
- throw new GuacamoleException("Specified authentication provider class is not a AuthenticationProvider.");
-
- // Return located class
- return (Class<AuthenticationProvider>) authProviderClass;
-
- }
- catch (ClassNotFoundException e) {
- throw new GuacamoleException("Authentication provider class not found", e);
- }
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/648a6c96/guacamole/src/main/java/org/apache/guacamole/net/basic/properties/BasicGuacamoleProperties.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/net/basic/properties/BasicGuacamoleProperties.java b/guacamole/src/main/java/org/apache/guacamole/net/basic/properties/BasicGuacamoleProperties.java
deleted file mode 100644
index b75d1c3..0000000
--- a/guacamole/src/main/java/org/apache/guacamole/net/basic/properties/BasicGuacamoleProperties.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2013 Glyptodon LLC
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package org.apache.guacamole.net.basic.properties;
-
-import org.apache.guacamole.properties.FileGuacamoleProperty;
-import org.apache.guacamole.properties.IntegerGuacamoleProperty;
-import org.apache.guacamole.properties.StringGuacamoleProperty;
-
-/**
- * Properties used by the default Guacamole web application.
- *
- * @author Michael Jumper
- */
-public class BasicGuacamoleProperties {
-
- /**
- * This class should not be instantiated.
- */
- private BasicGuacamoleProperties() {}
-
- /**
- * The authentication provider to user when retrieving the authorized
- * configurations of a user. This property is currently supported, but
- * deprecated in favor of the GUACAMOLE_HOME/extensions directory.
- */
- @Deprecated
- public static final AuthenticationProviderProperty AUTH_PROVIDER = new AuthenticationProviderProperty() {
-
- @Override
- public String getName() { return "auth-provider"; }
-
- };
-
- /**
- * The directory to search for authentication provider classes. This
- * property is currently supported, but deprecated in favor of the
- * GUACAMOLE_HOME/lib directory.
- */
- @Deprecated
- public static final FileGuacamoleProperty LIB_DIRECTORY = new FileGuacamoleProperty() {
-
- @Override
- public String getName() { return "lib-directory"; }
-
- };
-
- /**
- * The session timeout for the API, in minutes.
- */
- public static final IntegerGuacamoleProperty API_SESSION_TIMEOUT = new IntegerGuacamoleProperty() {
-
- @Override
- public String getName() { return "api-session-timeout"; }
-
- };
-
- /**
- * Comma-separated list of all allowed languages, where each language is
- * represented by a language key, such as "en" or "en_US". If specified,
- * only languages within this list will be listed as available by the REST
- * service.
- */
- public static final StringSetProperty ALLOWED_LANGUAGES = new StringSetProperty() {
-
- @Override
- public String getName() { return "allowed-languages"; }
-
- };
-
-}