Preloader image

Help us document this example! Click the blue pencil icon in the upper right to edit this page.

AnnotatedEJB

package org.superbiz.servlet;

import jakarta.annotation.Resource;
import jakarta.ejb.LocalBean;
import jakarta.ejb.Stateless;
import javax.sql.DataSource;

@Stateless
@LocalBean
public class AnnotatedEJB implements AnnotatedEJBLocal, AnnotatedEJBRemote {
    @Resource
    private DataSource ds;

    private String name = "foo";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public DataSource getDs() {
        return ds;
    }

    public void setDs(DataSource ds) {
        this.ds = ds;
    }

    public String toString() {
        return "AnnotatedEJB[name=" + name + "]";
    }
}

AnnotatedEJBLocal

package org.superbiz.servlet;

import jakarta.ejb.Local;
import javax.sql.DataSource;

@Local
public interface AnnotatedEJBLocal {
    String getName();

    void setName(String name);

    DataSource getDs();

    void setDs(DataSource ds);
}

AnnotatedEJBRemote

package org.superbiz.servlet;

import jakarta.ejb.Remote;

@Remote
public interface AnnotatedEJBRemote {
    String getName();

    void setName(String name);
}

AnnotatedServlet

package org.superbiz.servlet;

import jakarta.annotation.Resource;
import jakarta.ejb.EJB;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import java.io.IOException;

public class AnnotatedServlet extends HttpServlet {
    @EJB
    private AnnotatedEJBLocal localEJB;

    @EJB
    private AnnotatedEJBRemote remoteEJB;

    @EJB
    private AnnotatedEJB localbeanEJB;

    @Resource
    private DataSource ds;


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/plain");
        ServletOutputStream out = response.getOutputStream();

        out.println("LocalBean EJB");
        out.println("@EJB=" + localbeanEJB);
        if (localbeanEJB != null) {
            out.println("@EJB.getName()=" + localbeanEJB.getName());
            out.println("@EJB.getDs()=" + localbeanEJB.getDs());
        }
        out.println("JNDI=" + lookupField("localbeanEJB"));
        out.println();

        out.println("Local EJB");
        out.println("@EJB=" + localEJB);
        if (localEJB != null) {
            out.println("@EJB.getName()=" + localEJB.getName());
            out.println("@EJB.getDs()=" + localEJB.getDs());
        }
        out.println("JNDI=" + lookupField("localEJB"));
        out.println();

        out.println("Remote EJB");
        out.println("@EJB=" + remoteEJB);
        if (localEJB != null) {
            out.println("@EJB.getName()=" + remoteEJB.getName());
        }
        out.println("JNDI=" + lookupField("remoteEJB"));
        out.println();


        out.println("DataSource");
        out.println("@Resource=" + ds);
        out.println("JNDI=" + lookupField("ds"));
    }

    private Object lookupField(String name) {
        try {
            return new InitialContext().lookup("java:comp/env/" + getClass().getName() + "/" + name);
        } catch (NamingException e) {
            return null;
        }
    }
}

ClientHandler

package org.superbiz.servlet;

import jakarta.xml.ws.handler.Handler;
import jakarta.xml.ws.handler.MessageContext;

public class ClientHandler implements Handler {
    public boolean handleMessage(MessageContext messageContext) {
        WebserviceServlet.write("    ClientHandler handleMessage");
        return true;
    }

    public void close(MessageContext messageContext) {
        WebserviceServlet.write("    ClientHandler close");
    }

    public boolean handleFault(MessageContext messageContext) {
        WebserviceServlet.write("    ClientHandler handleFault");
        return true;
    }
}

HelloEjb

package org.superbiz.servlet;

import jakarta.jws.WebService;

@WebService(targetNamespace = "http://examples.org/wsdl")
public interface HelloEjb {
    String hello(String name);
}

HelloEjbService

package org.superbiz.servlet;

import jakarta.ejb.Stateless;
import jakarta.jws.HandlerChain;
import jakarta.jws.WebService;

@WebService(
        portName = "HelloEjbPort",
        serviceName = "HelloEjbService",
        targetNamespace = "http://examples.org/wsdl",
        endpointInterface = "org.superbiz.servlet.HelloEjb"
)
@HandlerChain(file = "server-handlers.xml")
@Stateless
public class HelloEjbService implements HelloEjb {
    public String hello(String name) {
        WebserviceServlet.write("                HelloEjbService hello(" + name + ")");
        if (name == null) name = "World";
        return "Hello " + name + " from EJB Webservice!";
    }
}

