1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: WeakReference.java,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 package com
.sun
.star
.uno
;
33 import com
.sun
.star
.uno
.XWeak
;
34 import com
.sun
.star
.uno
.UnoRuntime
;
35 import com
.sun
.star
.uno
.XAdapter
;
36 import com
.sun
.star
.uno
.XReference
;
38 /** This class holds weak reference to an object. It actually holds a reference to a
39 com.sun.star.XAdapter implementation and obtains a hard reference if necessary.
41 public class WeakReference
43 private final boolean DEBUG
= false;
44 private OWeakRefListener m_listener
;
45 // There is no default constructor. Every instance must register itself with the
46 // XAdapter interface, which is done in the constructors. Assume we have this code
47 // WeakReference ref= new WeakReference();
48 // ref = someOtherWeakReference;
50 // ref would not be notified (XReference.dispose()) because it did not register
51 // itself. Therefore the XAdapter would be kept aliver although this is not
54 /** Creates an instance of this class.
55 *@param obj - another instance that is to be copied
57 public WeakReference(WeakReference obj
)
61 Object weakImpl
= obj
.get();
64 XWeak weak
= UnoRuntime
.queryInterface(XWeak
.class, weakImpl
);
67 XAdapter adapter
= (XAdapter
) weak
.queryAdapter();
69 m_listener
= new OWeakRefListener(adapter
);
75 /** Creates an instance of this class.
76 *@param obj XWeak implementation
78 public WeakReference(Object obj
)
80 XWeak weak
= UnoRuntime
.queryInterface(XWeak
.class, obj
);
83 XAdapter adapter
= (XAdapter
) weak
.queryAdapter();
85 m_listener
= new OWeakRefListener(adapter
);
88 /** Returns a hard reference to the object that is kept weak by this class.
89 *@return a hard reference to the XWeak implementation.
93 if (m_listener
!= null)
94 return m_listener
.get();
99 /** Implementation of com.sun.star.uno.XReference for use with WeakReference.
100 * It keeps the XAdapter implementation and registers always with it. Deregistering
101 * occurs on notification by the adapter and the adapter is released.
103 class OWeakRefListener
implements XReference
105 private final boolean DEBUG
= false;
106 private XAdapter m_adapter
;
108 /** The constructor registered this object with adapter.
109 *@param adapter the XAdapter implementation.
111 OWeakRefListener( XAdapter adapter
)
114 m_adapter
.addReference(this);
116 /** Method of com.sun.star.uno.XReference. When called, it deregisteres this
117 * object with the adapter and releases the reference to it.
119 synchronized public void dispose()
121 if (m_adapter
!= null)
123 m_adapter
.removeReference(this);
128 /** Obtains a hard reference to the object which is kept weak by the adapter
130 * @return hard reference to the otherwise weakly kept object.
132 synchronized Object
get()
135 if (m_adapter
!= null)
137 retVal
= m_adapter
.queryAdapted();
140 // If this object registered as listener with XAdapter while it was notifying
141 // the listeners then this object might not have been notified. If queryAdapted
142 // returned null then the weak kept object is dead and the listeners have already
143 // been notified. And we missed it.
144 m_adapter
.removeReference(this);