You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by tb...@apache.org on 2014/02/14 17:03:37 UTC
git commit: AMBARI-4646 - Ambari Views : Allow view deployment as a
Web App
Updated Branches:
refs/heads/trunk d3ddf51c8 -> c337d7df1
AMBARI-4646 - Ambari Views : Allow view deployment as a Web App
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/c337d7df
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/c337d7df
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/c337d7df
Branch: refs/heads/trunk
Commit: c337d7df188bec9f955c7cbd38b0f51410e29fae
Parents: d3ddf51
Author: tbeerbower <tb...@hortonworks.com>
Authored: Wed Feb 12 22:23:06 2014 -0500
Committer: tbeerbower <tb...@hortonworks.com>
Committed: Fri Feb 14 11:03:32 2014 -0500
----------------------------------------------------------------------
.../ambari/server/controller/AmbariServer.java | 14 +-
.../internal/ViewInstanceResourceProvider.java | 14 +-
.../internal/ViewResourceProvider.java | 3 +
.../ambari/server/view/ViewDefinition.java | 35 +++-
.../server/view/ViewInstanceDefinition.java | 39 ++--
.../apache/ambari/server/view/ViewRegistry.java | 177 +++++++++----------
.../view/configuration/ServletConfig.java | 72 --------
.../configuration/ServletMappingConfig.java | 60 -------
.../server/view/configuration/ViewConfig.java | 74 --------
.../ambari/server/view/ViewDefinitionTest.java | 14 +-
.../server/view/ViewInstanceDefinitionTest.java | 23 +--
.../ambari/server/view/ViewRegistryTest.java | 20 +++
.../view/configuration/ServletConfigTest.java | 51 ------
.../configuration/ServletMappingConfigTest.java | 51 ------
.../view/configuration/ViewConfigTest.java | 36 ----
.../org/apache/ambari/view/ViewContext.java | 6 +
16 files changed, 205 insertions(+), 484 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/c337d7df/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
index d480aee..e4ebc1c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
@@ -64,9 +64,11 @@ import org.apache.ambari.server.security.unsecured.rest.CertificateDownload;
import org.apache.ambari.server.security.unsecured.rest.CertificateSign;
import org.apache.ambari.server.state.Clusters;
import org.apache.ambari.server.utils.StageUtils;
+import org.apache.ambari.server.view.ViewInstanceDefinition;
import org.apache.ambari.server.view.ViewRegistry;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.server.ssl.SslSelectChannelConnector;
import org.eclipse.jetty.servlet.DefaultServlet;
@@ -167,9 +169,10 @@ public class AmbariServer {
ClassPathXmlApplicationContext(contextLocations, parentSpringAppContext);
//setting ambari web context
- ServletContextHandler root = new ServletContextHandler(server, CONTEXT_PATH,
+ ServletContextHandler root = new ServletContextHandler(
ServletContextHandler.SECURITY | ServletContextHandler.SESSIONS);
+ root.setContextPath(CONTEXT_PATH);
root.setErrorHandler(injector.getInstance(AmbariErrorHandler.class));
//Changing session cookie name to avoid conflicts
@@ -277,7 +280,14 @@ public class AmbariServer {
root.addServlet(sh, "/api/v1/*");
sh.setInitOrder(2);
- ViewRegistry.readViewArchives(configs, root, springSecurityFilter);
+ HandlerList handlerList = new HandlerList();
+
+ for (ViewInstanceDefinition viewInstanceDefinition : ViewRegistry.readViewArchives(configs)){
+ handlerList.addHandler(ViewRegistry.getWebAppContext(viewInstanceDefinition));
+ }
+ handlerList.addHandler(root);
+
+ server.setHandler(handlerList);
ServletHolder agent = new ServletHolder(ServletContainer.class);
agent.setInitParameter("com.sun.jersey.config.property.resourceConfigClass",
http://git-wip-us.apache.org/repos/asf/ambari/blob/c337d7df/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java
index 7efea04..d0901e8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java
@@ -45,10 +45,10 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
/**
* View instance property id constants.
*/
- public static final String VIEW_NAME_PROPERTY_ID = "ViewInstanceInfo/view_name";
- public static final String INSTANCE_NAME_PROPERTY_ID = "ViewInstanceInfo/instance_name";
- public static final String PROPERTIES_PROPERTY_ID = "ViewInstanceInfo/properties";
- public static final String SERVLET_MAPPINGS_PROPERTY_ID = "ViewInstanceInfo/servlet_mappings";
+ public static final String VIEW_NAME_PROPERTY_ID = "ViewInstanceInfo/view_name";
+ public static final String INSTANCE_NAME_PROPERTY_ID = "ViewInstanceInfo/instance_name";
+ public static final String PROPERTIES_PROPERTY_ID = "ViewInstanceInfo/properties";
+ public static final String CONTEXT_PATH_PROPERTY_ID = "ViewInstanceInfo/context_path";
/**
* The key property ids for a view instance resource.
@@ -67,7 +67,7 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
propertyIds.add(VIEW_NAME_PROPERTY_ID);
propertyIds.add(INSTANCE_NAME_PROPERTY_ID);
propertyIds.add(PROPERTIES_PROPERTY_ID);
- propertyIds.add(SERVLET_MAPPINGS_PROPERTY_ID);
+ propertyIds.add(CONTEXT_PATH_PROPERTY_ID);
}
@@ -118,8 +118,8 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
setResourceProperty(resource, INSTANCE_NAME_PROPERTY_ID, viewInstanceDefinition.getName(), requestedIds);
setResourceProperty(resource, PROPERTIES_PROPERTY_ID,
viewInstanceDefinition.getProperties(), requestedIds);
- setResourceProperty(resource, SERVLET_MAPPINGS_PROPERTY_ID,
- viewInstanceDefinition.getServletMappings(), requestedIds);
+ setResourceProperty(resource, CONTEXT_PATH_PROPERTY_ID,
+ viewInstanceDefinition.getContextPath(), requestedIds);
resources.add(resource);
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c337d7df/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewResourceProvider.java
index 17d3b94..b643773 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewResourceProvider.java
@@ -48,6 +48,7 @@ public class ViewResourceProvider extends AbstractResourceProvider {
public static final String LABEL_PROPERTY_ID = "ViewInfo/label";
public static final String VERSION_PROPERTY_ID = "ViewInfo/version";
public static final String PARAMETERS_PROPERTY_ID = "ViewInfo/parameters";
+ public static final String ARCHIVE_PROPERTY_ID = "ViewInfo/archive";
/**
@@ -67,6 +68,7 @@ public class ViewResourceProvider extends AbstractResourceProvider {
propertyIds.add(LABEL_PROPERTY_ID);
propertyIds.add(VERSION_PROPERTY_ID);
propertyIds.add(PARAMETERS_PROPERTY_ID);
+ propertyIds.add(ARCHIVE_PROPERTY_ID);
}
@@ -115,6 +117,7 @@ public class ViewResourceProvider extends AbstractResourceProvider {
setResourceProperty(resource, VERSION_PROPERTY_ID, viewDefinition.getVersion(), requestedIds);
setResourceProperty(resource, PARAMETERS_PROPERTY_ID,
viewDefinition.getConfiguration().getParameters(), requestedIds);
+ setResourceProperty(resource, ARCHIVE_PROPERTY_ID, viewDefinition.getArchivePath(), requestedIds);
resources.add(resource);
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c337d7df/ambari-server/src/main/java/org/apache/ambari/server/view/ViewDefinition.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewDefinition.java
index 4d813c6..cc2ec5d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewDefinition.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewDefinition.java
@@ -68,6 +68,16 @@ public class ViewDefinition {
*/
private final Resource.Type externalResourceType;
+ /**
+ * The classloader used to load the view.
+ */
+ private final ClassLoader classLoader;
+
+ /**
+ * The archive path for the view.
+ */
+ private final String archivePath;
+
// ----- Constructors ------------------------------------------------------
@@ -76,10 +86,15 @@ public class ViewDefinition {
*
* @param configuration the view configuration
* @param ambariConfiguration the Ambari configuration
+ * @param classLoader the class loader
+ * @param archivePath the path of the view archive
*/
- public ViewDefinition(ViewConfig configuration, Configuration ambariConfiguration) {
+ public ViewDefinition(ViewConfig configuration, Configuration ambariConfiguration,
+ ClassLoader classLoader, String archivePath) {
this.configuration = configuration;
this.ambariConfiguration = ambariConfiguration;
+ this.classLoader = classLoader;
+ this.archivePath = archivePath;
this.externalResourceType =
new Resource.Type(getQualifiedResourceTypeName(ResourceConfig.EXTERNAL_RESOURCE_PLURAL_NAME));
@@ -261,4 +276,22 @@ public class ViewDefinition {
public String getQualifiedResourceTypeName(String resourceTypeName) {
return configuration.getName() + "/" + resourceTypeName;
}
+
+ /**
+ * Get the class loader used to load the view classes.
+ *
+ * @return the class loader
+ */
+ public ClassLoader getClassLoader() {
+ return classLoader;
+ }
+
+ /**
+ * Get the path for the archive for the view.
+ *
+ * @return the archive path
+ */
+ public String getArchivePath() {
+ return archivePath;
+ }
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c337d7df/ambari-server/src/main/java/org/apache/ambari/server/view/ViewInstanceDefinition.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewInstanceDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewInstanceDefinition.java
index 7a7a5eb..42b4f4e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewInstanceDefinition.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewInstanceDefinition.java
@@ -30,6 +30,11 @@ import java.util.Map;
*/
public class ViewInstanceDefinition {
/**
+ * The prefix for every view instance context path.
+ */
+ public static final String VIEWS_CONTEXT_PATH_PREFIX = "/views/";
+
+ /**
* The associated configuration.
*/
private final InstanceConfig instanceConfig;
@@ -55,10 +60,9 @@ public class ViewInstanceDefinition {
private final Map<String, Object> services = new HashMap<String, Object>();
/**
- * The mapping of servlet name to servlet path spec.
+ * The context path for the view web app.
*/
- private final Map<String, String> servletMappings = new HashMap<String, String>();
-
+ private final String contextPath;
// ----- Constructors ------------------------------------------------------
@@ -72,6 +76,7 @@ public class ViewInstanceDefinition {
public ViewInstanceDefinition(ViewDefinition viewDefinition, InstanceConfig instanceConfig) {
this.instanceConfig = instanceConfig;
this.viewDefinition = viewDefinition;
+ this.contextPath = VIEWS_CONTEXT_PATH_PREFIX + viewDefinition.getName() + "/" + instanceConfig.getName();
}
@@ -105,25 +110,6 @@ public class ViewInstanceDefinition {
}
/**
- * Add a mapping from servlet name to path spec.
- *
- * @param servletName the servlet name
- * @param pathSpec the path
- */
- public void addServletMapping(String servletName, String pathSpec) {
- servletMappings.put(servletName, pathSpec);
- }
-
- /**
- * Get the servlet mappings.
- *
- * @return the servlet mappings
- */
- public Map<String, String> getServletMappings() {
- return servletMappings;
- }
-
- /**
* Add a view instance property.
*
* @param key the property key
@@ -195,4 +181,13 @@ public class ViewInstanceDefinition {
String typeName = viewDefinition.getName() + "/" + type;
return resourceProviders.get(Resource.Type.valueOf(typeName));
}
+
+ /**
+ * Get the context path for the UI for this view.
+ *
+ * @return the context path
+ */
+ public String getContextPath() {
+ return contextPath;
+ }
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c337d7df/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java
index 8781d89..abeff05 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java
@@ -34,14 +34,10 @@ import org.apache.ambari.server.view.configuration.ResourceConfig;
import org.apache.ambari.server.view.configuration.ViewConfig;
import org.apache.ambari.view.ViewContext;
import org.apache.ambari.view.ViewResourceHandler;
-import org.eclipse.jetty.servlet.FilterHolder;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.webapp.WebAppContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.web.filter.DelegatingFilterProxy;
-import javax.servlet.http.HttpServlet;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.beans.IntrospectionException;
@@ -209,16 +205,15 @@ public class ViewRegistry {
/**
* Read the view archives.
*
- * @param configuration Ambari configuration
- * @param rootContextHandler the root servlet context handler
- * @param filterProxy the security filter
+ * @param configuration Ambari configuration
*/
- public static void readViewArchives(Configuration configuration, ServletContextHandler rootContextHandler,
- DelegatingFilterProxy filterProxy) {
+ public static Set<ViewInstanceDefinition> readViewArchives(Configuration configuration) {
File viewDir = configuration.getViewsDir();
File[] files = viewDir.listFiles();
+ Set<ViewInstanceDefinition> instanceDefinitions = new HashSet<ViewInstanceDefinition>();
+
if (files != null) {
for (final File fileEntry : files) {
if (!fileEntry.isDirectory()) {
@@ -229,12 +224,12 @@ public class ViewRegistry {
JAXBContext jaxbContext = JAXBContext.newInstance(ViewConfig.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
ViewConfig viewConfig = (ViewConfig) jaxbUnmarshaller.unmarshal(configStream);
- ViewDefinition viewDefinition = installView(viewConfig, cl, configuration);
+ ViewDefinition viewDefinition = installView(viewConfig, configuration, cl, fileEntry.getAbsolutePath());
List<InstanceConfig> instances = viewConfig.getInstances();
for (InstanceConfig instanceConfig : instances) {
- installViewInstance(viewDefinition, instanceConfig, cl, rootContextHandler, filterProxy, configuration);
+ instanceDefinitions.add(installViewInstance(viewDefinition, instanceConfig));
}
} catch (Exception e) {
LOG.error("Caught exception loading view from " + fileEntry.getAbsolutePath(), e);
@@ -242,6 +237,81 @@ public class ViewRegistry {
}
}
}
+ return instanceDefinitions;
+ }
+
+ /**
+ * Install a view instance described by the given instance configuration
+ * for the view defined by the given view definition.
+ *
+ * @param viewDefinition the view definition
+ * @param instanceConfig the instance configuration
+ *
+ * @return the new view instance definition
+ *
+ * @throws ClassNotFoundException if the view classes in the given configuration can not be found
+ */
+ public static ViewInstanceDefinition installViewInstance(ViewDefinition viewDefinition,
+ InstanceConfig instanceConfig)
+ throws ClassNotFoundException {
+
+ ViewInstanceDefinition viewInstanceDefinition = new ViewInstanceDefinition(viewDefinition, instanceConfig);
+
+ List<PropertyConfig> propertyConfigs = instanceConfig.getProperties();
+
+ for (PropertyConfig propertyConfig : propertyConfigs) {
+ viewInstanceDefinition.addProperty(propertyConfig.getKey(), propertyConfig.getValue());
+ }
+
+ ViewContext viewInstanceContext = new ViewContextImpl(viewInstanceDefinition);
+
+ ViewExternalSubResourceService externalSubResourceService =
+ new ViewExternalSubResourceService(viewDefinition.getExternalResourceType(), viewInstanceDefinition);
+
+ viewInstanceDefinition.addService(ResourceConfig.EXTERNAL_RESOURCE_PLURAL_NAME, externalSubResourceService);
+
+ Collection<ViewSubResourceDefinition> resourceDefinitions = viewDefinition.getResourceDefinitions().values();
+ for (ViewSubResourceDefinition resourceDefinition : resourceDefinitions) {
+
+ Resource.Type type = resourceDefinition.getType();
+ ResourceConfig resourceConfig = resourceDefinition.getResourceConfiguration();
+
+ ViewResourceHandler viewResourceService =
+ new ViewSubResourceService(type, viewDefinition.getName(), instanceConfig.getName());
+
+ ClassLoader cl = viewDefinition.getClassLoader();
+
+ Object service = getService(resourceConfig.getServiceClass(cl), viewResourceService, viewInstanceContext);
+
+ if (resourceConfig.isExternal()) {
+ externalSubResourceService.addResourceService(resourceConfig.getName(), service);
+ } else {
+ viewInstanceDefinition.addService(viewDefinition.getResourceDefinition(type).getPluralName(),service);
+ viewInstanceDefinition.addResourceProvider(type,
+ getProvider(resourceConfig.getProviderClass(cl), viewInstanceContext));
+ }
+ }
+
+ viewDefinition.addInstanceDefinition(viewInstanceDefinition);
+ ViewRegistry.getInstance().addInstanceDefinition(viewDefinition, viewInstanceDefinition);
+
+ return viewInstanceDefinition;
+ }
+
+ /**
+ * Get a WebAppContext for the given view instance.
+ *
+ * @param viewInstanceDefinition the view instance definition
+ *
+ * @return a web app context
+ */
+ public static WebAppContext getWebAppContext(ViewInstanceDefinition viewInstanceDefinition) {
+ ViewDefinition viewDefinition = viewInstanceDefinition.getViewDefinition();
+
+ WebAppContext context = new WebAppContext(viewDefinition.getArchivePath(), viewInstanceDefinition.getContextPath());
+ context.setClassLoader(viewDefinition.getClassLoader());
+ context.setAttribute(ViewContext.CONTEXT_ATTRIBUTE, new ViewContextImpl(viewInstanceDefinition));
+ return context;
}
@@ -257,12 +327,13 @@ public class ViewRegistry {
}
// install a new view definition
- private static ViewDefinition installView(ViewConfig viewConfig, ClassLoader cl, Configuration ambariConfig)
+ private static ViewDefinition installView(ViewConfig viewConfig, Configuration ambariConfig,
+ ClassLoader cl, String archivePath)
throws ClassNotFoundException, IntrospectionException {
List<ResourceConfig> resourceConfigurations = viewConfig.getResources();
- ViewDefinition viewDefinition = new ViewDefinition(viewConfig, ambariConfig);
+ ViewDefinition viewDefinition = new ViewDefinition(viewConfig, ambariConfig, cl, archivePath);
Resource.Type externalResourceType = viewDefinition.getExternalResourceType();
@@ -297,71 +368,6 @@ public class ViewRegistry {
return viewDefinition;
}
- // install a new view instance definition
- private static void installViewInstance(ViewDefinition viewDefinition,
- InstanceConfig instanceConfig,
- ClassLoader cl,
- ServletContextHandler root,
- DelegatingFilterProxy springSecurityFilter,
- Configuration ambariConfig) throws ClassNotFoundException {
-
- ViewInstanceDefinition viewInstanceDefinition = new ViewInstanceDefinition(viewDefinition, instanceConfig);
-
- List<PropertyConfig> propertyConfigs = instanceConfig.getProperties();
-
- for (PropertyConfig propertyConfig : propertyConfigs) {
- viewInstanceDefinition.addProperty(propertyConfig.getKey(), propertyConfig.getValue());
- }
-
- ViewContext viewInstanceContext = new ViewContextImpl(viewInstanceDefinition);
-
- ViewExternalSubResourceService externalSubResourceService =
- new ViewExternalSubResourceService(viewDefinition.getExternalResourceType(), viewInstanceDefinition);
-
- viewInstanceDefinition.addService(ResourceConfig.EXTERNAL_RESOURCE_PLURAL_NAME, externalSubResourceService);
-
- Collection<ViewSubResourceDefinition> resourceDefinitions = viewDefinition.getResourceDefinitions().values();
- for (ViewSubResourceDefinition resourceDefinition : resourceDefinitions) {
-
- Resource.Type type = resourceDefinition.getType();
- ResourceConfig resourceConfig = resourceDefinition.getResourceConfiguration();
-
- ViewResourceHandler viewResourceService =
- new ViewSubResourceService(type, viewDefinition.getName(), instanceConfig.getName());
-
- Object service = getService(resourceConfig.getServiceClass(cl), viewResourceService, viewInstanceContext);
-
- if (resourceConfig.isExternal()) {
- externalSubResourceService.addResourceService(resourceConfig.getName(), service);
- } else {
- viewInstanceDefinition.addService(viewDefinition.getResourceDefinition(type).getPluralName(),service);
- viewInstanceDefinition.addResourceProvider(type,
- getProvider(resourceConfig.getProviderClass(cl), viewInstanceContext));
- }
- }
-
- ViewConfig viewConfig = viewDefinition.getConfiguration();
-
- Map<String, Class<? extends HttpServlet>> servletPathMap = viewConfig.getServletPathMap(cl);
- Map<String, String> servletURLPatternMap = viewConfig.getServletURLPatternMap();
-
- for (Map.Entry<String, Class<? extends HttpServlet>> entry : servletPathMap.entrySet()) {
- HttpServlet servlet = getServlet(entry.getValue(), viewInstanceContext);
- ServletHolder sh = new ServletHolder(servlet);
- String servletName = entry.getKey();
- String pathSpec = "/views/" + viewDefinition.getName() + "/" +
- viewInstanceDefinition.getName() + servletURLPatternMap.get(servletName);
- root.addServlet(sh, pathSpec);
- viewInstanceDefinition.addServletMapping(servletName, pathSpec);
-
- if (ambariConfig.getApiAuthentication()) {
- root.addFilter(new FilterHolder(springSecurityFilter), pathSpec, 1);
- }
- }
- viewDefinition.addInstanceDefinition(viewInstanceDefinition);
- ViewRegistry.getInstance().addInstanceDefinition(viewDefinition, viewInstanceDefinition);
- }
-
// get the given service class from the given class loader; inject a handler and context
private static <T> T getService(Class<T> clazz,
final ViewResourceHandler viewResourceHandler,
@@ -378,19 +384,6 @@ public class ViewRegistry {
return viewInstanceInjector.getInstance(clazz);
}
- // get the given servlet class from the given class loader; inject a context
- private static HttpServlet getServlet(Class<? extends HttpServlet> clazz,
- final ViewContext viewInstanceContext) {
- Injector viewInstanceInjector = Guice.createInjector(new AbstractModule() {
- @Override
- protected void configure() {
- bind(ViewContext.class)
- .toInstance(viewInstanceContext);
- }
- });
- return viewInstanceInjector.getInstance(clazz);
- }
-
// get the given resource provider class from the given class loader; inject a context
private static org.apache.ambari.view.ResourceProvider getProvider(
Class<? extends org.apache.ambari.view.ResourceProvider> clazz,
http://git-wip-us.apache.org/repos/asf/ambari/blob/c337d7df/ambari-server/src/main/java/org/apache/ambari/server/view/configuration/ServletConfig.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/view/configuration/ServletConfig.java b/ambari-server/src/main/java/org/apache/ambari/server/view/configuration/ServletConfig.java
deleted file mode 100644
index a62d0f3..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/view/configuration/ServletConfig.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ambari.server.view.configuration;
-
-import javax.servlet.http.HttpServlet;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-
-/**
- * View servlet mapping.
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-public class ServletConfig {
- /**
- * The servlet name.
- */
- @XmlElement(name="servlet-name")
- private String name;
-
- /**
- * The servlet class name.
- */
- @XmlElement(name="servlet-path")
- private String path;
-
- /**
- * The servlet class.
- */
- private Class<? extends HttpServlet> servletClass = null;
-
- /**
- * The servlet name.
- *
- * @return the servlet name
- */
- public String getName() {
- return name;
- }
-
- /**
- * Get the servlet class.
- *
- * @param cl the class loader
- *
- * @return the servlet class
- *
- * @throws ClassNotFoundException if the class can not be loaded
- */
- public Class<? extends HttpServlet> getServletClass(ClassLoader cl) throws ClassNotFoundException {
- if (servletClass == null) {
- servletClass = cl.loadClass(path).asSubclass(HttpServlet.class);
- }
- return servletClass;
- }
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c337d7df/ambari-server/src/main/java/org/apache/ambari/server/view/configuration/ServletMappingConfig.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/view/configuration/ServletMappingConfig.java b/ambari-server/src/main/java/org/apache/ambari/server/view/configuration/ServletMappingConfig.java
deleted file mode 100644
index cc11e07..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/view/configuration/ServletMappingConfig.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ambari.server.view.configuration;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-
-/**
- * View servlet mapping configuration.
- */
-@XmlAccessorType(XmlAccessType.FIELD)
-public class ServletMappingConfig {
-
- /**
- * The servlet name.
- */
- @XmlElement(name="servlet-name")
- private String name;
-
- /**
- * The URL pattern.
- */
- @XmlElement(name="url-pattern")
- private String urlPattern;
-
- /**
- * Get the servlet name.
- *
- * @return the servlet name
- */
- public String getName() {
- return name;
- }
-
- /**
- * Get the URL pattern.
- *
- * @return the URL pattern
- */
- public String getUrlPattern() {
- return urlPattern;
- }
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c337d7df/ambari-server/src/main/java/org/apache/ambari/server/view/configuration/ViewConfig.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/view/configuration/ViewConfig.java b/ambari-server/src/main/java/org/apache/ambari/server/view/configuration/ViewConfig.java
index 90e4a24..fa1bed1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/view/configuration/ViewConfig.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/view/configuration/ViewConfig.java
@@ -67,23 +67,6 @@ public class ViewConfig {
private List<InstanceConfig> instances;
/**
- * The list of servlets.
- */
- @XmlElement(name="servlet")
- private List<ServletConfig> servlets;
-
- /**
- * The mapping of servlet names to servlet classes.
- */
- public Map<String, Class<? extends HttpServlet>> servletPathMap = null;
-
- /**
- * The list of servlet mappings.
- */
- @XmlElement(name="servlet-mapping")
- private List<ServletMappingConfig> mappings;
-
- /**
* The mapping of servlet names to URL patterns.
*/
public Map<String, String> servletURLPatternMap = null;
@@ -141,61 +124,4 @@ public class ViewConfig {
public List<InstanceConfig> getInstances() {
return instances;
}
-
- /**
- * Get the list of servlets.
- *
- * @return the list of view servlets
- */
- public List<ServletConfig> getServlets() {
- return servlets;
- }
-
- /**
- * Get the list of servlet mappings.
- *
- * @return the list of view servlet mappings.
- */
- public List<ServletMappingConfig> getMappings() {
- return mappings;
- }
-
- /**
- * Get the mapping of servlet names to servlet classes.
- *
- * @param cl the class loader
- *
- * @return the mapping of servlet names to servlet classes
- *
- * @throws ClassNotFoundException if a servlet class can not be loaded
- */
- public synchronized Map<String, Class<? extends HttpServlet>> getServletPathMap(ClassLoader cl)
- throws ClassNotFoundException{
- if (servletPathMap == null) {
- servletPathMap = new HashMap<String, Class<? extends HttpServlet>>();
- if (servlets != null) {
- for (ServletConfig servletConfig : servlets) {
- servletPathMap.put(servletConfig.getName(), servletConfig.getServletClass(cl));
- }
- }
- }
- return servletPathMap;
- }
-
- /**
- * Get the mapping of servlet names to URL patterns.
- *
- * @return the mapping of servlet names to URL patterns
- */
- public synchronized Map<String, String> getServletURLPatternMap() {
- if (servletURLPatternMap == null) {
- servletURLPatternMap = new HashMap<String, String>();
- if (mappings != null) {
- for (ServletMappingConfig servletMappingConfig : mappings) {
- servletURLPatternMap.put(servletMappingConfig.getName(), servletMappingConfig.getUrlPattern());
- }
- }
- }
- return servletURLPatternMap;
- }
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c337d7df/ambari-server/src/test/java/org/apache/ambari/server/view/ViewDefinitionTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewDefinitionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewDefinitionTest.java
index 92766df..0aa2a08 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewDefinitionTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewDefinitionTest.java
@@ -53,7 +53,7 @@ public class ViewDefinitionTest {
properties.put("p3", "v3");
Configuration ambariConfig = new Configuration(properties);
- return new ViewDefinition(viewConfig, ambariConfig);
+ return new ViewDefinition(viewConfig, ambariConfig, ViewDefinitionTest.class.getClassLoader(), "view.jar");
}
@Test
@@ -175,4 +175,16 @@ public class ViewDefinitionTest {
verify(definition);
}
+
+ @Test
+ public void testGetClassLoader() throws Exception {
+ ViewDefinition viewDefinition = getViewDefinition();
+ Assert.assertEquals(ViewDefinitionTest.class.getClassLoader(), viewDefinition.getClassLoader());
+ }
+
+ @Test
+ public void testGetArchivePath() throws Exception {
+ ViewDefinition viewDefinition = getViewDefinition();
+ Assert.assertEquals("view.jar", viewDefinition.getArchivePath());
+ }
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c337d7df/ambari-server/src/test/java/org/apache/ambari/server/view/ViewInstanceDefinitionTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewInstanceDefinitionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewInstanceDefinitionTest.java
index 6df3e1e..22652aa 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewInstanceDefinitionTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewInstanceDefinitionTest.java
@@ -59,21 +59,6 @@ public class ViewInstanceDefinitionTest {
}
@Test
- public void testAddGetServletMapping() throws Exception {
- ViewInstanceDefinition viewInstanceDefinition = getViewInstanceDefinition();
-
- viewInstanceDefinition.addServletMapping("Servlet1", "path1");
- viewInstanceDefinition.addServletMapping("Servlet2", "path2");
-
- Map<String, String> mappings = viewInstanceDefinition.getServletMappings();
-
- Assert.assertEquals(2, mappings.size());
-
- Assert.assertEquals("path1", mappings.get("Servlet1"));
- Assert.assertEquals("path2", mappings.get("Servlet2"));
- }
-
- @Test
public void testAddGetProperty() throws Exception {
ViewInstanceDefinition viewInstanceDefinition = getViewInstanceDefinition();
@@ -119,6 +104,14 @@ public class ViewInstanceDefinitionTest {
Assert.assertEquals(provider, viewInstanceDefinition.getResourceProvider("myType"));
}
+ @Test
+ public void testContextPath() throws Exception {
+ ViewInstanceDefinition viewInstanceDefinition = getViewInstanceDefinition();
+
+ Assert.assertEquals(ViewInstanceDefinition.VIEWS_CONTEXT_PATH_PREFIX + "MY_VIEW/INSTANCE1",
+ viewInstanceDefinition.getContextPath());
+ }
+
public static ViewInstanceDefinition getViewInstanceDefinition() throws Exception {
InstanceConfig instanceConfig = InstanceConfigTest.getInstanceConfigs().get(0);
ViewDefinition viewDefinition = ViewDefinitionTest.getViewDefinition();
http://git-wip-us.apache.org/repos/asf/ambari/blob/c337d7df/ambari-server/src/test/java/org/apache/ambari/server/view/ViewRegistryTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewRegistryTest.java b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewRegistryTest.java
index 20bae47..2820ef9 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewRegistryTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewRegistryTest.java
@@ -21,8 +21,12 @@ package org.apache.ambari.server.view;
import org.apache.ambari.server.api.resources.SubResourceDefinition;
import org.apache.ambari.server.controller.spi.Resource;
import org.apache.ambari.server.controller.spi.ResourceProvider;
+import org.apache.ambari.server.view.configuration.InstanceConfig;
+import org.apache.ambari.server.view.configuration.InstanceConfigTest;
import org.apache.ambari.server.view.configuration.ResourceConfig;
import org.apache.ambari.server.view.configuration.ResourceConfigTest;
+import org.apache.ambari.server.view.configuration.ViewConfig;
+import org.apache.ambari.server.view.configuration.ViewConfigTest;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
@@ -93,6 +97,22 @@ public class ViewRegistryTest {
Assert.assertEquals("myType", subResourceDefinitions.iterator().next().getType().name());
}
+ @Test
+ public void testInstallViewInstance() throws Exception {
+ ViewRegistry registry = ViewRegistry.getInstance();
+
+ ViewDefinition viewDefinition = ViewDefinitionTest.getViewDefinition();
+ InstanceConfig instanceConfig = InstanceConfigTest.getInstanceConfigs().get(0);
+
+ ViewInstanceDefinition viewInstanceDefinition = ViewRegistry.installViewInstance(viewDefinition, instanceConfig);
+
+ Collection<ViewInstanceDefinition> viewInstanceDefinitions = registry.getInstanceDefinitions(viewDefinition);
+
+ Assert.assertEquals(1, viewInstanceDefinitions.size());
+
+ Assert.assertEquals(viewInstanceDefinition, viewInstanceDefinitions.iterator().next());
+ }
+
@Before
public void before() throws Exception {
ViewRegistry.getInstance().clear();
http://git-wip-us.apache.org/repos/asf/ambari/blob/c337d7df/ambari-server/src/test/java/org/apache/ambari/server/view/configuration/ServletConfigTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/view/configuration/ServletConfigTest.java b/ambari-server/src/test/java/org/apache/ambari/server/view/configuration/ServletConfigTest.java
deleted file mode 100644
index 8cf0ff7..0000000
--- a/ambari-server/src/test/java/org/apache/ambari/server/view/configuration/ServletConfigTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ambari.server.view.configuration;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import javax.xml.bind.JAXBException;
-import java.util.List;
-
-/**
- * ServletConfig tests.
- */
-public class ServletConfigTest {
- @Test
- public void testGetName() throws Exception {
- List<ServletConfig> servletConfigs = getServletConfigs();
-
- Assert.assertEquals(1, servletConfigs.size());
- Assert.assertEquals("MyViewServlet", servletConfigs.get(0).getName());
- }
-
- @Test
- public void testGetServletClass() throws Exception {
- List<ServletConfig> servletConfigs = getServletConfigs();
-
- Assert.assertEquals(1, servletConfigs.size());
- Assert.assertTrue(servletConfigs.get(0).getServletClass(getClass().getClassLoader()).equals(ViewConfigTest.MyViewServlet.class));
- }
-
- public static List<ServletConfig> getServletConfigs() throws JAXBException {
- ViewConfig viewConfig = ViewConfigTest.getConfig();
- return viewConfig.getServlets();
- }
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c337d7df/ambari-server/src/test/java/org/apache/ambari/server/view/configuration/ServletMappingConfigTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/view/configuration/ServletMappingConfigTest.java b/ambari-server/src/test/java/org/apache/ambari/server/view/configuration/ServletMappingConfigTest.java
deleted file mode 100644
index c0447bb..0000000
--- a/ambari-server/src/test/java/org/apache/ambari/server/view/configuration/ServletMappingConfigTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ambari.server.view.configuration;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import javax.xml.bind.JAXBException;
-import java.util.List;
-
-/**
- * ServletMappingConfig tests.
- */
-public class ServletMappingConfigTest {
- @Test
- public void testGetName() throws Exception {
- List<ServletMappingConfig> mappingConfigs = getServletMappingConfigs();
-
- Assert.assertEquals(1, mappingConfigs.size());
- Assert.assertEquals("MyViewServlet", mappingConfigs.get(0).getName());
- }
-
- @Test
- public void testGetUrlPattern() throws Exception {
- List<ServletMappingConfig> mappingConfigs = getServletMappingConfigs();
-
- Assert.assertEquals(1, mappingConfigs.size());
- Assert.assertEquals("/ui", mappingConfigs.get(0).getUrlPattern());
- }
-
- public static List<ServletMappingConfig> getServletMappingConfigs() throws JAXBException {
- ViewConfig viewConfig = ViewConfigTest.getConfig();
- return viewConfig.getMappings();
- }
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c337d7df/ambari-server/src/test/java/org/apache/ambari/server/view/configuration/ViewConfigTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/view/configuration/ViewConfigTest.java b/ambari-server/src/test/java/org/apache/ambari/server/view/configuration/ViewConfigTest.java
index 04e71a8..27a7644 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/view/configuration/ViewConfigTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/view/configuration/ViewConfigTest.java
@@ -147,42 +147,6 @@ public class ViewConfigTest {
Assert.assertEquals("INSTANCE2", instances.get(1).getName());
}
- @Test
- public void testGetServlets() throws Exception {
- ViewConfig config = getConfig();
- List<ServletConfig> servlets = config.getServlets();
- Assert.assertEquals(1, servlets.size());
- Assert.assertEquals("MyViewServlet", servlets.get(0).getName());
- }
-
- @Test
- public void testGetMappings() throws Exception {
- ViewConfig config = getConfig();
- List<ServletMappingConfig> mappings = config.getMappings();
- Assert.assertEquals(1, mappings.size());
- Assert.assertEquals("MyViewServlet", mappings.get(0).getName());
- }
-
- @Test
- public void testGetServletPathMap() throws Exception {
- ViewConfig config = getConfig();
- Map<String, Class<? extends HttpServlet>> servletPathMap = config.getServletPathMap(getClass().getClassLoader());
-
- Assert.assertEquals(1, servletPathMap.size());
- Assert.assertEquals("MyViewServlet", servletPathMap.keySet().iterator().next());
- Assert.assertTrue(servletPathMap.values().iterator().next().equals(MyViewServlet.class));
- }
-
- @Test
- public void testGetServletURLPatternMap() throws Exception {
- ViewConfig config = getConfig();
- Map<String, String> servletURLPatternMap = config.getServletURLPatternMap();
-
- Assert.assertEquals(1, servletURLPatternMap.size());
- Assert.assertEquals("MyViewServlet", servletURLPatternMap.keySet().iterator().next());
- Assert.assertEquals("/ui", servletURLPatternMap.values().iterator().next());
- }
-
public static ViewConfig getConfig() throws JAXBException {
return getConfig(xml);
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/c337d7df/ambari-views/src/main/java/org/apache/ambari/view/ViewContext.java
----------------------------------------------------------------------
diff --git a/ambari-views/src/main/java/org/apache/ambari/view/ViewContext.java b/ambari-views/src/main/java/org/apache/ambari/view/ViewContext.java
index b81fb09..cd684c3 100644
--- a/ambari-views/src/main/java/org/apache/ambari/view/ViewContext.java
+++ b/ambari-views/src/main/java/org/apache/ambari/view/ViewContext.java
@@ -26,6 +26,12 @@ import java.util.Map;
* the current execution context.
*/
public interface ViewContext {
+
+ /**
+ * Key for mapping a view context as a property.
+ */
+ public static final String CONTEXT_ATTRIBUTE = "ambari-view-context";
+
/**
* Get the current user name.
*