HelloPojo

package org.superbiz.servlet;

import jakarta.jws.WebService;

@WebService(targetNamespace = "http://examples.org/wsdl")
public interface HelloPojo {
    String hello(String name);
}

HelloPojoService

package org.superbiz.servlet;

import jakarta.jws.HandlerChain;
import jakarta.jws.WebService;

@WebService(
        portName = "HelloPojoPort",
        serviceName = "HelloPojoService",
        targetNamespace = "http://examples.org/wsdl",
        endpointInterface = "org.superbiz.servlet.HelloPojo"
)
@HandlerChain(file = "server-handlers.xml")
public class HelloPojoService implements HelloPojo {
    public String hello(String name) {
        WebserviceServlet.write("                HelloPojoService hello(" + name + ")");
        if (name == null) name = "World";
        return "Hello " + name + " from Pojo Webservice!";
    }
}

JndiServlet

package org.superbiz.servlet;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameClassPair;
import javax.naming.NamingException;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collections;
import java.util.Map;
import java.util.TreeMap;

public class JndiServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/plain");
        ServletOutputStream out = response.getOutputStream();

        Map<String, Object> bindings = new TreeMap<String, Object>(String.CASE_INSENSITIVE_ORDER);
        try {
            Context context = (Context) new InitialContext().lookup("java:comp/");
            addBindings("", bindings, context);
        } catch (NamingException e) {
            throw new ServletException(e);
        }

        out.println("JNDI Context:");
        for (Map.Entry<String, Object> entry : bindings.entrySet()) {
            if (entry.getValue() != null) {
                out.println("  " + entry.getKey() + "=" + entry.getValue());
            } else {
                out.println("  " + entry.getKey());
            }
        }
    }

    private void addBindings(String path, Map<String, Object> bindings, Context context) {
        try {
            for (NameClassPair pair : Collections.list(context.list(""))) {
                String name = pair.getName();
                String className = pair.getClassName();
                if ("org.apache.naming.resources.FileDirContext$FileResource".equals(className)) {
                    bindings.put(path + name, "<file>");
                } else {
                    try {
                        Object value = context.lookup(name);
                        if (value instanceof Context) {
                            Context nextedContext = (Context) value;
                            bindings.put(path + name, "");
                            addBindings(path + name + "/", bindings, nextedContext);
                        } else {
                            bindings.put(path + name, value);
                        }
                    } catch (NamingException e) {
                        // lookup failed
                        bindings.put(path + name, "ERROR: " + e.getMessage());
                    }
                }
            }
        } catch (NamingException e) {
            bindings.put(path, "ERROR: list bindings threw an exception: " + e.getMessage());
        }
    }
}

JpaBean

package org.superbiz.servlet;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class JpaBean {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "name")
    private String name;

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public String toString() {
        return "[JpaBean id=" + id + ", name=" + name + "]";
    }
}

JpaServlet

package org.superbiz.servlet;

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.EntityTransaction;
import jakarta.persistence.PersistenceUnit;
import jakarta.persistence.Query;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

public class JpaServlet extends HttpServlet {
    @PersistenceUnit(name = "jpa-example")
    private EntityManagerFactory emf;


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/plain");
        ServletOutputStream out = response.getOutputStream();

        out.println("@PersistenceUnit=" + emf);

        EntityManager em = emf.createEntityManager();
        EntityTransaction transaction = em.getTransaction();
        transaction.begin();

        JpaBean jpaBean = new JpaBean();
        jpaBean.setName("JpaBean");
        em.persist(jpaBean);

        transaction.commit();
        transaction.begin();

        Query query = em.createQuery("SELECT j FROM JpaBean j WHERE j.name='JpaBean'");
        jpaBean = (JpaBean) query.getSingleResult();
        out.println("Loaded " + jpaBean);

        em.remove(jpaBean);

        transaction.commit();
        transaction.begin();

        query = em.createQuery("SELECT count(j) FROM JpaBean j WHERE j.name='JpaBean'");
        int count = ((Number) query.getSingleResult()).intValue();
        if (count == 0) {
            out.println("Removed " + jpaBean);
        } else {
            out.println("ERROR: unable to remove" + jpaBean);
        }

        transaction.commit();
    }
}

ResourceBean

package org.superbiz.servlet;

public class ResourceBean {
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String toString() {
        return "[ResourceBean " + value + "]";
    }
}

RunAsServlet

package org.superbiz.servlet;

