Problem
In a multitiered Java 2 Platform, Enterprise Edition (J2EE) application environment, the following problems arise.
if Client is exposed to the Business Objects of the application(DAO,Session Beans or Entity Beans) there will be a tight coupling between the client and the Business Objects.
if the application grows eventually the number of business objects will grow so that Client logic will become more and more complex.
if the Client is Accessing the Enterprise beans directly so There will be a heavy usage of the n/w.
if Multiple Clients are using the Business objects there will not be uniformity in the way client uses them.
To resolve the above issues we can make use of Session Facade Design pattern
Structure :
Session Facade class diagram

you can define a Session Facade as
1. Stateless Session bean : if Business process include single method call in your business process
2. Statefull Session bean : if Business process include multiple method calls in your business process
Uses of Session Facade:
Remote Interface :
Resource :
http://www.oracle.com/technetwork/java/sessionfacade-135203.html
http://www.oracle.com/technetwork/java/sessionfacade-141285.html
In a multitiered Java 2 Platform, Enterprise Edition (J2EE) application environment, the following problems arise.
if Client is exposed to the Business Objects of the application(DAO,Session Beans or Entity Beans) there will be a tight coupling between the client and the Business Objects.
if the application grows eventually the number of business objects will grow so that Client logic will become more and more complex.
if the Client is Accessing the Enterprise beans directly so There will be a heavy usage of the n/w.
if Multiple Clients are using the Business objects there will not be uniformity in the way client uses them.
To resolve the above issues we can make use of Session Facade Design pattern
Structure :
Session Facade class diagram

Participants and Collaborations
in the below Figure contains the sequence diagram that shows the interactions of a Session Facade with two entity beans, one session bean, and a DAO, all acting as participants in fulfilling the request from the client.
Session Facade sequence diagram :

