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];
}
}