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
) {
65 throw new XAException(XAException
.XAER_RMERR
);
71 public void commit(Xid xid
, boolean onePhase
) throws XAException
{
74 UserDirectoryWorkingCopy wc
= wc(xid
);
75 if (wc
.noModifications())
78 userDirectory
.prepare(wc
);
79 userDirectory
.commit(wc
);
80 } catch (Exception e
) {
81 throw new XAException(XAException
.XAER_RMERR
);
88 public void rollback(Xid xid
) throws XAException
{
91 userDirectory
.rollback(wc(xid
));
92 } catch (Exception e
) {
93 throw new XAException(XAException
.XAER_RMERR
);
100 public void forget(Xid xid
) throws XAException
{
101 throw new UnsupportedOperationException();
105 public boolean isSameRM(XAResource xares
) throws XAException
{
106 return xares
== this;
110 public Xid
[] recover(int flag
) throws XAException
{
115 public int getTransactionTimeout() throws XAException
{
116 return transactionTimeout
;
120 public boolean setTransactionTimeout(int seconds
) throws XAException
{
121 transactionTimeout
= seconds
;
125 private void checkXid(Xid xid
) throws XAException
{
127 throw new XAException(XAException
.XAER_OUTSIDE
);
128 if (!xid
.equals(xid
))
129 throw new XAException(XAException
.XAER_NOTA
);