you can define a Session Facade as
1. Stateless Session bean : if Business process include single method call in your business process
2. Statefull Session bean : if Business process include multiple method calls in your business process
Uses of Session Facade:
- Introduces Business-Tier Controller Layer
- Exposes Uniform Interface
- Reduces Coupling, Increases Manageability
- Improves Performance, Reduces Fine-Grained Methods
- Provides Coarse-Grained Access
- Centralizes Security Management
- Centralizes Transaction Control
- Exposes Fewer Remote Interfaces to Clients
ProjectResourceManagerSession.java
package corepatterns.apps.psa.ejb;
import java.util.*;
import java.rmi.RemoteException;
import javax.ejb.*;
import javax.naming.*;
import corepatterns.apps.psa.core.*;
import corepatterns.util.ServiceLocator;
import corepatterns.util.ServiceLocatorException;
// Note: all try/catch details not shown for brevity.
public class ProjectResourceManagerSession
implements SessionBean {
private SessionContext context;
// Remote references for the
// entity Beans encapsulated by this facade
private Resource resourceEntity = null;
private Project projectEntity = null;
...
// default create
public void ejbCreate()
throws CreateException {
}
// create method to create this facade and to
// establish connections to the required entity
// beans
// using primary key values
public void ejbCreate(
String resourceId, String projectId, ...)
throws CreateException, ResourceException {
try {
// locate and connect to entity beans
connectToEntities(resourceId, projectId, ...);
} catch(...) {
// Handle exceptions
}
}
// method to connect the session facade to its
// entity beans using the primary key values
private void connectToEntities (
String resourceId, String projectId)
throws ResourceException {
resourceEntity = getResourceEntity(resourceId);
projectEntity = getProjectEntity(projectId);
...
}
// method to reconnect the session facade to a
// different set of entity beans using primary key
// values
public resetEntities(String resourceId,
String projectId, ...)
throws PSAException {
connectToEntities(resourceId, projectId, ...);
}
// private method to get Home for Resource
private ResourceHome getResourceHome()
throws ServiceLocatorException {
return ServiceLocator. getInstance().getHome(
"ResourceEntity", ResourceHome.class);
}
// private method to get Home for Project
private ProjectHome getProjectHome()
throws ServiceLocatorException {
return ServiceLocator. getInstance().getHome(
"ProjectEntity", ProjectHome.class);
}
// private method to get Resource entity
private Resource getResourceEntity(
String resourceId) throws ResourceException {
try {
ResourceHome home = getResourceHome();
return (Resource)
home.findByPrimaryKey(resourceId);
} catch(...) {
// Handle exceptions
}
}
// private method to get Project entity
private Project getProjectEntity(String projectId)
throws ProjectException {
// similar to getResourceEntity
...
}
// Method to encapsulate workflow related
// to assigning a resource to a project.
// It deals with Project and Resource Entity beans
public void assignResourceToProject(int numHours)
throws PSAException {
try {
if ((projectEntity == null) ||
(resourceEntity == null)) {
// SessionFacade not connected to entities
throw new PSAException(...);
}
// Get Resource data
ResourceTO resourceTO =
resourceEntity.getResourceData();
// Get Project data
ProjectTO projectTO =
projectEntity.getProjectData();
// first add Resource to Project
projectEntity.addResource(resourceTO);
// Create a new Commitment for the Project
CommitmentTO commitment = new
CommitmentTO( ...);
// add the commitment to the Resource
projectEntity.addCommitment(commitment);
} catch(...) {
// Handle exceptions
}
}
// Similarly implement other business methods to
// facilitate various use cases/interactions
public void unassignResourceFromProject()
throws PSAException {
...
}
// Methods working with ResourceEntity
public ResourceTO getResourceData()
throws ResourceException {
...
}
// Update Resource Entity Bean
public void setResourceData(ResourceTO resource)
throws ResourceException {
...
}
// Create new Resource Entity bean
public ResourceTO createNewResource(ResourceTO
resource) throws ResourceException {
...
}
// Methods for managing resource's blockout time
public void addBlockoutTime(Collection blockoutTime)
throws RemoteException,BlockoutTimeException {
...
}
public void updateBlockoutTime(
Collection blockoutTime)
throws RemoteException, BlockoutTimeException {
...
}
public Collection getResourceCommitments()
throws RemoteException, ResourceException {
...
}
// Methods working with ProjectEntity
public ProjectTO getProjectData()
throws ProjectException {
...
}
// Update Project Entity Bean
public void setProjectData(ProjectTO project)
throws ProjectException {
...
}
// Create new Project Entity bean
public ProjectTO createNewProject(ProjectTO project)
throws ProjectException {
...
}
...
// Other session facade method examples
// This proxies a call to a Transfer Object Assembler
// to obtain a composite Transfer Object.
// See Transfer Object Assembler pattern
public ProjectCTO getProjectDetailsData()
throws PSAException {
try {
ProjectTOAHome projectTOAHome = (ProjectTOAHome)
ServiceLocator.getInstance().getHome(
"ProjectTOA", ProjectTOAHome.class);
// Transfer Object Assembler session bean
ProjectTOA projectTOA =
projectTOAHome.create(...);
return projectTOA.getData(...);
} catch (...) {
// Handle / throw exceptions
}
}
// These method proxies a call to a ValueListHandler
// to get a list of projects. See Value List Handler
// pattern.
public Collection getProjectsList(Date start,
Date end) throws PSAException {
try {
ProjectListHandlerHome projectVLHHome =
(ProjectVLHHome)
ServiceLocator.getInstance().getHome(
"ProjectListHandler",
ProjectVLHHome.class);
// Value List Handler session bean
ProjectListHandler projectListHandler =
projectVLHHome.create();
return projectListHandler.getProjects(
start, end);
} catch (...) {
// Handle / throw exceptions
}
}
...
public void ejbActivate() {
...
}
public void ejbPassivate() {
context = null;
}
public void setSessionContext(SessionContext ctx) {
this.context = ctx;
}
public void ejbRemove() {
...
}
}
Remote Interface :
package corepatterns.apps.psa.ejb; import java.rmi.RemoteException; import javax.ejb.*; import corepatterns.apps.psa.core.*; // Note: all try/catch details not shown for brevity. public interface ProjectResourceManager extends EJBObject { public resetEntities(String resourceId, String projectId, ...) throws RemoteException, ResourceException ; public void assignResourceToProject(int numHours) throws RemoteException, ResourceException ; public void unassignResourceFromProject() throws RemoteException, ResourceException ; ... public ResourceTO getResourceData() throws RemoteException, ResourceException ; public void setResourceData(ResourceTO resource) throws RemoteException, ResourceException ; public ResourceTO createNewResource(ResourceTO resource) throws ResourceException ; public void addBlockoutTime(Collection blockoutTime) throws RemoteException,BlockoutTimeException ; public void updateBlockoutTime(Collection blockoutTime) throws RemoteException,BlockoutTimeException ; public Collection getResourceCommitments() throws RemoteException, ResourceException; public ProjectTO getProjectData() throws RemoteException, ProjectException ; public void setProjectData(ProjectTO project) throws RemoteException, ProjectException ; public ProjectTO createNewProject(ProjectTO project) throws RemoteException, ProjectException ; ... public ProjectCTO getProjectDetailsData() throws RemoteException, PSAException ; public Collection getProjectsList(Date start, Date end) throws RemoteException, PSAException ; ... }
Home Interface :
package corepatterns.apps.psa.ejb; import javax.ejb.EJBHome; import java.rmi.RemoteException; import corepatterns.apps.psa.core.ResourceException; import javax.ejb.*; public interface ProjectResourceManagerHome extends EJBHome { public ProjectResourceManager create() throws RemoteException,CreateException; public ProjectResourceManager create(String resourceId, String projectId, ...) throws RemoteException,CreateException; }
Note : the usage of Session Facade is depend on the application.For a smaller
application Session Facade does add much.it is useful when your application goes bigger
Resource :
http://www.oracle.com/technetwork/java/sessionfacade-135203.html
http://www.oracle.com/technetwork/java/sessionfacade-141285.html
No comments:
Post a Comment