1
www.craiglarman.com
Copyright © Craig Larman. All rights reserved.
J2EE and EJB are ™ Sun Microsystems Inc.
2
Copyright © Craig Larman. www.craiglarman.com
2
3
Copyright © Craig Larman. www.craiglarman.com
correct
4
Copyright © Craig Larman. www.craiglarman.com
3
5
Copyright © Craig Larman. www.craiglarman.com
6
Copyright © Craig Larman. www.craiglarman.com
Portland
Pattern
Repository
c2.com/ppr
Fowler,
Fowler,
. . .
. . .
4
7
Copyright © Craig Larman. www.craiglarman.com
Terminal Client
Presentation
Application
(Sessions)
Domain
(Entities)
Integration
In
te
r-
T
ier
D
a
ta
T
ran
sf
er
T
ran
sact
io
n
s
Pe
rs
is
te
nc
e
Ge
n
e
ra
l E
J
B
C
lie
nt
-S
ide
E
J
B
!"
!"
Terminal Client
Presentation
Application
(Sessions)
Domain
(Entities)
Integration
In
te
r-
Tier
D
a
ta
Tr
ansf
er
T
ran
sact
io
n
s
Pe
rs
is
te
nc
e
Ge
n
e
ra
l E
J
B
C
lie
nt
-S
ide
E
J
B
5
9
Copyright © Craig Larman. www.craiglarman.com
#$
#$
10
Copyright © Craig Larman. www.craiglarman.com
#$
#$
javax.ejb
«interface»
EJBObject
. . .
MyApp
«interface»
IMySessionBase
doWork() throws RemoteException
«interface»
SessionBean
ejbActivate()
ejbPassivate()
ejbRemove()
setSessionContext(...)
«interface»
IMySession
MySessionBeanImpl
ejbActivate()
. . .
doWork()
In UML, means no
operations declared
6
11
Copyright © Craig Larman. www.craiglarman.com
MyApp
«interface»
IMySessionBase
doWork() throws RemoteException
MySessionBeanImpl
ejbActivate()
. . .
doWork()
«interface»
IMySession
Note that doWork() should not
declare throws RemoteException,
but it can internally throw
EJBExceptions.
12
Copyright © Craig Larman. www.craiglarman.com
javax.ejb
«interface»
EJBLocalObject
. . .
MyApp
«interface»
IMyEntityBase
doEntityWork()
«interface»
EntityBean
. . .
«interface»
IMyEntity
MyEntityBeanImpl
. . .
doEntityWork()
7
13
Copyright © Craig Larman. www.craiglarman.com
%
%
!& ' #$
!& ' #$
! " #
$
14
Copyright © Craig Larman. www.craiglarman.com
%
%
!& ' #$
!& ' #$
MyStockSessionBean
. . .
setData( Map )
setDJIQuotes( List )
getDJIQuotes() : List
getQuotes( symbols : List ) : List
8
15
Copyright © Craig Larman. www.craiglarman.com
$
% "
" & $
16
Copyright © Craig Larman. www.craiglarman.com
«interface»
SessionBean
ejbActivate()
ejbPassivate()
ejbRemove()
setSessionContext(...)
AbstractSession
ejbActivate()
ejbCreate()
ejbPassivate()
ejbRemove()
setSessionContext(...) {frozen}
. . .
Session1
Session2
// no op
{ }
9
17
Copyright © Craig Larman. www.craiglarman.com
public abstract class AbstractSession implements SessionBean {
private SessionContext ejbContext;
. . .
// restrict as only way to cache or return the context
public final void setSessionContext( SessionContext ctx ) . . .
protected final SessionContext getSessionContext() . . .
// common helper services
protected void log( String message ) . . .
protected Connection getConnection( String url ) throws SQLException . . .
}
"
"
%
%
&
&
Terminal Client
Presentation
Application
(Sessions)
Domain
(Entities)
Integration
In
te
r-
Tier
D
a
ta
Tr
ansf
er
T
ran
sact
io
n
s
Pe
rs
is
te
nc
e
Ge
n
e
ra
l E
J
B
C
lie
nt
-S
ide
E
J
B
10
19
Copyright © Craig Larman. www.craiglarman.com
" '
( ) ' (*
$ $ $
(+, # $
20
Copyright © Craig Larman. www.craiglarman.com
1
ServiceLocator
- instance : ServiceLocator
- ctx : InitialContext
- ejbHomes : Map of EJBHome
- queueFactory : QueueConnectionFactory
- topicFactory : TopicConnectionFactory
+ getInstance() : ServiceLocator
- «constructor» ServiceLocator()
«EJB Services»
+ getEJBHome( homeType : Class ) : EJBHome
+ getBean( handleID : String ) : EJBObject
+ getHandleID( EJBObject ) : String
«JMS Services»
+ getQueueConnectionFactory() : QueueConnectionFactory
+ getTopicConnectionFactory() : TopicConnectionFactory
or "ServiceFactory"
Correct UML way to
indicate Singleton use in the
class diagram.
(very few know this UML
tidbit)
// plus exception handling...
{
ctx = new InitialContext(
System.getProperties() );
}
11
21
Copyright © Craig Larman. www.craiglarman.com
class MyClient {
public void foo() {
ForumServicesHome forumServicesHome =
(ForumServicesHome) ServiceLocator.getInstance().
getEJBHome(ForumServicesHome.class );
IForumServices forumServices = forumServicesHome.create();
forumServices.createForum( "J2EE and JMS" );
}
}
22
Copyright © Craig Larman. www.craiglarman.com
class ServiceLocator {
public EJBObject getBean( String handleID ) {
try {
byte[ ] bytes = handleID.getBytes();
InputStream is = new ByteArrayInputStream( bytes );
ObjectInputStream = ois = new ObjectInputStream( is );
Handle handle = (Handle) ois.readObject();
return handle.getEJBObject();
}
. . .
}
}
12
23
Copyright © Craig Larman. www.craiglarman.com
!!
" #$ % &
(- % . / 0
& ! " #$'
. 1 (!) $'
24
Copyright © Craig Larman. www.craiglarman.com
" #$ "()* ! +
%! %
,! !+-
. /()0
13
25
Copyright © Craig Larman. www.craiglarman.com
// web.xml
<ejb-ref>
<ejb-ref-name> com.foo.forumapp.ForumServicesHome </ejb-ref-name>
<ejb-ref-type> Session </ejb-ref-type>
<home> com.foo.forumapp.ForumServicesHome </home>
<remote> com.foo.forumapp.IForumServices </remote>
</ejb-ref>
// weblogic.xml
<reference-descriptor>
<ejb-ref-name> com.foo.forumapp.ForumServicesHome </ejb-ref-name>
<jndi-name> ForumServicesHomeActualJNDIKey </ jndi-name >
</reference-descriptor >
26
Copyright © Craig Larman. www.craiglarman.com
//
"java:comp/env/ejb/" is used for all JNDI lookups that have been made
// available in the environment
class ServiceLocator {
public EJBHome getEJBHome( Class homeType ) {
try {
Object ref = ctx.lookup("java:comp/env/ejb/" + homeType.getName() );
return (EJBHome) PortableRemoteObject.narrow( ref, homeType );
}
. . .
}
}
14
27
Copyright © Craig Larman. www.craiglarman.com
1 +$ ,- ! %
%'
#$ 2 "( ,!
/! / "('-
3 +$4
+$ %) !
28
Copyright © Craig Larman. www.craiglarman.com
5657 7
2 )
'
(
This name
captures the core
pattern applied in
many contexts
15
29
Copyright © Craig Larman. www.craiglarman.com
"
"
!
"! !
!
! #!! $
%! ! ! !&
!
30
Copyright © Craig Larman. www.craiglarman.com
"
"
MyServlet
. . .
. . .
ForumServices
forumServices : IForumServices
handle : javax.ejb.Handle
. . .
createForum( String ) {guarded}
. . .
«interface»
IForumServicesBase
createForum( String )
. . .
«interface»
EJBObject
1
ServiceLocator
HttpServlet
«interface»
IForumServices
1
«interface»
Serializable
probably stored in the
ServletSession
16
31
Copyright © Craig Larman. www.craiglarman.com
"
"
Also supports Convert Exceptions.
class ForumServices implements IForumServicesBase, Serializable {
private IForumServices forumServices;
. . .
public void synchronized createForum( String forumName ) {
try {
forumServices.createForum( forumName );
}
catch( RemoteException ex ) {
// crack open and throw appropriate ForumException. . .
if ( . . . ) throw new DuplicateForumNameException( . . . );
}
32
Copyright © Craig Larman. www.craiglarman.com
"
"
Notes on Java interface implementation:
interface IForumServicesBase {
public void createForum ( String forumName ) throws RemoteException;
}
class ForumServices implements IForumServicesBase {
// legal to add “synchronized” and remove “throws”
public void synchronized createForum( String forumName ) {
}
17
33
Copyright © Craig Larman. www.craiglarman.com
"
"
(
(
org.apache.struts
action
1
ActionServlet
doGet(...)
doPost(...)
process(...)
processXXX(...)
...
Action
perform(ActionForm, ...): ActionForward
...
URI pattern
1
MyPresentationSubsystem
JSPServlet1
doGet(...)
doPost(...)
...
JSPServlet2
doGet(...)
doPost(...)
...
CreateForumAction
perform(...): ActionForward
...
ForumServices
createForum(. . .)
. . .
34
Copyright © Craig Larman. www.craiglarman.com
"
"
18
Terminal Client
Presentation
Application
(Sessions)
Domain
(Entities)
Integration
In
te
r-
Tier
D
a
ta
Tr
ansf
er
T
ran
sact
io
n
s
Pe
rs
is
te
nc
e
Ge
n
e
ra
l E
J
B
C
lie
nt
-S
ide
E
J
B
36
Copyright © Craig Larman. www.craiglarman.com
) ""
) ""
19
37
Copyright © Craig Larman. www.craiglarman.com
!
!
"
"
class CommandControllerServlet extends HttpServlet {
// called from doGet and doPost
protected void processRequest(
HttpServletRequest request, HttpServletResponse response ) {
Command cmd = CommandFactory.getInstance().getNewCommand(
request.getParameter( "op" ) );
resultPage = cmd.execute( request, response );
}
. . .
38
Copyright © Craig Larman. www.craiglarman.com
!
!
"#
"#
org.apache.struts
action
1
ActionServlet
+doGet(...)
+doPost(...)
#process(...)
#processActionCreate(...)
#processActionPerform(...)
#processXXX(...)
...
Action
+perform(ActionForm, ...): ActionForward
...
MyPresentationSubsystem
MyAction1
+perform(...): ...
...
ActionForm
...
MyActionForm1
+getZipCode(): String
+setZipCode(String)
...
Template
Method
pattern
Hook
methods
Invoke the
process
template
method
1
HttpRequest
20
*"
*"
Terminal Client
Presentation
Application
(Sessions)
Domain
(Entities)
Integration
In
te
r-
Tier
D
a
ta
Tr
ansf
er
T
ran
sact
io
n
s
Pe
rs
is
te
nc
e
Ge
n
e
ra
l E
J
B
C
lie
nt
-S
ide
E
J
B
40
Copyright © Craig Larman. www.craiglarman.com
*"
*"
$
%&
# ' ( )
* ()
21
41
Copyright © Craig Larman. www.craiglarman.com
)
)
+
+
&
&
+ ,
#
# #
-. /
42
Copyright © Craig Larman. www.craiglarman.com
)
)
+
+
&
&
: TraderSession
: Object
buy( total, order )
IAccountEntity
b := getBalance()
: Object
IBuyerSession
[total < b] buy( order )
SessionBean
ITraderSessionBase
22
43
Copyright © Craig Larman. www.craiglarman.com
)
)
+
+
&
&
: TransferSession
: Object
transfer( amt, acct1, acct2 )
IWithdrawSession
withdraw(amt, acct1)
: Object
IDepositSession
deposit(amt, acct2)
SessionBean
ITransferSessionBase
44
Copyright © Craig Larman. www.craiglarman.com
)
)
+
+
&
&
(
(
" #$
" #$
class TraderSession implements ITraderSessionBase, SessionBean {
private AccountLocalHome acctHome;
public void buy( . . . ) {
try {
initializeHomes();
IAccount acct = acctHome.findByPrimaryKey( . . . );
Money balance = acct.getBalance();
. . .
}
}
private void initializeHomes( . . . ) {
try {
acctHome = (AccountLocalHome) ServiceLocator.getInstance().
getEJBHome( AccountLocalHome.class );
}
. . .
23
45
Copyright © Craig Larman. www.craiglarman.com
)
)
+
+
&
&
(
(
,
,
!"
#
46
Copyright © Craig Larman. www.craiglarman.com
)
)
+
+
&
&
" % -
" 0
-
0
&
24
47
Copyright © Craig Larman. www.craiglarman.com
- )
- )
+
+
&
&
1
" 0/
!
48
Copyright © Craig Larman. www.craiglarman.com
- )
- )
+
+
&
&
"
# $ %
!
' 23"
#
!
25
49
Copyright © Craig Larman. www.craiglarman.com
- )
- )
+
+
&
&
:Server
«process»
:JVM
: Object
1: t := isValidID(patronID)
2 * : borrowResource(callNum)
3: complete()
All system operations for the "Borrow Library Resources" use
case are handled by the same stateful SessionBean.
IBorrowResources
Session
50
Copyright © Craig Larman. www.craiglarman.com
- )
- )
+
+
&
&
&
#
"
#
! " !
# $
" 4
# (#) #
#
26
51
Copyright © Craig Larman. www.craiglarman.com
. )&
. )&
+ & -.
&/
52
Copyright © Craig Larman. www.craiglarman.com
. )&
. )&
ReserveSeatMDB
. . .
onMessage()
«interface»
MessageDrivenBean
ejbRemove()
setMessageDrivenContext(...)
1
ServiceLocator
«interface»
IAirline
. . .
«interface»
MessageListener
onMessage( Message )
«interface»
IFlight
. . .
27
53
Copyright © Craig Larman. www.craiglarman.com
5
5
0
0
!
!
# *
# *
MyServlet
. . .
. . .
AirlineServices
. . .
reserveSeat(...)
. . .
1
ServiceLocator
HttpServlet
JMS
:Server
ReserveSeatMDB
onMessage(...)
. . .
:Client
54
Copyright © Craig Larman. www.craiglarman.com
. )&
. )&
28
Terminal Client
Presentation
Application
(Sessions)
Domain
(Entities)
Integration
In
te
r-
Tier
D
a
ta
Tr
ansf
er
T
ran
sact
io
n
s
Pe
rs
is
te
nc
e
Ge
n
e
ra
l E
J
B
C
lie
nt
-S
ide
E
J
B
56
Copyright © Craig Larman. www.craiglarman.com
/
/
%
,
#
6# /
!
29
57
Copyright © Craig Larman. www.craiglarman.com
/
/
" 0
7
# %
! !
##&#! #
'(
58
Copyright © Craig Larman. www.craiglarman.com
/
/
Use local interfaces for other sessions and
especially entities.
class TraderSession implements ITraderSessionBase, SessionBean {
private AccountLocalHome acctHome;
. . .
}
private void initializeHomes( . . . ) {
try {
acctHome = (AccountLocalHome) ServiceLocator.getInstance().
getEJBHome( AccountLocalHome.class );
}
. . .
30
59
Copyright © Craig Larman. www.craiglarman.com
" % -
" % -
!
!
6#
6#
' () *
) ')
+
!
60
Copyright © Craig Larman. www.craiglarman.com
" % -
" % -
!
!
6#
6#
,+ )
*
$!)! -./&
0% '
!
31
61
Copyright © Craig Larman. www.craiglarman.com
" % -
" % -
!
!
6#
6#
62
Copyright © Craig Larman. www.craiglarman.com
" % -
" % -
!
!
6#
6#
32
63
Copyright © Craig Larman. www.craiglarman.com
/
/
.* 3
* 14
-
*1 -
64
Copyright © Craig Larman. www.craiglarman.com
) #&*+ ,$- ,$- ." ( .$
/ ( 0
(" !&(
# # #
1%# %2 #%$
.!%$$$
%(% 3$
4' #(%%($$$
33
65
Copyright © Craig Larman. www.craiglarman.com
A_EB
B
C
D
H_EB
I
J
Entity Beans
"Regular" Java objects
A
H
*
1
1
*
1
1
1
EntityBean
EntityBean
66
Copyright © Craig Larman. www.craiglarman.com
-
-
!
!
* 14
* 14
AccountEntity
PhoneNumber
Address
Account
*
1
EntityBean
Person
1
Name
1
Contract
1
*
AccountEntity
PhoneNumber
Address
*
1
EntityBean
Person
Name
1
Contract
1
*
PersonEntity
1
EntityBean
Account
personPK
If Person only exists as long as
the account exists--depends on
business rules.
Asset
*
Asset
*
34
67
Copyright © Craig Larman. www.craiglarman.com
-
-
!
!
-. 89 5
-. 89 5
! "
#$% #%
!
&
68
Copyright © Craig Larman. www.craiglarman.com
-
-
!
!
"## :
"## :
AccountEntity
1
EntityBean
Contract
1
Account
...
Asset
*
EntityBean
Contract
1
AccountEntity
...
Asset
*
Bridge pattern variation.
AccountEntity is the Bridge Abstraction.
Account is the Bridge Implementor.
35
69
Copyright © Craig Larman. www.craiglarman.com
-
-
!
!
3
3
!
!
AccountEntity
Address
1
EntityBean
Person
Name
1
Contract
1
*
PersonEntity
1
EntityBean
Account
personPK
Asset
*
70
Copyright © Craig Larman. www.craiglarman.com
-
-
!
!
-. ;; "#
-. ;; "#
#'
('% )*+ , --
#. (
%
. ( +/
( .
36
71
Copyright © Craig Larman. www.craiglarman.com
-
-
!
!
0
1
:# , ,
72
Copyright © Craig Larman. www.craiglarman.com
-
-
!
!
1
1
Asset
descrip
...
AccountEntity
// promoted operations ( LOD )
setAssetDescription(...)
setContractDate(...)
// group setter. (serialized data).
// Implement with Reflection.
setData( keyValuePairs )
// set child objects (serialized)
setAsset( Asset )
setContract( Contract )
// entire graph (serialized)
getGraph() : Account
setGraph( Account )
Contract
date
...
Account
personPK
...
EntityBean
1
*
1
37
73
Copyright © Craig Larman. www.craiglarman.com
$ '&
$ '&
2
% #
/
2
<$; * 5 5
-. 89
5 4
74
Copyright © Craig Larman. www.craiglarman.com
$ '&
$ '&
,2
.*
32 4
1 #
#
38
75
Copyright © Craig Larman. www.craiglarman.com
$ '&
$ '&
35
" 0 *
14
6 5
3"
76
Copyright © Craig Larman. www.craiglarman.com
$ '&
$ '&
72
=#
1, *
4 *
> #
- # * #&
3 exact *
1, * #
39
77
Copyright © Craig Larman. www.craiglarman.com
$ '&
$ '&
.8.9 , 9 :2
? 3
78
Copyright © Craig Larman. www.craiglarman.com
%
%
&
&
2
+
/ %
# /
40
79
Copyright © Craig Larman. www.craiglarman.com
%
%
&
&
,2
' "
% -
- #
# 7
80
Copyright © Craig Larman. www.craiglarman.com
*
*
2
" @
&
5 >
.*1 .*
:
(3* 1* ?* )
? #
( )
41
81
Copyright © Craig Larman. www.craiglarman.com
*
*
,2
*1 #
5 .*
( )
82
Copyright © Craig Larman. www.craiglarman.com
*
*
«interface»
IAccountDAO
delete(...)
insert(...)
find(...) : ...
select(...) : List
update(...)
. . .
JDBCAccountDAO
. . .
InMemoryAccountDAO
. . .
42
83
Copyright © Craig Larman. www.craiglarman.com
* 14
* 14
!
!
*1
*1
1
DAOFactory
- instance : DAOFactory
- daos : Map
+ getInstance() : DAOFactory
+ getAccountDAO() : IAccountDAO
+ getCustomerDAO() : ICustomerDAO
. . .
{
if ( in map )
return from map
else
String className = get the property
Class c = Class.forName( className )
IAccountDAO dao = (IAccountDAO) c.newInstance()
save dao in map
return dao
}
84
Copyright © Craig Larman. www.craiglarman.com
* 14
* 14
!
!
' */
' */
! / #(%
3
5
)
* ' 14
43
85
Copyright © Craig Larman. www.craiglarman.com
*
*
5
"
5
"
86
Copyright © Craig Larman. www.craiglarman.com
*
*
.8.9 , 9 :2
44
87
Copyright © Craig Larman. www.craiglarman.com
"
"
2
3 #
88
Copyright © Craig Larman. www.craiglarman.com
"
"
,2
-. 89
1
*1 >
" 0
45
#
#
%
%
0
0
0$
0$
Terminal Client
Presentation
Application
(Sessions)
Domain
(Entities)
Integration
In
te
r-
Tier
D
a
ta
Tr
ansf
er
T
ran
sact
io
n
s
Pe
rs
is
te
nc
e
Ge
n
e
ra
l E
J
B
C
lie
nt
-S
ide
E
J
B
90
Copyright © Craig Larman. www.craiglarman.com
0$
0$
2
+
& #
/
46
91
Copyright © Craig Larman. www.craiglarman.com
0$
0$
,2
.
# #
92
Copyright © Craig Larman. www.craiglarman.com
0$
0$
.
! ?
'
47
93
Copyright © Craig Larman. www.craiglarman.com
0$
0$
;
", ! 3
,
*'1
94
Copyright © Craig Larman. www.craiglarman.com
0$
0$
OrderDTO
+ number
+ submissionDate
+ fulfillmentDate
. . .
OrderDTO
- number
- submissionDate
- fulfillmentDate
. . .
getNew( . . . ) : OrderDTO
getNumber()
getSubmissionDate()
. . .
Serializable
Serializable
The Immutable DTO variant
48
95
Copyright © Craig Larman. www.craiglarman.com
* ' 14
* ' 14
!
!
# *'1
# *'1
<5
?
' #
# (
5+)
96
Copyright © Craig Larman. www.craiglarman.com
* ' 14
* ' 14
!
!
# *'1
# *'1
= 9
>
(
)*+
?
49
97
Copyright © Craig Larman. www.craiglarman.com
* ' 14
* ' 14
!
!
# *'1
# *'1
# *'1
OrderDTO o = oldDTO.getNew( newData1, newData2 );
98
Copyright © Craig Larman. www.craiglarman.com
* ' 14
* ' 14
!
!
# *'1
# *'1
OrderDTO o = oldDTO.getNew( newData1, newData2 );
50
99
Copyright © Craig Larman. www.craiglarman.com
* ' 14
* ' 14
!
!
:
:
> 2
*'1
" 6#
4 (
)
100
Copyright © Craig Larman. www.craiglarman.com
* ' 14
* ' 14
!
!
:
:
:)"
"
try { OrderValues o = new OrderValues ( . . . ) ; }
catch ( ValidationException ex ) { . . . }
51
101
Copyright © Craig Larman. www.craiglarman.com
* ' 14
* ' 14
!
!
:
:
=
-
102
Copyright © Craig Larman. www.craiglarman.com
0$
0$
3 0>@5
*1 ##
*1 *'1 *1
' *'1 ! #
52
103
Copyright © Craig Larman. www.craiglarman.com
0$
0$
. 0>@
5
A
104
Copyright © Craig Larman. www.craiglarman.com
0$
0$
3
" # ( '"")
*'1
#
#
'
-. 89
6# 5
#
53
105
Copyright © Craig Larman. www.craiglarman.com
0$
0$
.8.
:# 14
14
3 14
" +
* 14
? ", 14
* ' 14
%B
106
Copyright © Craig Larman. www.craiglarman.com
0 .
0 .
2
*'1 # 6#
*'1
#
*'1
54
107
Copyright © Craig Larman. www.craiglarman.com
0 .
0 .
,2
' 5 ( +5)
108
Copyright © Craig Larman. www.craiglarman.com
0 .
0 .
.2
-
1 4
0 72
?
& 6#
55
109
Copyright © Craig Larman. www.craiglarman.com
*'1 5
*'1 5
!
!
" C
" C
class Keys implements Serializable {
public static final String ORDER_ID = "ID";
. . .
}
. . .
Object value = dtoMap.get( Keys.ORDER_ID );
110
Copyright © Craig Larman. www.craiglarman.com
"
"
2
+ 5
5 #/
56
111
Copyright © Craig Larman. www.craiglarman.com
"
"
AccountEntity
- ctx : EntityContext
«accessors»
+ getBalance() : Money
+ setBalance( Money )
. . .
«ejb supporting»
+ ejbCreate(...)
. . .
«business»
+ deposit(. . .)
. . .
AccountBMPEntity
- balance
. . .
«accessors»
+ getBalance() : Money
+ setBalance( Money )
. . .
«ejb supporting»
+ ejbCreate(...)
. . .
«finders»
+ ejbFindByPrimaryKey(. . .)
. . .
EntityBean
112
Copyright © Craig Larman. www.craiglarman.com
--# $
--# $
2
< #6# &
< * & @
*
% #
(* &
4 D)
57
113
Copyright © Craig Larman. www.craiglarman.com
--# $
--# $
,2
# #6# * (;E @ F8
) *
114
Copyright © Craig Larman. www.craiglarman.com
--# $
--# $
0 -A2 " B
,>
0 C-D2 " B
!
0 -EF2 "
,G @(
0 HB2 B
(,<
58
115
Copyright © Craig Larman. www.craiglarman.com
--# $
--# $
private int timeLow; //32 bits
private String hexInetAddress; //32 bits
private String thisHashCode; // 32 bits
private String midValue;
public void initialize() {
// initalise the secure random instance
seeder = new SecureRandom();
// get the inet address
InetAddress inet = InetAddress.getLocalHost();
byte [ ] bytes = inet.getAddress();
hexInetAddress = hexFormat( getInt( bytes ), 8 );
// get the hashcode
thisHashCode = hexFormat( hashCode(), 8 );
116
Copyright © Craig Larman. www.craiglarman.com
--# $
--# $
//...-xxxx-xxxx-xxxx-xxxx.. mid part of the sequence
StringBuffer buffer = new StringBuffer();
buffer.append("-");
buffer.append(hexInetAddress.substring(0,4));
buffer.append("-");
buffer.append(hexInetAddress.substring(4));
buffer.append("-");
buffer.append(thisHashCode.substring(0,4));
buffer.append("-");
buffer.append(thisHashCode.substring(4));
midValue = buffer .toString();
}
59
117
Copyright © Craig Larman. www.craiglarman.com
--# $
--# $
public String getUUID()
{
long timeNow = System.currentTimeMillis();
timeLow = (int) timeNow & 0xFFFFFFFF;
int node = seeder.nextInt();
return
(hexFormat(timeLow, 8) + midValue + hexFormat(node, 8));
}
60
119
Copyright © Craig Larman. www.craiglarman.com
! I-+ 4,0
-CCA- J
3/ )*+5
3 5
, *0@ 5
120
Copyright © Craig Larman. www.craiglarman.com
#$
#$