This example shows a custom container and a web client of the container. The example is comprised of the following code:
Code for the container, which is shown in Container Component Code
Code for a web client of the container, which is shown in Web Client Code
Code that defines the configuration data for the container component is shown in Examples of Adding Configuration Data for a Component.
Code for an asadmin subcommand that updates the configuration data in this example is shown in Example 4–7.
The container component code is comprised of the classes and interfaces that are listed in the following table. The table also provides a cross-reference to the listing of each class or interface.
Class or Interface |
Listing |
---|---|
Greeter | |
GreeterContainer | |
GreeterContainer | |
GreeterDeployer | |
GreeterSniffer |
This example shows the code for defining a component of the Greeter container.
package org.glassfish.examples.extension.greeter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * Simple annotation to denote Greeter's component */ @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface Greeter { /** * Name to uniquely identify different greeters * * @return a good greeter name */ public String name(); }
This example shows the Java language class GreeterAppContainer, which implements the ApplicationContainer interface.
package org.glassfish.examples.extension.greeter; import org.glassfish.api.deployment.ApplicationContainer; import org.glassfish.api.deployment.ApplicationContext; import org.glassfish.api.deployment.archive.ReadableArchive; import java.util.List; import java.util.ArrayList; public class GreeterAppContainer implements ApplicationContainer { final GreeterContainer ctr; final List<Class> componentClasses = new ArrayList<Class>(); public GreeterAppContainer(GreeterContainer ctr) { this.ctr = ctr; } void addComponent(Class componentClass) { componentClasses.add(componentClass); } public Object getDescriptor() { return null; } public boolean start(ApplicationContext startupContext) throws Exception { for (Class componentClass : componentClasses) { try { Object component = componentClass.newInstance(); Greeter greeter = (Greeter) componentClass.getAnnotation(Greeter.class); ctr.habitat.addComponent(greeter.name(), component); } catch(Exception e) { throw new RuntimeException(e); } } return true; } public boolean stop(ApplicationContext stopContext) { for (Class componentClass : componentClasses) { ctr.habitat.removeAllByType(componentClass); } return true; } public boolean suspend() { return false; } public boolean resume() throws Exception { return false; } public ClassLoader getClassLoader() { return null; } }
This example shows the Java language class GreeterContainer, which implements the Container interface.
package org.glassfish.examples.extension.greeter; import org.glassfish.api.container.Container; import org.glassfish.api.deployment.Deployer; import org.jvnet.hk2.annotations.Service; import org.jvnet.hk2.annotations.Inject; import org.jvnet.hk2.component.Habitat; @Service(name="org.glassfish.examples.extension.GreeterContainer") public class GreeterContainer implements Container { @Inject Habitat habitat; public Class<? extends Deployer> getDeployer() { return GreeterDeployer.class; } public String getName() { return "greeter"; } }
This example shows the Java language class GreeterDeployer, which implements the Deployer interface.
package org.glassfish.examples.extension.greeter; import org.glassfish.api.deployment.Deployer; import org.glassfish.api.deployment.MetaData; import org.glassfish.api.deployment.DeploymentContext; import org.glassfish.api.deployment.ApplicationContainer; import org.glassfish.api.deployment.archive.ReadableArchive; import org.glassfish.api.container.Container; import org.jvnet.hk2.annotations.Service; import java.util.Enumeration; @Service public class GreeterDeployer implements Deployer<GreeterContainer, GreeterAppContainer> { public MetaData getMetaData() { return null; } public <V> V loadMetaData(Class<V> type, DeploymentContext context) { return null; } public boolean prepare(DeploymentContext context) { return false; } public GreeterAppContainer load( GreeterContainer container, DeploymentContext context) { GreeterAppContainer appCtr = new GreeterAppContainer(container); ClassLoader cl = context.getClassLoader(); ReadableArchive ra = context.getOriginalSource(); Enumeration<String> entries = ra.entries(); while (entries.hasMoreElements()) { String entry = entries.nextElement(); if (entry.endsWith(".class")) { String className = entryToClass(entry); try { Class componentClass = cl.loadClass(className); // ensure it is one of our component if (componentClass.isAnnotationPresent(Greeter.class)) { appCtr.addComponent(componentClass); } } catch(Exception e) { throw new RuntimeException(e); } } } return appCtr; } public void unload(GreeterAppContainer appContainer, DeploymentContext context) { } public void clean(DeploymentContext context) { } private String entryToClass(String entry) { String str = entry.substring("WEB-INF/classes/".length(), entry.length()-6); return str.replaceAll("/", "."); } }
This example shows the Java language class GreeterSniffer, which implements the Sniffer interface.
package org.glassfish.examples.extension.greeter; import org.glassfish.api.container.Sniffer; import org.glassfish.api.deployment.archive.ReadableArchive; import org.glassfish.api.admin.config.ConfigParser; import org.glassfish.examples.extension.greeter.config.GreeterContainerConfig; import org.jvnet.hk2.annotations.Service; import org.jvnet.hk2.annotations.Inject; import org.jvnet.hk2.component.Habitat; import com.sun.enterprise.module.Module; import java.util.logging.Logger; import java.util.Map; import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.Array; import java.net.URL; /** * @author Jerome Dochez */ @Service(name="greeter") public class GreeterSniffer implements Sniffer { @Inject(optional=true) GreeterContainerConfig config=null; @Inject ConfigParser configParser; @Inject Habitat habitat; public boolean handles(ReadableArchive source, ClassLoader loader) { return false; } public String[] getURLPatterns() { return new String[0]; } public Class<? extends Annotation>[] getAnnotationTypes() { Class<? extends Annotation>[] a = (Class<? extends Annotation>[]) Array.newInstance(Class.class, 1); a[0] = Greeter.class; return a; } public String getModuleType() { return "greeter"; } public Module[] setup(String containerHome, Logger logger) throws IOException { if (config==null) { URL url = this.getClass().getClassLoader().getResource("init.xml"); if (url!=null) { configParser.parseContainerConfig( habitat, url, GreeterContainerConfig.class); } } return null; } public void tearDown() { } public String[] getContainersNames() { String[] c = { GreeterContainer.class.getName() }; return c; } public boolean isUserVisible() { return true; } public Map<String, String> getDeploymentConfigurations (ReadableArchive source) throws IOException { return null; } public String[] getIncompatibleSnifferTypes() { return new String[0]; } }
The web client code is comprised of the classes and resources that are listed in the following table. The table also provides a cross-reference to the listing of each class or resource.
Class or Resource |
Listing |
---|---|
HelloWorld | |
SimpleGreeter | |
Deployment descriptor |
import components.SimpleGreeter; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.annotation.WebServlet; import javax.servlet.*; import javax.servlet.http.*; import javax.annotation.Resource; @WebServlet(urlPatterns={"/hello"}) public class HelloWorld extends HttpServlet { @Resource(name="Simple") SimpleGreeter greeter; public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { PrintWriter pw = res.getWriter(); try { pw.println("Injected service is " + greeter); if (greeter!=null) { pw.println("SimpleService says " + greeter.saySomething()); pw.println("<br>"); } } catch(Exception e) { e.printStackTrace(); } } }
package components; import org.glassfish.examples.extension.greeter.Greeter; @Greeter(name="simple") public class SimpleGreeter { public String saySomething() { return "Bonjour"; } }
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/Line break added for readability xml/ns/javaee/web-app_2_5.xsd"> </web-app>