1 package org
.argeo
.osgi
.useradmin
;
3 import java
.util
.HashMap
;
6 import javax
.transaction
.xa
.XAException
;
7 import javax
.transaction
.xa
.XAResource
;
8 import javax
.transaction
.xa
.Xid
;
10 /** {@link XAResource} for a user directory being edited. */
11 class WcXaResource
implements XAResource
{
12 private final AbstractUserDirectory userDirectory
;
14 private Map
<Xid
, UserDirectoryWorkingCopy
> workingCopies
= new HashMap
<Xid
, UserDirectoryWorkingCopy
>();
15 private Xid editingXid
= null;
16 private int transactionTimeout
= 0;
18 public WcXaResource(AbstractUserDirectory userDirectory
) {
19 this.userDirectory
= userDirectory
;
23 public synchronized void start(Xid xid
, int flags
) throws XAException
{
24 if (editingXid
!= null)
25 throw new UserDirectoryException("Already editing " + editingXid
);
26 UserDirectoryWorkingCopy wc
= workingCopies
.put(xid
, new UserDirectoryWorkingCopy());
28 throw new UserDirectoryException("There is already a working copy for " + xid
);
29 this.editingXid
= xid
;
33 public void end(Xid xid
, int flags
) throws XAException
{
37 private UserDirectoryWorkingCopy
wc(Xid xid
) {
38 return workingCopies
.get(xid
);
41 synchronized UserDirectoryWorkingCopy
wc() {
42 if (editingXid
== null)
44 UserDirectoryWorkingCopy wc
= workingCopies
.get(editingXid
);
46 throw new UserDirectoryException("No working copy found for " + editingXid
);
50 private synchronized void cleanUp(Xid xid
) {
52 workingCopies
.remove(xid
);
57 public int prepare(Xid xid
) throws XAException
{
59 UserDirectoryWorkingCopy wc
= wc(xid
);
60 if (wc
.noModifications())
63 userDirectory
.prepare(wc
);
64 } catch (Exception e
) {
66 throw new XAException(XAException
.XAER_RMERR
);
72 public void commit(Xid xid
, boolean onePhase
) throws XAException
{
75 UserDirectoryWorkingCopy wc
= wc(xid
);
76 if (wc
.noModifications())
79 userDirectory
.prepare(wc
);
80 userDirectory
.commit(wc
);
81 } catch (Exception e
) {
83 throw new XAException(XAException
.XAER_RMERR
);
90 public void rollback(Xid xid
) throws XAException
{
93 userDirectory
.rollback(wc(xid
));
94 } catch (Exception e
) {
96 throw new XAException(XAException
.XAER_RMERR
);
103 public void forget(Xid xid
) throws XAException
{
104 throw new UnsupportedOperationException();
108 public boolean isSameRM(XAResource xares
) throws XAException
{
109 return xares
== this;
113 public Xid
[] recover(int flag
) throws XAException
{
118 public int getTransactionTimeout() throws XAException
{
119 return transactionTimeout
;
123 public boolean setTransactionTimeout(int seconds
) throws XAException
{
124 transactionTimeout
= seconds
;
128 private void checkXid(Xid xid
) throws XAException
{
130 throw new XAException(XAException
.XAER_OUTSIDE
);
131 if (!xid
.equals(xid
))
132 throw new XAException(XAException
.XAER_NOTA
);