1 28 29 package com.caucho.ejb.burlap; 30 31 import com.caucho.config.ConfigException; 32 import com.caucho.ejb.AbstractServer; 33 import com.caucho.ejb.message.MessageServer; 34 import com.caucho.ejb.protocol.HandleEncoder; 35 import com.caucho.ejb.protocol.ProtocolContainer; 36 import com.caucho.ejb.protocol.Skeleton; 37 import com.caucho.hessian.io.HessianRemoteResolver; 38 import com.caucho.util.L10N; 39 import com.caucho.util.Log; 40 41 import javax.ejb.EJBHome ; 42 import javax.ejb.EJBObject ; 43 import java.util.ArrayList ; 44 import java.util.HashMap ; 45 import java.util.logging.Logger ; 46 51 public class BurlapProtocol extends ProtocolContainer { 52 private static final L10N L = new L10N(BurlapProtocol.class); 53 private static final Logger log = Log.open(BurlapProtocol.class); 54 55 private Class _objectSkelClass; 56 private Class _homeSkelClass; 57 58 private HashMap <AbstractServer,Class > _homeSkeletonMap = 59 new HashMap <AbstractServer,Class >(); 60 61 private HashMap <AbstractServer,Class > _objectSkeletonMap = 62 new HashMap <AbstractServer,Class >(); 63 64 private HashMap <String ,AbstractServer> _serverMap = 65 new HashMap <String ,AbstractServer>(); 66 67 private HessianRemoteResolver _resolver; 68 69 72 public BurlapProtocol() 73 { 74 _resolver = new BurlapStubFactory(); 75 } 76 77 public String getName() 78 { 79 return "burlap"; 80 } 81 82 85 public void addServer(AbstractServer server) 86 { 87 log.finer("Burlap[" + server + "] added"); 88 89 _serverMap.put(server.getProtocolId(), server); 90 } 91 92 95 public void removeServer(AbstractServer server) 96 { 97 _serverMap.remove(server.getProtocolId()); 98 } 99 100 protected HandleEncoder createHandleEncoder(AbstractServer server, 101 Class primaryKeyClass) 102 throws ConfigException 103 { 104 return new BurlapHandleEncoder(server, 105 getURLPrefix() + server.getProtocolId(), 106 primaryKeyClass); 107 } 108 109 112 public Skeleton getSkeleton(String uri, String queryString) 113 throws Exception 114 { 115 String serverId = uri; 116 String objectId = null; 117 118 if (queryString != null) { 120 int p = queryString.indexOf('='); 121 122 if (p >= 0) 123 objectId = queryString.substring(p + 1); 124 else 125 objectId = queryString; 126 } 127 128 AbstractServer server = getProtocolManager().getServerByEJBName(serverId); 129 130 if (server == null) { 131 ArrayList children = getProtocolManager().getRemoteChildren(serverId); 132 133 if (children != null && children.size() > 0) 134 return new NameContextSkeleton(this, serverId); 135 else 136 return null; 145 } 146 else if (objectId != null) { 147 Object key = server.getHandleEncoder("burlap").objectIdToKey(objectId); 148 149 EJBObject obj = server.getContext(key, false).getRemoteView(); 150 151 Class objectSkelClass = getObjectSkelClass(server); 152 153 BurlapSkeleton skel = (BurlapSkeleton) objectSkelClass.newInstance(); 154 skel._setServer(server); 155 skel._setResolver(_resolver); 156 skel._setObject(obj); 157 return skel; 158 } 159 else if (server instanceof MessageServer) { 160 return new MessageSkeleton((MessageServer) server); 161 } 162 else { 163 Object remote = server.getRemoteObject(); 164 165 if (remote instanceof EJBHome ) { 166 Class homeSkelClass = getHomeSkelClass(server); 167 168 BurlapSkeleton skel = (BurlapSkeleton) homeSkelClass.newInstance(); 169 skel._setServer(server); 170 skel._setResolver(_resolver); 171 skel._setObject(remote); 172 173 return skel; 174 } 175 else if (remote instanceof EJBObject ) { 176 Class skelClass = getObjectSkelClass(server); 177 178 BurlapSkeleton skel = (BurlapSkeleton) skelClass.newInstance(); 179 skel._setServer(server); 180 skel._setResolver(_resolver); 181 skel._setObject(remote); 182 183 return skel; 184 } 185 } 186 187 return null; 188 } 189 190 193 public Skeleton getExceptionSkeleton() 194 throws Exception 195 { 196 return new ExceptionSkeleton(); 197 } 198 199 202 protected Class getHomeSkelClass(AbstractServer server) 203 throws Exception 204 { 205 Class homeSkelClass = (Class ) _homeSkeletonMap.get(server); 206 207 if (homeSkelClass != null) 208 return homeSkelClass; 209 210 Class remoteHomeClass = server.getRemoteHomeClass(); 211 212 homeSkelClass = BurlapSkeletonGenerator.generate(remoteHomeClass, 213 getWorkPath()); 214 215 _homeSkeletonMap.put(server, homeSkelClass); 216 217 return homeSkelClass; 218 } 219 220 223 protected Class getObjectSkelClass(AbstractServer server) 224 throws Exception 225 { 226 Class objectSkelClass = (Class ) _objectSkeletonMap.get(server); 227 228 if (objectSkelClass != null) 229 return objectSkelClass; 230 231 Class remoteObjectClass = server.getRemoteObjectClass(); 232 233 objectSkelClass = BurlapSkeletonGenerator.generate(remoteObjectClass, 234 getWorkPath()); 235 236 _objectSkeletonMap.put(server, objectSkelClass); 237 238 return objectSkelClass; 239 } 240 } 241 | Popular Tags |