/***************************************************************************** * Copyright [2013] [Jules White] * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * * You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an "AS IS" BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * * limitations under the License. * ****************************************************************************/ package org.magnum.soda; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.WeakHashMap; import java.util.concurrent.ConcurrentHashMap; import org.magnum.soda.msg.LocalAddress; import org.magnum.soda.msg.MetaAddress; import org.magnum.soda.proxy.ObjRef; /** * * This class manages a repository of object references and their mapping to a * set of associated objects. Typically, an ObjRef is paired to a proxy, * although regular objects may also be mapped to an ObjRef. * * @author jules * */ public class DefaultObjRegistry implements ObjRegistry { private Map<String, Object> registry_ = new ConcurrentHashMap<String, Object>(); private WeakHashMap<Object, ObjRef> objRefs_ = new WeakHashMap<Object, ObjRef>(); private Set<String> localObjects_ = new HashSet<String>(); private LocalAddress myAddress_; private final boolean isServer_; public DefaultObjRegistry(LocalAddress myAddress) { this(myAddress, false); } public DefaultObjRegistry(LocalAddress myAddress, boolean isserver) { super(); isServer_ = isserver; myAddress_ = myAddress; } /** * Generally, you should use publish rather than this method. */ @Override public void insert(ObjRef key, Object o) { registry_.put(key.getUri(), o); objRefs_.put(o, key); } @Override public boolean remove(ObjRef key) { if (localObjects_.contains(key.getUri())) { localObjects_.remove(key.getUri()); } return registry_.remove(key.getUri()) != null; } @Override public Object get(ObjRef key) { return registry_.get(key.getUri()); } /** * Publish an object and create a reference to it that can be shared. */ @Override public ObjRef publish(Object o) { ObjRef ref = objRefs_.get(o); if (ref == null) { ref = myAddress_.createObjRef(o); insert(ref, o); localObjects_.add(ref.getUri()); } return ref; } @Override public boolean isLocalObject(ObjRef ref) { return myAddress_.toString().equals(ref.getHost()) || (isServer_ && ref.getHost().startsWith( MetaAddress.META_ADDRESS.toString())); } }