import jakarta.ejb.EJB;
import jakarta.ejb.EJBAccessException;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.security.Principal;

public class RunAsServlet extends HttpServlet {
    @EJB
    private SecureEJBLocal secureEJBLocal;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/plain");
        ServletOutputStream out = response.getOutputStream();

        out.println("Servlet");
        Principal principal = request.getUserPrincipal();
        if (principal != null) {
            out.println("Servlet.getUserPrincipal()=" + principal + " [" + principal.getName() + "]");
        } else {
            out.println("Servlet.getUserPrincipal()=<null>");
        }
        out.println("Servlet.isCallerInRole(\"user\")=" + request.isUserInRole("user"));
        out.println("Servlet.isCallerInRole(\"manager\")=" + request.isUserInRole("manager"));
        out.println("Servlet.isCallerInRole(\"fake\")=" + request.isUserInRole("fake"));
        out.println();

        out.println("@EJB=" + secureEJBLocal);
        if (secureEJBLocal != null) {
            principal = secureEJBLocal.getCallerPrincipal();
            if (principal != null) {
                out.println("@EJB.getCallerPrincipal()=" + principal + " [" + principal.getName() + "]");
            } else {
                out.println("@EJB.getCallerPrincipal()=<null>");
            }
            out.println("@EJB.isCallerInRole(\"user\")=" + secureEJBLocal.isCallerInRole("user"));
            out.println("@EJB.isCallerInRole(\"manager\")=" + secureEJBLocal.isCallerInRole("manager"));
            out.println("@EJB.isCallerInRole(\"fake\")=" + secureEJBLocal.isCallerInRole("fake"));

            try {
                secureEJBLocal.allowUserMethod();
                out.println("@EJB.allowUserMethod() ALLOWED");
            } catch (EJBAccessException e) {
                out.println("@EJB.allowUserMethod() DENIED");
            }

            try {
                secureEJBLocal.allowManagerMethod();
                out.println("@EJB.allowManagerMethod() ALLOWED");
            } catch (EJBAccessException e) {
                out.println("@EJB.allowManagerMethod() DENIED");
            }

            try {
                secureEJBLocal.allowFakeMethod();
                out.println("@EJB.allowFakeMethod() ALLOWED");
            } catch (EJBAccessException e) {
                out.println("@EJB.allowFakeMethod() DENIED");
            }

            try {
                secureEJBLocal.denyAllMethod();
                out.println("@EJB.denyAllMethod() ALLOWED");
            } catch (EJBAccessException e) {
                out.println("@EJB.denyAllMethod() DENIED");
            }
        }
        out.println();
    }
}

SecureEJB

package org.superbiz.servlet;

import jakarta.annotation.Resource;
import jakarta.annotation.security.DeclareRoles;
import jakarta.annotation.security.DenyAll;
import jakarta.annotation.security.RolesAllowed;
import jakarta.ejb.SessionContext;
import jakarta.ejb.Stateless;
import java.security.Principal;

@Stateless
@DeclareRoles({"user", "manager", "fake"})
public class SecureEJB implements SecureEJBLocal {
    @Resource
    private SessionContext context;

    public Principal getCallerPrincipal() {
        return context.getCallerPrincipal();
    }

    public boolean isCallerInRole(String role) {
        return context.isCallerInRole(role);
    }

    @RolesAllowed("user")
    public void allowUserMethod() {
    }

    @RolesAllowed("manager")
    public void allowManagerMethod() {
    }

    @RolesAllowed("fake")
    public void allowFakeMethod() {
    }

    @DenyAll
    public void denyAllMethod() {
    }

    public String toString() {
        return "SecureEJB[userName=" + getCallerPrincipal() + "]";
    }
}

SecureEJBLocal

package org.superbiz.servlet;

import jakarta.ejb.Local;
import java.security.Principal;

@Local
public interface SecureEJBLocal {
    Principal getCallerPrincipal();

    boolean isCallerInRole(String role);

    void allowUserMethod();

    void allowManagerMethod();

    void allowFakeMethod();

    void denyAllMethod();
}

SecureServlet

package org.superbiz.servlet;

import jakarta.ejb.EJB;
import jakarta.ejb.EJBAccessException;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.security.Principal;

public class SecureServlet extends HttpServlet {
    @EJB
    private SecureEJBLocal secureEJBLocal;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/plain");
        ServletOutputStream out = response.getOutputStream();

