:index-group: Misc
:jbake-type: page
:jbake-status: status=published
= EJB Examples

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

== AnnotatedEJB

[source,java]
----
package org.superbiz.servlet;

import javax.annotation.Resource;
import javax.ejb.LocalBean;
import javax.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

[source,java]
----
package org.superbiz.servlet;

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

@Local
public interface AnnotatedEJBLocal {
    String getName();

    void setName(String name);

    DataSource getDs();

    void setDs(DataSource ds);
}
----

== AnnotatedEJBRemote

[source,java]
----
package org.superbiz.servlet;

import javax.ejb.Remote;

@Remote
public interface AnnotatedEJBRemote {
    String getName();

    void setName(String name);
}
----

== AnnotatedServlet

[source,java]
----
package org.superbiz.servlet;

import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.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

[source,java]
----
package org.superbiz.servlet;

import javax.xml.ws.handler.Handler;
import javax.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

[source,java]
----
package org.superbiz.servlet;

import javax.jws.WebService;

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

== HelloEjbService

[source,java]
----
package org.superbiz.servlet;

import javax.ejb.Stateless;
import javax.jws.HandlerChain;
import javax.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

[source,java]
----
package org.superbiz.servlet;

import javax.jws.WebService;

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

== HelloPojoService

[source,java]
----
package org.superbiz.servlet;

import javax.jws.HandlerChain;
import javax.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

[source,java]
----
package org.superbiz.servlet;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameClassPair;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.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

[source,java]
----
package org.superbiz.servlet;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.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

[source,java]
----
package org.superbiz.servlet;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.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

[source,java]
----
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

[source,java]
----
package org.superbiz.servlet;

import javax.ejb.EJB;
import javax.ejb.EJBAccessException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.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

[source,java]
----
package org.superbiz.servlet;

import javax.annotation.Resource;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.DenyAll;
import javax.annotation.security.RolesAllowed;
import javax.ejb.SessionContext;
import javax.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

[source,java]
----
package org.superbiz.servlet;

import javax.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

[source,java]
----
package org.superbiz.servlet;

import javax.ejb.EJB;
import javax.ejb.EJBAccessException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.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

[source,java]
----
package org.superbiz.servlet;

import javax.xml.ws.handler.Handler;
import javax.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

[source,java]
----
package org.superbiz.servlet;

import javax.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

[source,java]
----
package org.superbiz.servlet;

import javax.jws.HandlerChain;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.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

[source,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

[source,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

[source,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

[source,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

[source,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

[source,xml]
----
<tomcat-users>
  <user name="manager" password="manager" roles="manager,user"/>
  <user name="user" password="user" roles="user"/>
</tomcat-users>
----

== web.xml

[source,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>javax.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>
----
