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.process;
00032
00033 import org.objectweb.proactive.core.process.filetransfer.FileTransferWorkShop;
00034 import org.objectweb.proactive.core.util.RemoteProcessMessageLogger;
00035
00036 import java.io.IOException;
00037
00038 import java.util.ArrayList;
00039
00040
00049 public abstract class AbstractListProcessDecorator
00050 implements ExternalProcessDecorator {
00051
00052 protected ArrayList<ExternalProcessDecorator> processes;
00053
00054
00055 protected ExternalProcessDecorator baseProcess;
00056
00057
00058 protected String fixedName;
00059 protected String domain;
00060 protected String list;
00061 private String tmp;
00062 protected String beginIndex;
00063 protected String endIndex;
00064 protected int padding = 1;
00065 protected int repeat = 1;
00066 protected int step = 1;
00067 protected ArrayList<String> excludeArray = new ArrayList<String>();
00068 protected int nodeNumber = 0;
00069
00070 public AbstractListProcessDecorator() {
00071 processes = new ArrayList<ExternalProcessDecorator>();
00072 }
00073
00074 public void setHostConfig(String fixedName, String list, String domain,
00075 int padding, int repeat) {
00076 this.fixedName = fixedName;
00077 this.domain = domain;
00078 this.padding = padding;
00079 this.repeat = repeat;
00080 this.list = list.replaceAll("\\s", "");
00081 setAllIndex(this.list);
00082 for (int i = Integer.parseInt(beginIndex);
00083 i <= Integer.parseInt(endIndex); i = i + step) {
00084 tmp = "" + i;
00085 if (!excludeArray.contains(tmp)) {
00086 for (int count=0; count<repeat; count++) {
00087 setHostname(handlePadding(tmp));
00088 }
00089 }
00090 }
00091 baseProcess = processes.get(0);
00092 }
00093
00094 public void setHostList(String hostlistattr, String domain) {
00095 String[] hostlist = hostlistattr.split("\\s");
00096 if (checkNonEmpty(domain)) {
00097 if (!domain.startsWith(".")) {
00098 domain = "." + domain;
00099 }
00100 for (int i = 0; i < hostlist.length; i++) {
00101 String hostname = hostlist[i] + domain;
00102 setHostname(hostname);
00103 }
00104 } else {
00105 for (int i = 0; i < hostlist.length; i++) {
00106 setHostname(hostlist[i]);
00107 }
00108 }
00109 baseProcess = processes.get(0);
00110 }
00111
00112
00113
00114
00118 public ExternalProcess getTargetProcess() {
00119 return baseProcess.getTargetProcess();
00120 }
00121
00125 public void setTargetProcess(ExternalProcess targetProcess) {
00126 for (int i = 0; i < processes.size(); i++) {
00127 ( processes.get(i)).setTargetProcess(targetProcess);
00128 }
00129 }
00130
00134 public int getCompositionType() {
00135 return baseProcess.getCompositionType();
00136 }
00137
00141 public void setCompositionType(int compositionType) {
00142 for (int i = 0; i < processes.size(); i++) {
00143 ( processes.get(i)).setCompositionType(compositionType);
00144 }
00145 }
00146
00147 public FileTransferWorkShop getFileTransferWorkShopRetrieve() {
00148
00149
00150
00151
00152 return null;
00153 }
00154
00155 public FileTransferWorkShop getFileTransferWorkShopDeploy() {
00156
00157
00158
00159
00160 return null;
00161 }
00162
00163 public void startFileTransfer() {
00164
00165
00166
00167
00168 }
00169
00170 public boolean isRequiredFileTransferDeployOnNodeCreation() {
00171
00172
00173
00174
00175 return false;
00176 }
00177
00181 public void closeStream() {
00182 for (int i = 0; i < processes.size(); i++) {
00183 ( processes.get(i)).closeStream();
00184 }
00185 }
00186
00190 public RemoteProcessMessageLogger getInputMessageLogger() {
00191 return baseProcess.getInputMessageLogger();
00192 }
00193
00197 public RemoteProcessMessageLogger getErrorMessageLogger() {
00198 return baseProcess.getErrorMessageLogger();
00199 }
00200
00204 public MessageSink getOutputMessageSink() {
00205 return baseProcess.getOutputMessageSink();
00206 }
00207
00211 public void setInputMessageLogger(
00212 RemoteProcessMessageLogger inputMessageLogger) {
00213 for (int i = 0; i < processes.size(); i++) {
00214 ( processes.get(i)).setInputMessageLogger(inputMessageLogger);
00215 }
00216 }
00217
00221 public void setErrorMessageLogger(
00222 RemoteProcessMessageLogger errorMessageLogger) {
00223 for (int i = 0; i < processes.size(); i++) {
00224 ( processes.get(i)).setErrorMessageLogger(errorMessageLogger);
00225 }
00226 }
00227
00231 public void setOutputMessageSink(MessageSink outputMessageSink) {
00232 for (int i = 0; i < processes.size(); i++) {
00233 ( processes.get(i)).setOutputMessageSink(outputMessageSink);
00234 }
00235 }
00236
00240 public String[] getEnvironment() {
00241 return baseProcess.getEnvironment();
00242 }
00243
00247 public void setEnvironment(String[] environment) {
00248 for (int i = 0; i < processes.size(); i++) {
00249 ( processes.get(i)).setEnvironment(environment);
00250 }
00251 }
00252
00256 public String getHostname() {
00257 return fixedName;
00258 }
00259
00263 public void setHostname(String hostname) {
00264 ExternalProcessDecorator process = createProcess();
00265 process.setHostname(hostname);
00266 processes.add(process);
00267 }
00268
00272 public String getUsername() {
00273 return baseProcess.getUsername();
00274 }
00275
00279 public void setUsername(String username) {
00280 for (int i = 0; i < processes.size(); i++) {
00281 ( processes.get(i)).setUsername(username);
00282 }
00283 }
00284
00288 public String getCommand() {
00289 return baseProcess.getCommandPath() + " " + fixedName + " " + list +
00290 " " + domain;
00291 }
00292
00296 public String getProcessId() {
00297 return baseProcess.getProcessId();
00298 }
00299
00303 public int getNodeNumber() {
00304 if (nodeNumber == 0) {
00305 for (int i = 0; i < processes.size(); i++) {
00306 nodeNumber = nodeNumber +
00307 ( processes.get(i)).getNodeNumber();
00308 }
00309 }
00310 return nodeNumber;
00311 }
00312
00316 public UniversalProcess getFinalProcess() {
00317 return baseProcess.getFinalProcess();
00318 }
00319
00323 public void startProcess() throws IOException {
00324 for (int i = 0; i < processes.size(); i++) {
00325 ( processes.get(i)).startProcess();
00326 }
00327 }
00328
00332 public void stopProcess() {
00333 for (int i = 0; i < processes.size(); i++) {
00334 ( processes.get(i)).stopProcess();
00335 }
00336 }
00337
00341 public int waitFor() throws InterruptedException {
00342 int status = 0;
00343 for (int i = 0; i < processes.size(); i++) {
00344 status = ( processes.get(i)).waitFor();
00345 if (status != 0) {
00346 return status;
00347 }
00348 }
00349 return status;
00350 }
00351
00355 public boolean isStarted() {
00356 boolean started = true;
00357 for (int i = 0; i < processes.size(); i++) {
00358 started = ( processes.get(i)).isStarted();
00359 if (!started) {
00360 return started;
00361 }
00362 }
00363 return started;
00364 }
00365
00369 public boolean isFinished() {
00370 boolean finished = true;
00371 for (int i = 0; i < processes.size(); i++) {
00372 finished = ( processes.get(i)).isFinished();
00373 if (!finished) {
00374 return finished;
00375 }
00376 }
00377 return finished;
00378 }
00379
00380
00381 public boolean isHierarchical() {
00382 return false;
00383 }
00384
00385
00386 public boolean isDependent() {
00387 return false;
00388 }
00389
00390
00391 public boolean isSequential() {
00392 return false;
00393 }
00394
00398 public void setCommandPath(String path) {
00399 for (int i = 0; i < processes.size(); i++) {
00400 ( processes.get(i)).setCommandPath(path);
00401 }
00402 }
00403
00407 public String getCommandPath() {
00408 return baseProcess.getCommandPath();
00409 }
00410
00411
00412
00413
00414 protected abstract ExternalProcessDecorator createProcess();
00415
00416 protected void setAllIndex(String list) {
00417 int index1 = list.indexOf(';');
00418 int index2 = list.indexOf(']');
00419 int index3 = list.indexOf('^');
00420 beginIndex = list.substring(1, list.indexOf('-'));
00421 if (index1 == -1) {
00422 endIndex = list.substring(list.indexOf('-') + 1, index2);
00423 } else {
00424 endIndex = list.substring(list.indexOf('-') + 1, index1);
00425 String scount = list.substring(index1 + 1, index2);
00426 step = new Integer(scount).intValue();
00427 }
00428 if (index3 != -1) {
00429 String[] listexclude = list.substring(list.lastIndexOf('[') + 1,
00430 list.lastIndexOf(']')).split(",");
00431 for (int i = 0; i < listexclude.length; i++) {
00432 if (listexclude[i].indexOf("-") < 0) {
00433 excludeArray.add(listexclude[i]);
00434 } else {
00435 String init = listexclude[i].substring(0,
00436 listexclude[i].indexOf("-"));
00437 String end = listexclude[i].substring(listexclude[i].indexOf(
00438 "-") + 1, listexclude[i].length());
00439 for (int j = Integer.parseInt(init);
00440 j <= Integer.parseInt(end); j++) {
00441 excludeArray.add(new Integer(j).toString());
00442 }
00443 }
00444 }
00445 }
00446 }
00447
00448 protected String handlePadding(String word) {
00449 int wlength = word.length();
00450 if (wlength < padding) {
00451 for (int i = 0; i < (padding - wlength); i++) {
00452 word = "0" + word;
00453 }
00454 }
00455 if (domain.length() > 0) {
00456 if (!domain.startsWith(".")) {
00457 domain = "." + domain;
00458 }
00459 }
00460 return fixedName + word + domain;
00461 }
00462
00463 protected boolean checkNonEmpty(String s) {
00464 return (s != null) && (s.length() > 0);
00465 }
00466
00467 public int exitValue() throws IllegalThreadStateException {
00468
00469 return 0;
00470 }
00471
00472 public void setStarted(boolean isStarted) {
00473
00474 }
00475
00476 public void setFinished(boolean isFinished) {
00477
00478 }
00479 }