        out.println("Servlet");
        Principal principal = request.getUserPrincipal();
        if (principal != null) {
            out.println("Servlet.getUserPrincipal()=" + principal + " [" + principal.getName() + "]");
        } else {
            out.println("Servlet.getUserPrincipal()=<null>");
        }
        out.println("Servlet.isCallerInRole(\"user\")=" + request.isUserInRole("user"));
        out.println("Servlet.isCallerInRole(\"manager\")=" + request.isUserInRole("manager"));
        out.println("Servlet.isCallerInRole(\"fake\")=" + request.isUserInRole("fake"));
        out.println();

        out.println("@EJB=" + secureEJBLocal);
        if (secureEJBLocal != null) {
            principal = secureEJBLocal.getCallerPrincipal();
            if (principal != null) {
                out.println("@EJB.getCallerPrincipal()=" + principal + " [" + principal.getName() + "]");
            } else {
                out.println("@EJB.getCallerPrincipal()=<null>");
            }
            out.println("@EJB.isCallerInRole(\"user\")=" + secureEJBLocal.isCallerInRole("user"));
            out.println("@EJB.isCallerInRole(\"manager\")=" + secureEJBLocal.isCallerInRole("manager"));
            out.println("@EJB.isCallerInRole(\"fake\")=" + secureEJBLocal.isCallerInRole("fake"));

            try {
                secureEJBLocal.allowUserMethod();
                out.println("@EJB.allowUserMethod() ALLOWED");
            } catch (EJBAccessException e) {
                out.println("@EJB.allowUserMethod() DENIED");
            }

            try {
                secureEJBLocal.allowManagerMethod();
                out.println("@EJB.allowManagerMethod() ALLOWED");
            } catch (EJBAccessException e) {
                out.println("@EJB.allowManagerMethod() DENIED");
            }

            try {
                secureEJBLocal.allowFakeMethod();
                out.println("@EJB.allowFakeMethod() ALLOWED");
            } catch (EJBAccessException e) {
                out.println("@EJB.allowFakeMethod() DENIED");
            }

            try {
                secureEJBLocal.denyAllMethod();
                out.println("@EJB.denyAllMethod() ALLOWED");
            } catch (EJBAccessException e) {
                out.println("@EJB.denyAllMethod() DENIED");
            }
        }
        out.println();
    }
}

ServerHandler

package org.superbiz.servlet;

import jakarta.xml.ws.handler.Handler;
import jakarta.xml.ws.handler.MessageContext;

public class ServerHandler implements Handler {
    public boolean handleMessage(MessageContext messageContext) {
        WebserviceServlet.write("        ServerHandler handleMessage");
        return true;
    }

    public void close(MessageContext messageContext) {
        WebserviceServlet.write("        ServerHandler close");
    }

    public boolean handleFault(MessageContext messageContext) {
        WebserviceServlet.write("        ServerHandler handleFault");
        return true;
    }
}

WebserviceClient

package org.superbiz.servlet;

import jakarta.xml.ws.Service;
import java.io.PrintStream;
import java.net.URL;

public class WebserviceClient {
    /**
     * Unfortunately, to run this example with CXF you need to have a HUGE class path.  This
     * is just what is required to run CXF:
     * <p/>
     * jaxb-api-2.0.jar
     * jaxb-impl-2.0.3.jar
     * <p/>
     * saaj-api-1.3.jar
     * saaj-impl-1.3.jar
     * <p/>
     * <p/>
     * cxf-api-2.0.2-incubator.jar
     * cxf-common-utilities-2.0.2-incubator.jar
     * cxf-rt-bindings-soap-2.0.2-incubator.jar
     * cxf-rt-core-2.0.2-incubator.jar
     * cxf-rt-databinding-jaxb-2.0.2-incubator.jar
     * cxf-rt-frontend-jaxws-2.0.2-incubator.jar
     * cxf-rt-frontend-simple-2.0.2-incubator.jar
     * cxf-rt-transports-http-jetty-2.0.2-incubator.jar
     * cxf-rt-transports-http-2.0.2-incubator.jar
     * cxf-tools-common-2.0.2-incubator.jar
     * <p/>
     * geronimo-activation_1.1_spec-1.0.jar
     * geronimo-annotation_1.0_spec-1.1.jar
     * geronimo-ejb_3.0_spec-1.0.jar
     * geronimo-jpa_2.2_spec-1.0.jar
     * geronimo-servlet_2.5_spec-1.1.jar
     * geronimo-stax-api_1.0_spec-1.0.jar
     * jaxws-api-2.0.jar
     * axis2-jws-api-1.3.jar
     * <p/>
     * wsdl4j-1.6.1.jar
     * xml-resolver-1.2.jar
     * XmlSchema-1.3.1.jar
     */
    public static void main(String[] args) throws Exception {
        PrintStream out = System.out;

        Service helloPojoService = Service.create(new URL("http://localhost:8080/ejb-examples/hello?wsdl"), null);
        HelloPojo helloPojo = helloPojoService.getPort(HelloPojo.class);
        out.println();
        out.println("Pojo Webservice");
        out.println("    helloPojo.hello(\"Bob\")=" + helloPojo.hello("Bob"));
        out.println("    helloPojo.hello(null)=" + helloPojo.hello(null));
        out.println();

        Service helloEjbService = Service.create(new URL("http://localhost:8080/HelloEjbService?wsdl"), null);
        HelloEjb helloEjb = helloEjbService.getPort(HelloEjb.class);
        out.println();
        out.println("EJB Webservice");
        out.println("    helloEjb.hello(\"Bob\")=" + helloEjb.hello("Bob"));
        out.println("    helloEjb.hello(null)=" + helloEjb.hello(null));
        out.println();
    }
}

