00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 package org.objectweb.proactive.core.body.http;
00032
00033 import java.io.IOException;
00034 import java.security.PublicKey;
00035 import java.security.cert.X509Certificate;
00036 import java.util.ArrayList;
00037
00038 import org.objectweb.proactive.Body;
00039 import org.objectweb.proactive.core.ProActiveException;
00040 import org.objectweb.proactive.core.UniqueID;
00041 import org.objectweb.proactive.core.body.RemoteBody;
00042 import org.objectweb.proactive.core.body.UniversalBody;
00043 import org.objectweb.proactive.core.body.ft.internalmsg.FTMessage;
00044 import org.objectweb.proactive.core.body.http.util.exceptions.HTTPRemoteException;
00045 import org.objectweb.proactive.core.body.http.util.exceptions.HTTPUnexpectedException;
00046 import org.objectweb.proactive.core.body.http.util.messages.BodyRequest;
00047 import org.objectweb.proactive.core.body.http.util.messages.HttpReply;
00048 import org.objectweb.proactive.core.body.http.util.messages.HttpRequest;
00049 import org.objectweb.proactive.core.body.reply.Reply;
00050 import org.objectweb.proactive.core.body.request.Request;
00051 import org.objectweb.proactive.core.component.request.Shortcut;
00052 import org.objectweb.proactive.core.exceptions.NonFunctionalException;
00053 import org.objectweb.proactive.core.exceptions.manager.NFEListener;
00054 import org.objectweb.proactive.core.rmi.ClassServer;
00055 import org.objectweb.proactive.core.runtime.RuntimeFactory;
00056 import org.objectweb.proactive.ext.security.Communication;
00057 import org.objectweb.proactive.ext.security.SecurityContext;
00058 import org.objectweb.proactive.ext.security.crypto.KeyExchangeException;
00059 import org.objectweb.proactive.ext.security.exceptions.RenegotiateSessionException;
00060 import org.objectweb.proactive.ext.security.exceptions.SecurityNotAvailableException;
00061 import org.objectweb.proactive.ext.security.securityentity.Entity;
00062
00063
00074 public class HttpRemoteBodyImpl implements RemoteBody {
00075
00076 static {
00077 try {
00078 RuntimeFactory.getDefaultRuntime();
00079 } catch (ProActiveException e) {
00080 e.printStackTrace();
00081 }
00082 }
00083
00088 protected transient UniversalBody body;
00089 UniqueID bodyID;
00090 String jobID;
00091 String url;
00092 private boolean isLocal;
00093
00094
00095 public HttpRemoteBodyImpl(UniversalBody body) {
00096 isLocal = true;
00097 this.body = body;
00098 this.bodyID = body.getID();
00099 this.url = ClassServer.getUrl();
00100 this.jobID = body.getJobID();
00101 }
00102
00108 public int receiveRequest(Request request)
00109 throws IOException, RenegotiateSessionException {
00110 if (isLocal) {
00111 return body.receiveRequest(request);
00112 } else {
00113 try {
00114 HttpRequest req = new HttpRequest(request, bodyID, this.url);
00115 req.send();
00116 return req.getReturnedObject();
00117 } catch (Exception e) {
00118 e.printStackTrace();
00119 }
00120 return 0;
00121 }
00122 }
00123
00127 public int receiveReply(Reply reply) throws IOException {
00128 if (isLocal) {
00129 return body.receiveReply(reply);
00130 } else {
00131 try {
00132 HttpReply rep = new HttpReply(reply, bodyID, this.url);
00133 rep.send();
00134
00135 return rep.getReturnedObject();
00136 } catch (Exception e) {
00137 e.printStackTrace();
00138 }
00139 return 0;
00140 }
00141 }
00142
00146 public void terminate() throws java.io.IOException {
00147 if (isLocal) {
00148 body.terminate();
00149 } else {
00150 (new BodyRequest("terminate", new ArrayList<Object>(), bodyID, this.url)).send();
00151 }
00152 }
00153
00158 public String getNodeURL() throws HTTPRemoteException {
00159 if (isLocal) {
00160 return body.getNodeURL();
00161 } else {
00162 BodyRequest br = new BodyRequest("getNodeURL", new ArrayList<Object>(),
00163 bodyID, this.url);
00164 br.send();
00165 try {
00166 return (String) br.getReturnedObject();
00167 } catch (Exception e) {
00168 throw new HTTPRemoteException("Unexpected exception", e);
00169 }
00170 }
00171 }
00172
00176 public UniqueID getID() {
00177 return bodyID;
00178 }
00179
00183 public void updateLocation(UniqueID id, UniversalBody body)
00184 throws IOException {
00185 if (isLocal) {
00186 body.updateLocation(id, body);
00187 } else {
00188 ArrayList<Object> paramsList = new ArrayList<Object>();
00189 paramsList.add(id);
00190 paramsList.add(body);
00191 (new BodyRequest("updateLocation", paramsList, bodyID, this.url)).send();
00192 }
00193 }
00194
00198 public void enableAC() throws IOException {
00199 if (isLocal) {
00200 body.enableAC();
00201 } else {
00202 (new BodyRequest("enableAC", new ArrayList<Object>(), bodyID, this.url)).send();
00203 }
00204 }
00205
00209 public void disableAC() throws IOException {
00210 if (isLocal) {
00211 body.disableAC();
00212 } else {
00213 (new BodyRequest("disableAC", new ArrayList<Object>(), bodyID, this.url)).send();
00214 }
00215 }
00216
00220 public void setImmediateService(String methodName)
00221 throws IOException {
00222 if (isLocal) {
00223 body.setImmediateService(methodName);
00224 } else {
00225 ArrayList<Object> paramsList = new ArrayList<Object>();
00226 paramsList.add(methodName);
00227 (new BodyRequest("setImmediateService", paramsList, bodyID, this.url)).send();
00228 }
00229 }
00230
00231 public void setImmediateService(String methodName, Class[] parametersTypes)
00232 throws IOException {
00233 if (isLocal) {
00234 body.setImmediateService(methodName, parametersTypes);
00235 } else {
00236 ArrayList<Object> paramsList = new ArrayList<Object>();
00237 paramsList.add(methodName);
00238 paramsList.add(parametersTypes);
00239 new BodyRequest("setImmediateService", paramsList, bodyID, this.url).send();
00240 }
00241 }
00242
00243 public void removeImmediateService(String methodName,
00244 Class[] parametersTypes) throws IOException {
00245 if (isLocal) {
00246 body.removeImmediateService(methodName, parametersTypes);
00247 } else {
00248 ArrayList<Object> paramsList = new ArrayList<Object>();
00249 paramsList.add(methodName);
00250 paramsList.add(parametersTypes);
00251 new BodyRequest("removeImmediateService", paramsList, bodyID,
00252 this.url).send();
00253 }
00254 }
00255
00259 public void terminateSession(long sessionID)
00260 throws IOException, SecurityNotAvailableException {
00261 if (isLocal) {
00262 body.terminateSession(sessionID);
00263 } else {
00264 ArrayList<Object> paramsList = new ArrayList<Object>();
00265 paramsList.add(new Long(sessionID));
00266 new BodyRequest("terminateSession", paramsList, bodyID, this.url).send();
00267 }
00268 }
00269
00273 public X509Certificate getCertificate()
00274 throws SecurityNotAvailableException, IOException {
00275 if (isLocal) {
00276 return body.getCertificate();
00277 } else {
00278 BodyRequest req = new BodyRequest("getCertificate",
00279 new ArrayList<Object>(), bodyID, this.url);
00280 req.send();
00281 try {
00282 return (X509Certificate) req.getReturnedObject();
00283 } catch (SecurityNotAvailableException ex) {
00284 throw ex;
00285 } catch (Exception e) {
00286 throw new HTTPRemoteException("Unexpected exception", e);
00287 }
00288 }
00289 }
00290
00294 public long startNewSession(Communication policy)
00295 throws SecurityNotAvailableException, IOException,
00296 RenegotiateSessionException {
00297 if (isLocal) {
00298 return body.startNewSession(policy);
00299 } else {
00300 ArrayList<Object> paramsList = new ArrayList<Object>();
00301 paramsList.add(policy);
00302 BodyRequest req = new BodyRequest("startNewSession", paramsList,
00303 bodyID, this.url);
00304 req.send();
00305 try {
00306 return ((Long) req.getReturnedObject()).longValue();
00307 } catch (SecurityNotAvailableException ex) {
00308 throw ex;
00309 } catch (RenegotiateSessionException ex1) {
00310 throw ex1;
00311 } catch (Exception e) {
00312 throw new HTTPUnexpectedException("Unexpected exception", e);
00313 }
00314 }
00315 }
00316
00320 public PublicKey getPublicKey()
00321 throws SecurityNotAvailableException, IOException {
00322 if (isLocal) {
00323 return body.getPublicKey();
00324 } else {
00325 BodyRequest req = new BodyRequest("getPublicKey", new ArrayList<Object>(),
00326 bodyID, this.url);
00327 req.send();
00328
00329 try {
00330 return (PublicKey) req.getReturnedObject();
00331 } catch (SecurityNotAvailableException ex) {
00332 throw ex;
00333 } catch (Exception e) {
00334 throw new HTTPUnexpectedException("Unexpected exception", e);
00335 }
00336 }
00337 }
00338
00342 public byte[] randomValue(long sessionID, byte[] cl_rand)
00343 throws SecurityNotAvailableException, IOException,
00344 RenegotiateSessionException {
00345 if (isLocal) {
00346 return body.randomValue(sessionID, cl_rand);
00347 } else {
00348 ArrayList<Object> paramsList = new ArrayList<Object>();
00349 paramsList.add(new Long(sessionID));
00350 paramsList.add(cl_rand);
00351
00352 BodyRequest req = new BodyRequest("randomValue", paramsList,
00353 bodyID, this.url);
00354 req.send();
00355 try {
00356 return (byte[]) req.getReturnedObject();
00357 } catch (SecurityNotAvailableException ex) {
00358 throw ex;
00359 } catch (RenegotiateSessionException e) {
00360 throw e;
00361 } catch (Exception e) {
00362 throw new HTTPUnexpectedException("Unexpected exception", e);
00363 }
00364 }
00365 }
00366
00370 public byte[][] publicKeyExchange(long sessionID, byte[] my_pub,
00371 byte[] my_cert, byte[] sig_code)
00372 throws SecurityNotAvailableException, IOException, KeyExchangeException,
00373 RenegotiateSessionException {
00374 if (isLocal) {
00375 return body.publicKeyExchange(sessionID, my_pub, my_cert, sig_code);
00376 } else {
00377 ArrayList<Object> paramsList = new ArrayList<Object>();
00378 paramsList.add(new Long(sessionID));
00379 paramsList.add(my_pub);
00380 paramsList.add(my_cert);
00381 paramsList.add(sig_code);
00382
00383 BodyRequest req = new BodyRequest("publicKeyExchange", paramsList,
00384 bodyID, this.url);
00385 req.send();
00386
00387 try {
00388 return (byte[][]) req.getReturnedObject();
00389 } catch (SecurityNotAvailableException ex) {
00390 throw ex;
00391 } catch (RenegotiateSessionException e) {
00392 throw e;
00393 } catch (KeyExchangeException e) {
00394 throw e;
00395 } catch (Exception e) {
00396 throw new HTTPUnexpectedException("Unexpected exception", e);
00397 }
00398 }
00399 }
00400
00405 public byte[][] secretKeyExchange(long sessionID, byte[] tmp, byte[] tmp1,
00406 byte[] tmp2, byte[] tmp3, byte[] tmp4)
00407 throws SecurityNotAvailableException, IOException,
00408 RenegotiateSessionException {
00409 if (isLocal) {
00410 return body.secretKeyExchange(sessionID, tmp, tmp1, tmp2, tmp3, tmp4);
00411 } else {
00412 ArrayList<Object> paramsList = new ArrayList<Object>();
00413 paramsList.add(new Long(sessionID));
00414 paramsList.add(tmp);
00415 paramsList.add(tmp1);
00416 paramsList.add(tmp2);
00417 paramsList.add(tmp3);
00418 paramsList.add(tmp4);
00419
00420 BodyRequest req = new BodyRequest("secretKeyExchange", paramsList,
00421 bodyID, this.url);
00422 req.send();
00423 try {
00424 return (byte[][]) req.getReturnedObject();
00425 } catch (SecurityNotAvailableException ex) {
00426 throw ex;
00427 } catch (RenegotiateSessionException e) {
00428 throw e;
00429 } catch (Exception e) {
00430 throw new HTTPUnexpectedException("Unexpected exception", e);
00431 }
00432 }
00433 }
00434
00438 public SecurityContext getPolicy(SecurityContext securityContext)
00439 throws SecurityNotAvailableException, IOException {
00440 if (isLocal) {
00441 return body.getPolicy(securityContext);
00442 } else {
00443 ArrayList<Object> paramsList = new ArrayList<Object>();
00444 paramsList.add(securityContext);
00445
00446 BodyRequest req = new BodyRequest("getPolicy", paramsList, bodyID,
00447 this.url);
00448 req.send();
00449
00450 try {
00451 return (SecurityContext) req.getReturnedObject();
00452 } catch (SecurityNotAvailableException ex) {
00453 throw ex;
00454 } catch (Exception e) {
00455 throw new HTTPUnexpectedException("Unexpected exception", e);
00456 }
00457 }
00458 }
00459
00463 public byte[] getCertificateEncoded()
00464 throws SecurityNotAvailableException, IOException {
00465 if (isLocal) {
00466 return body.getCertificateEncoded();
00467 } else {
00468 BodyRequest req = new BodyRequest("getCertificateEncoded",
00469 new ArrayList<Object>(), bodyID, this.url);
00470 req.send();
00471
00472 try {
00473 return (byte[]) req.getReturnedObject();
00474 } catch (SecurityNotAvailableException ex) {
00475 throw ex;
00476 } catch (Exception e) {
00477 throw new HTTPUnexpectedException("Unexpected exception", e);
00478 }
00479 }
00480 }
00481
00485 public ArrayList<Entity> getEntities()
00486 throws SecurityNotAvailableException, IOException {
00487 if (isLocal) {
00488 return body.getEntities();
00489 } else {
00490 BodyRequest req = new BodyRequest("getEntities", new ArrayList<Object>(),
00491 bodyID, this.url);
00492 req.send();
00493
00494 try {
00495
00496 return (ArrayList<Entity>) req.getReturnedObject();
00497 } catch (SecurityNotAvailableException ex) {
00498 throw ex;
00499 } catch (Exception e) {
00500 throw new HTTPUnexpectedException("Unexpected exception", e);
00501 }
00502 }
00503 }
00504
00508 public String getJobID() {
00509 return this.jobID;
00510 }
00511
00516 public Object receiveFTMessage(FTMessage ev) throws IOException {
00517 return null;
00518 }
00519
00523 public void createShortcut(Shortcut shortcut) throws IOException {
00524 if (bodyLogger.isDebugEnabled()) {
00525 bodyLogger.debug(
00526 "shortcuts are currently not implemented for http communications");
00527 }
00528 }
00529
00530
00531
00532
00533 public void addNFEListener(NFEListener listener) throws HTTPRemoteException {
00534 if (isLocal) {
00535 body.addNFEListener(listener);
00536 } else {
00537 ArrayList<Object> paramList = new ArrayList<Object>();
00538 paramList.add(listener);
00539
00540 new BodyRequest("addNFEListener", paramList, bodyID, url).send();
00541 }
00542 }
00543
00544 public void removeNFEListener(NFEListener listener)
00545 throws HTTPRemoteException {
00546 if (isLocal) {
00547 body.removeNFEListener(listener);
00548 } else {
00549 ArrayList<Object> paramList = new ArrayList<Object>();
00550 paramList.add(listener);
00551
00552 new BodyRequest("removeNFEListener", paramList, bodyID, url).send();
00553 }
00554 }
00555
00556 public int fireNFE(NonFunctionalException e) throws HTTPRemoteException {
00557 if (isLocal) {
00558 return body.fireNFE(e);
00559 } else {
00560 ArrayList<Object> paramList = new ArrayList<Object>();
00561 paramList.add(e);
00562 BodyRequest br = new BodyRequest("fireNFE", paramList, bodyID, url);
00563 br.send();
00564 try {
00565 return ((Integer) br.getReturnedObject()).intValue();
00566 } catch (Exception e1) {
00567 throw new HTTPUnexpectedException("Unexpected exception", e);
00568 }
00569 }
00570 }
00571
00575 public void changeProxiedBody(Body newBody) throws IOException {
00576 if (isLocal) {
00577 this.body = newBody;
00578 } else {
00579 throw new IOException("Cannot change the body remotely");
00580 }
00581 }
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597 private void readObject(java.io.ObjectInputStream in)
00598 throws IOException, ClassNotFoundException {
00599 in.defaultReadObject();
00600 this.isLocal = false;
00601 }
00602 }