You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2017/02/19 01:49:44 UTC
[27/51] [abbrv] geronimo-yoko git commit: Better encapsulate
singleton TypeRepository, ValueHandlerImpl
Better encapsulate singleton TypeRepository, ValueHandlerImpl
Project: http://git-wip-us.apache.org/repos/asf/geronimo-yoko/repo
Commit: http://git-wip-us.apache.org/repos/asf/geronimo-yoko/commit/022ef4c0
Tree: http://git-wip-us.apache.org/repos/asf/geronimo-yoko/tree/022ef4c0
Diff: http://git-wip-us.apache.org/repos/asf/geronimo-yoko/diff/022ef4c0
Branch: refs/heads/master
Commit: 022ef4c06ba0da210f3a34dde3d3610c00940441
Parents: 431478f
Author: Neil GM Richards <ne...@uk.ibm.com>
Authored: Sat Mar 26 22:00:27 2016 +0000
Committer: Neil GM Richards <ne...@uk.ibm.com>
Committed: Sat Mar 26 22:00:27 2016 +0000
----------------------------------------------------------------------
.../yoko/rmi/impl/PortableRemoteObjectImpl.java | 2 +-
.../org/apache/yoko/rmi/impl/RMIServant.java | 2 +-
.../java/org/apache/yoko/rmi/impl/RMIState.java | 23 +-----------
.../java/org/apache/yoko/rmi/impl/RMIStub.java | 2 +-
.../org/apache/yoko/rmi/impl/StubBuilder.java | 2 +-
.../apache/yoko/rmi/impl/TypeRepository.java | 24 +++++++++----
.../java/org/apache/yoko/rmi/impl/UtilImpl.java | 7 ++--
.../apache/yoko/rmi/impl/ValueHandlerImpl.java | 37 ++++++++++++++------
8 files changed, 52 insertions(+), 47 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/022ef4c0/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/PortableRemoteObjectImpl.java
----------------------------------------------------------------------
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/PortableRemoteObjectImpl.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/PortableRemoteObjectImpl.java
index e7ae51d..c3815b2 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/PortableRemoteObjectImpl.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/PortableRemoteObjectImpl.java
@@ -298,7 +298,7 @@ public class PortableRemoteObjectImpl implements PortableRemoteObjectDelegate {
return cons;
}
- TypeRepository repository = state.getTypeRepository();
+ TypeRepository repository = state.repo;
RemoteDescriptor desc = (RemoteDescriptor) repository.getRemoteInterface(type);
MethodDescriptor[] mdesc = desc.getMethods();
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/022ef4c0/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIServant.java
----------------------------------------------------------------------
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIServant.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIServant.java
index 7653afd..e18b395 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIServant.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIServant.java
@@ -178,7 +178,7 @@ public class RMIServant extends org.omg.PortableServer.Servant implements
throw new IllegalArgumentException();
}
- _descriptor = _state.getTypeRepository().getRemoteInterface(target.getClass()).getRemoteInterface();
+ _descriptor = _state.repo.getRemoteInterface(target.getClass()).getRemoteInterface();
if (_descriptor == null) {
throw new RuntimeException("remote classes not supported");
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/022ef4c0/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIState.java
----------------------------------------------------------------------
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIState.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIState.java
index 0693d5f..e6f2282 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIState.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIState.java
@@ -51,7 +51,7 @@ public class RMIState implements PortableRemoteObjectState {
private String _name;
- private TypeRepository _typerepository;
+ final TypeRepository repo = TypeRepository.get();
private POA poa;
@@ -59,13 +59,6 @@ public class RMIState implements PortableRemoteObjectState {
return poa;
}
- TypeRepository getTypeRepository() {
- if (_typerepository == null)
- _typerepository = new TypeRepository(_orb);
-
- return _typerepository;
- }
-
RMIState(org.omg.CORBA.ORB orb, String name) {
if (orb == null) {
throw new NullPointerException("ORB is null");
@@ -133,18 +126,6 @@ public class RMIState implements PortableRemoteObjectState {
return ref._get_delegate();
}
- ValueHandler valueHandler;
-
- public ValueHandler createValueHandler() {
- checkShutDown();
-
- if (valueHandler == null) {
- valueHandler = new ValueHandlerImpl(getTypeRepository());
- }
-
- return valueHandler;
- }
-
static RMIState current() {
return (RMIState) PortableRemoteObjectExt.getState();
}
@@ -190,8 +171,6 @@ public class RMIState implements PortableRemoteObjectState {
}
void clearState() {
- _typerepository = null;
- valueHandler = null;
stub_map = null;
tie_map = null;
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/022ef4c0/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStub.java
----------------------------------------------------------------------
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStub.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStub.java
index db41e66..98f61a0 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStub.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/RMIStub.java
@@ -39,7 +39,7 @@ public abstract class RMIStub extends javax.rmi.CORBA.Stub {
Class remote_interface = getClass().getInterfaces()[0];
RMIState state = (RMIState) PortableRemoteObjectExt.getState();
- Object o = state.getTypeRepository().getRemoteInterface(
+ Object o = state.repo.getRemoteInterface(
remote_interface);
_descriptor = (RemoteDescriptor) o;
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/022ef4c0/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/StubBuilder.java
----------------------------------------------------------------------
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/StubBuilder.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/StubBuilder.java
index ad85fcc..8fc509d 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/StubBuilder.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/StubBuilder.java
@@ -45,7 +45,7 @@ public class StubBuilder {
Set pending = new HashSet();
ArrayList result = new ArrayList();
- TypeRepository rep = new TypeRepository(null);
+ TypeRepository rep = TypeRepository.get();
Iterator it = interfaces.iterator();
while (it.hasNext()) {
Class cl = (Class) it.next();
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/022ef4c0/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeRepository.java
----------------------------------------------------------------------
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeRepository.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeRepository.java
index 1ba4611..31c2d4f 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeRepository.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeRepository.java
@@ -34,6 +34,7 @@ import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -54,8 +55,6 @@ import org.apache.yoko.rmi.impl.TypeDescriptor.SimpleKey;
public class TypeRepository {
static final Logger logger = Logger.getLogger(TypeRepository.class.getName());
- org.omg.CORBA.ORB orb;
-
private static final class TypeDescriptorCache {
private final ConcurrentMap<WeakKey<FullKey>, WeakReference<TypeDescriptor>> map =
new ConcurrentHashMap<>();
@@ -249,8 +248,7 @@ public class TypeRepository {
return Collections.unmodifiableSet(new HashSet<>(Arrays.asList(types)));
}
- public TypeRepository(org.omg.CORBA.ORB orb) {
- this.orb = orb;
+ private TypeRepository() {
repIdDescriptors = new TypeDescriptorCache();
localDescriptors = new LocalDescriptors(this, repIdDescriptors);
@@ -259,8 +257,22 @@ public class TypeRepository {
}
}
- org.omg.CORBA.ORB getORB() {
- return orb;
+ private static final AtomicReference<WeakReference<TypeRepository>> singletonWeakRef = new AtomicReference<>();
+ public static TypeRepository get() {
+ TypeRepository repo = null;
+ WeakReference<TypeRepository> weakRef = singletonWeakRef.get();
+ if (null != weakRef) {
+ repo = weakRef.get();
+ if (null != repo) return repo;
+ }
+ final TypeRepository newRepo = new TypeRepository();
+ final WeakReference<TypeRepository> newRef = new WeakReference<>(newRepo);
+ while(!!!singletonWeakRef.compareAndSet(weakRef, newRef)) {
+ weakRef = singletonWeakRef.get();
+ repo = weakRef.get();
+ if (null != repo) return repo;
+ }
+ return newRepo;
}
public String getRepositoryID(Class<?> type) {
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/022ef4c0/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/UtilImpl.java
----------------------------------------------------------------------
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/UtilImpl.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/UtilImpl.java
index 8fe5335..d7f2ab0 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/UtilImpl.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/UtilImpl.java
@@ -467,8 +467,7 @@ public class UtilImpl implements UtilDelegate {
}
public ValueHandler createValueHandler() {
- return RMIState.current().createValueHandler();
- // return new ValueHandlerImpl (null);
+ return ValueHandlerImpl.get();
}
public String getCodebase(@SuppressWarnings("rawtypes") Class clz) {
@@ -775,7 +774,7 @@ public class UtilImpl implements UtilDelegate {
* mapSystemException (ex); }
*/
try {
- TypeRepository rep = RMIState.current().getTypeRepository();
+ TypeRepository rep = RMIState.current().repo;
CopyState state = new CopyState(rep);
return state.copy(obj);
} catch (CopyRecursionException ex) {
@@ -806,7 +805,7 @@ public class UtilImpl implements UtilDelegate {
try {
- TypeRepository rep = RMIState.current().getTypeRepository();
+ TypeRepository rep = RMIState.current().repo;
CopyState state = new CopyState(rep);
try {
return (Object[]) state.copy(objs);
http://git-wip-us.apache.org/repos/asf/geronimo-yoko/blob/022ef4c0/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueHandlerImpl.java
----------------------------------------------------------------------
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueHandlerImpl.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueHandlerImpl.java
index 6bfb65a..0ed86c0 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueHandlerImpl.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueHandlerImpl.java
@@ -18,6 +18,8 @@
package org.apache.yoko.rmi.impl;
+import java.lang.ref.WeakReference;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -33,30 +35,43 @@ public class ValueHandlerImpl implements ValueHandler {
static final Logger logger = Logger.getLogger(ValueHandlerImpl.class
.getName());
- TypeRepository repository;
+ private final TypeRepository repo;
RunTimeCodeBaseImpl codeBase;
- private TypeRepository getRepository() {
- return RMIState.current().getTypeRepository(); // repository;
+ private ValueHandlerImpl() {
+ this.repo = TypeRepository.get();
}
- ValueHandlerImpl(TypeRepository rep) {
- this.repository = rep;
+ private static final AtomicReference<WeakReference<ValueHandlerImpl>> singletonWeakRef = new AtomicReference<>();
+ public static ValueHandlerImpl get() {
+ ValueHandlerImpl vh = null;
+ WeakReference<ValueHandlerImpl> weakRef = singletonWeakRef.get();
+ if (null != weakRef) {
+ vh = weakRef.get();
+ if (null != vh) return vh;
+ }
+ final ValueHandlerImpl newVh = new ValueHandlerImpl();
+ final WeakReference<ValueHandlerImpl> newRef = new WeakReference<>(newVh);
+ while(!!!singletonWeakRef.compareAndSet(weakRef, newRef)) {
+ weakRef = singletonWeakRef.get();
+ vh = weakRef.get();
+ if (null != vh) return vh;
+ }
+ return newVh;
}
private ValueDescriptor desc(Class clz) {
- return (ValueDescriptor) getRepository().getDescriptor(clz);
+ return (ValueDescriptor) repo.getDescriptor(clz);
}
private ValueDescriptor desc(String repId) {
- return (ValueDescriptor)getRepository().getDescriptor(repId);
+ return (ValueDescriptor) repo.getDescriptor(repId);
}
private ValueDescriptor desc(Class clz, String repid, RunTime runtime) {
try {
- return (ValueDescriptor) getRepository().getDescriptor(clz, repid,
- runtime);
+ return repo.getDescriptor(clz, repid, runtime);
} catch (ClassNotFoundException ex) {
MARSHAL m = new MARSHAL("class not found " + ex.getMessage());
m.initCause(ex);
@@ -127,7 +142,7 @@ public class ValueHandlerImpl implements ValueHandler {
}
public java.lang.String getRMIRepositoryID(java.lang.Class clz) {
- return getRepository().getDescriptor(clz).getRepositoryID();
+ return repo.getDescriptor(clz).getRepositoryID();
}
@Override
@@ -331,7 +346,7 @@ public class ValueHandlerImpl implements ValueHandler {
}
private void addIfRMIClass(java.util.List list, Class clz) {
- TypeDescriptor desc = getRepository().getDescriptor(clz);
+ TypeDescriptor desc = repo.getDescriptor(clz);
if (desc instanceof RemoteDescriptor)
list.add(desc);