WebserviceServlet

package org.superbiz.servlet;

import jakarta.jws.HandlerChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.xml.ws.WebServiceRef;
import java.io.IOException;

public class WebserviceServlet extends HttpServlet {

    @WebServiceRef
    @HandlerChain(file = "client-handlers.xml")
    private HelloPojo helloPojo;

    @WebServiceRef
    @HandlerChain(file = "client-handlers.xml")
    private HelloEjb helloEjb;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/plain");
        ServletOutputStream out = response.getOutputStream();

        OUT = out;
        try {
            out.println("Pojo Webservice");
            out.println("    helloPojo.hello(\"Bob\")=" + helloPojo.hello("Bob"));
            out.println();
            out.println("    helloPojo.hello(null)=" + helloPojo.hello(null));
            out.println();
            out.println("EJB Webservice");
            out.println("    helloEjb.hello(\"Bob\")=" + helloEjb.hello("Bob"));
            out.println();
            out.println("    helloEjb.hello(null)=" + helloEjb.hello(null));
            out.println();
        } finally {
            OUT = out;
        }
    }

    private static ServletOutputStream OUT;

    public static void write(String message) {
        try {
            ServletOutputStream out = OUT;
            out.println(message);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
  <persistence-unit transaction-type="RESOURCE_LOCAL" name="jpa-example">
    <jta-data-source>java:openejb/Connector/Default JDBC Database</jta-data-source>
    <non-jta-data-source>java:openejb/Connector/Default Unmanaged JDBC Database</non-jta-data-source>
    <class>org.superbiz.servlet.JpaBean</class>

    <properties>
      <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
    </properties>
  </persistence-unit>
</persistence>

client-handlers.xml

<jws:handler-chains xmlns:jws="http://java.sun.com/xml/ns/javaee">
  <jws:handler-chain>
    <jws:handler>
      <jws:handler-name>ClientHandler</jws:handler-name>
      <jws:handler-class>org.superbiz.servlet.ClientHandler</jws:handler-class>
    </jws:handler>
  </jws:handler-chain>
</jws:handler-chains>

server-handlers.xml

<jws:handler-chains xmlns:jws="http://java.sun.com/xml/ns/javaee">
  <jws:handler-chain>
    <jws:handler>
      <jws:handler-name>ServerHandler</jws:handler-name>
      <jws:handler-class>org.superbiz.servlet.ServerHandler</jws:handler-class>
    </jws:handler>
  </jws:handler-chain>
</jws:handler-chains>

context.xml

<Context>
  <!-- This only works if the context is installed under the correct name -->
  <Realm className="org.apache.catalina.realm.MemoryRealm"
         pathname="webapps/ejb-examples-1.0-SNAPSHOT/WEB-INF/tomcat-users.xml"/>

  <Environment
      name="context.xml/environment"
      value="ContextString"
      type="java.lang.String"/>
  <Resource
      name="context.xml/resource"
      auth="Container"
      type="org.superbiz.servlet.ResourceBean"
      factory="org.apache.naming.factory.BeanFactory"
      value="ContextResource"/>
  <ResourceLink
      name="context.xml/resource-link"
      global="server.xml/environment"
      type="java.lang.String"/>

  <!-- web.xml resources -->
  <Resource
      name="web.xml/resource-env-ref"
      auth="Container"
      type="org.superbiz.servlet.ResourceBean"
      factory="org.apache.naming.factory.BeanFactory"
      value="ContextResourceEnvRef"/>
  <Resource
      name="web.xml/resource-ref"
      auth="Container"
      type="org.superbiz.servlet.ResourceBean"
      factory="org.apache.naming.factory.BeanFactory"
      value="ContextResourceRef"/>
  <ResourceLink
      name="web.xml/resource-link"
      global="server.xml/environment"
      type="java.lang.String"/>
</Context>

jetty-web.xml

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Get name="securityHandler">
    <Set name="loginService">
      <New class="org.eclipse.jetty.security.HashLoginService">
        <Set name="name">Test Realm</Set>
        <Set name="config"><SystemProperty name="jetty.home" default="."/>/etc/realm.properties
        </Set>
      </New>
    </Set>
  </Get>
</Configure>

tomcat-users.xml

<tomcat-users>
  <user name="manager" password="manager" roles="manager,user"/>
  <user name="user" password="user" roles="user"/>
</tomcat-users>

web.xml

<web-app 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/xml/ns/javaee/web-app_2_5.xsd"
         metadata-complete="false"
         version="2.5">

  <display-name>OpenEJB Servlet Examples</display-name>

  <servlet>
    <servlet-name>AnnotatedServlet</servlet-name>
    <servlet-class>org.superbiz.servlet.AnnotatedServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>AnnotatedServlet</servlet-name>
    <url-pattern>/annotated/*</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>JpaServlet</servlet-name>
    <servlet-class>org.superbiz.servlet.JpaServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>JpaServlet</servlet-name>
    <url-pattern>/jpa/*</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>JndiServlet</servlet-name>
    <servlet-class>org.superbiz.servlet.JndiServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>JndiServlet</servlet-name>
    <url-pattern>/jndi/*</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>RunAsServlet</servlet-name>
    <servlet-class>org.superbiz.servlet.RunAsServlet</servlet-class>
    <run-as>
      <role-name>fake</role-name>
    </run-as>
  </servlet>

  <servlet-mapping>
    <servlet-name>RunAsServlet</servlet-name>
    <url-pattern>/runas/*</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>SecureServlet</servlet-name>
    <servlet-class>org.superbiz.servlet.SecureServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>SecureServlet</servlet-name>
    <url-pattern>/secure/*</url-pattern>
  </servlet-mapping>

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Secure Area</web-resource-name>
      <url-pattern>/secure/*</url-pattern>
      <url-pattern>/runas/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>user</role-name>
    </auth-constraint>
  </security-constraint>

  <servlet>
    <servlet-name>WebserviceServlet</servlet-name>
    <servlet-class>org.superbiz.servlet.WebserviceServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>WebserviceServlet</servlet-name>
    <url-pattern>/webservice/*</url-pattern>
  </servlet-mapping>


  <servlet>
    <servlet-name>HelloPojoService</servlet-name>
    <servlet-class>org.superbiz.servlet.HelloPojoService</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>HelloPojoService</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

  <login-config>
    <auth-method>BASIC</auth-method>
  </login-config>

  <security-role>
    <role-name>manager</role-name>
  </security-role>

  <security-role>
    <role-name>user</role-name>
  </security-role>

  <env-entry>
    <env-entry-name>web.xml/env-entry</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>WebValue</env-entry-value>
  </env-entry>

  <resource-ref>
    <res-ref-name>web.xml/Data Source</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

  <resource-env-ref>
    <resource-env-ref-name>web.xml/Queue</resource-env-ref-name>
    <resource-env-ref-type>jakarta.jms.Queue</resource-env-ref-type>
  </resource-env-ref>

  <ejb-ref>
    <ejb-ref-name>web.xml/EjbRemote</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <remote>org.superbiz.servlet.AnnotatedEJBRemote</remote>
  </ejb-ref>

  <ejb-local-ref>
    <ejb-ref-name>web.xml/EjLocal</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <local>org.superbiz.servlet.AnnotatedEJBLocal</local>
  </ejb-local-ref>

  <persistence-unit-ref>
    <persistence-unit-ref-name>web.xml/PersistenceUnit</persistence-unit-ref-name>
    <persistence-unit-name>jpa-example</persistence-unit-name>
  </persistence-unit-ref>

  <persistence-context-ref>
    <persistence-context-ref-name>web.xml/PersistenceContext</persistence-context-ref-name>
    <persistence-unit-name>jpa-example</persistence-unit-name>
    <persistence-context-type>Transactional</persistence-context-type>
  </persistence-context-ref>
</web-app>