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.group;
00032 
00033 import java.lang.reflect.InvocationTargetException;
00034 import java.lang.reflect.Type;
00035 import java.lang.reflect.TypeVariable;
00036 import java.util.Collection;
00037 import java.util.HashMap;
00038 import java.util.Iterator;
00039 import java.util.List;
00040 import java.util.ListIterator;
00041 import java.util.Map;
00042 import java.util.Set;
00043 import java.util.Vector;
00044 
00045 import org.apache.log4j.Logger;
00046 import org.objectweb.proactive.Body;
00047 import org.objectweb.proactive.ProActive;
00048 import org.objectweb.proactive.core.UniqueID;
00049 import org.objectweb.proactive.core.body.LocalBodyStore;
00050 import org.objectweb.proactive.core.body.proxy.AbstractProxy;
00051 import org.objectweb.proactive.core.component.ProActiveInterface;
00052 import org.objectweb.proactive.core.exceptions.manager.NFEManager;
00053 import org.objectweb.proactive.core.exceptions.proxy.FailedGroupRendezVousException;
00054 import org.objectweb.proactive.core.group.spmd.MethodCallSetSPMDGroup;
00055 import org.objectweb.proactive.core.group.threadpool.ThreadPool;
00056 import org.objectweb.proactive.core.mop.ClassNotReifiableException;
00057 import org.objectweb.proactive.core.mop.ConstructionOfReifiedObjectFailedException;
00058 import org.objectweb.proactive.core.mop.ConstructorCall;
00059 import org.objectweb.proactive.core.mop.MOP;
00060 import org.objectweb.proactive.core.mop.MethodCall;
00061 import org.objectweb.proactive.core.mop.Proxy;
00062 import org.objectweb.proactive.core.mop.StubObject;
00063 import org.objectweb.proactive.core.node.Node;
00064 import org.objectweb.proactive.core.util.log.Loggers;
00065 import org.objectweb.proactive.core.util.log.ProActiveLogger;
00066 import org.objectweb.proactive.core.util.profiling.PAProfilerEngine;
00067 import org.objectweb.proactive.core.util.profiling.Profiling;
00068 import org.objectweb.proactive.core.util.timer.CompositeAverageMicroTimer;
00069 
00070 
00071 public class ProxyForGroup extends AbstractProxy implements Proxy, Group,
00072     java.io.Serializable {
00073 
00075     protected static Logger logger = ProActiveLogger.getLogger(Loggers.GROUPS);
00076 
00078     protected String className;
00079 
00081     protected Vector memberList;
00082 
00084     protected Map elementNames;
00085 
00088     
00089     transient protected UniqueID proxyForGroupID;
00090 
00092     protected int waited = 0;
00093 
00095     protected boolean dispatching = false;
00096 
00098     protected boolean uniqueSerialization = false;
00099 
00101     protected StubObject stub;
00102 
00104     transient protected ThreadPool threadpool;
00105 
00107     protected CompositeAverageMicroTimer timer;
00108 
00109     
00110     public ProxyForGroup(String nameOfClass)
00111         throws ConstructionOfReifiedObjectFailedException {
00112         this();
00113         this.className = nameOfClass;
00114     }
00115 
00116     public ProxyForGroup() throws ConstructionOfReifiedObjectFailedException {
00117         this.memberList = new Vector();
00118         this.proxyForGroupID = new UniqueID();
00119         this.threadpool = new ThreadPool();
00120         this.elementNames = new HashMap();
00121         if (Profiling.GROUP) {
00122             timer = new CompositeAverageMicroTimer("Group");
00123             PAProfilerEngine.registerTimer(timer);
00124         }
00125     }
00126 
00127     public ProxyForGroup(ConstructorCall c, Object[] p)
00128         throws ConstructionOfReifiedObjectFailedException {
00129         this();
00130     }
00131 
00132     
00133 
00137     protected void setDispatchingOn() {
00138         this.dispatching = true;
00139     }
00140 
00144     protected void setDispatchingOff() {
00145         this.dispatching = false;
00146     }
00147 
00151     protected void setUniqueSerializationOn() {
00152         this.uniqueSerialization = true;
00153     }
00154 
00158     protected void setUniqueSerializationOff() {
00159         this.uniqueSerialization = false;
00160     }
00161 
00166     protected boolean isDispatchingOn() {
00167         return this.dispatching;
00168     }
00169 
00170     private boolean isDispatchingCall(MethodCall mc) {
00171         for (int i = 0; i < mc.getNumberOfParameter(); i++)
00172             if (ProActiveGroup.isScatterGroupOn(mc.getParameter(i))) {
00173                 return true;
00174             }
00175         return false;
00176     }
00177 
00178     
00179 
00188     public synchronized Object reify(MethodCall mc)
00189         throws InvocationTargetException  {
00190         
00191         ExceptionListException exceptionList = null;
00192 
00193         
00194         if ("toString".equals(mc.getName())) {
00195             return this.toString();
00196         }
00197 
00198         
00199         if ("hashCode".equals(mc.getName())) {
00200             return new Integer(this.hashCode());
00201         }
00202 
00203         if ("equals".equals(mc.getName()) && (mc.getNumberOfParameter() == 1)) {
00204             return new Boolean(this.equals(mc.getParameter(0)));
00205         }
00206         
00207         
00208 
00209 
00210         
00211         Object result = null;
00212 
00213         
00214         this.threadpool.checkNumberOfThreads(this.memberList.size());
00215 
00216         
00217         if (mc.isOneWayCall()) {
00218             exceptionList = new ExceptionListException();
00219             this.oneWayCallOnGroup(mc, exceptionList);
00220         }
00221         
00222         else if (mc.getReifiedMethod().getReturnType() == Void.TYPE) {
00223             exceptionList = new ExceptionListException();
00224             this.oneWayCallOnGroup(mc, exceptionList);
00225         }
00226         
00227         else { 
00228             result = this.asynchronousCallOnGroup(mc);
00229         }
00230 
00231         
00232         this.threadpool.complete();
00233 
00234         
00235         if ((exceptionList != null) && (exceptionList.size() != 0)) {
00236             FailedGroupRendezVousException fgrve = new FailedGroupRendezVousException(
00237                     "RendezVous failed in group method: " + mc.getName(),
00238                     exceptionList, this);
00239             NFEManager.fireNFE(fgrve, this);
00240         }
00241 
00242         return result;
00243     }
00244 
00246     public void finalize() {
00247         this.threadpool.clean();
00248     }
00249 
00250     
00251 
00257     protected Object asynchronousCallOnGroup(MethodCall mc) throws InvocationTargetException {
00258         Object result;
00259         Body body = ProActive.getBodyOnThis();
00260         if (Profiling.GROUP) {
00261             timer.setTimer("asynchronousCallOnGroup." + mc.getName());
00262             timer.start();
00263         }
00264 
00265         
00266         String returnTypeClassName = null;
00267         try {
00268             Object[] paramProxy = new Object[0];
00269             Type t = mc.getReifiedMethod().getGenericReturnType();
00270             if (t instanceof TypeVariable) {
00271                 returnTypeClassName = mc.getGenericTypesMapping().get(t).getName();
00272             } else {
00273                 returnTypeClassName = mc.getReifiedMethod().getReturnType().getName();
00274             }
00275 
00276             result = MOP.newInstance(returnTypeClassName,
00277                     null, null, ProxyForGroup.class.getName(), paramProxy);
00278             
00279             ((ProxyForGroup) ((StubObject) result).getProxy()).className = returnTypeClassName;
00280             
00281         } catch (ClassNotReifiableException e1) {
00282             throw new InvocationTargetException(e1, "Method " + mc.getReifiedMethod().toGenericString() + " : cannot return a group of results for the non reifiable type " + returnTypeClassName);
00283         } catch (Exception e2) {
00284                 throw new InvocationTargetException(e2, "Method " + mc.getReifiedMethod().toGenericString() + " : cannot create group of results");
00285         }
00286 
00287         int size = this.memberList.size();
00288 
00289         
00290         Vector memberListOfResultGroup = ((ProxyForGroup) ((StubObject) result).getProxy()).memberList;
00291         for (int i = 0; i < size; i++) {
00292             memberListOfResultGroup.add(null);
00293         }
00294 
00295         
00296         if (isDispatchingCall(mc) == false) {
00297             if (uniqueSerialization) {
00298                 mc.transformEffectiveArgumentsIntoByteArray();
00299             }
00300             for (int index = 0; index < this.memberList.size(); index++)
00301                 this.threadpool.addAJob(new ProcessForAsyncCall(this,
00302                         this.memberList, memberListOfResultGroup, index, mc,
00303                         body));
00304         } else { 
00305             
00306             for (int index = 0; index < memberList.size(); index++) {
00307                 
00308                 Object[] individualEffectiveArguments = new Object[mc.getNumberOfParameter()];
00309                 for (int i = 0; i < mc.getNumberOfParameter(); i++)
00310                     if (ProActiveGroup.isScatterGroupOn(mc.getParameter(i))) {
00311                         individualEffectiveArguments[i] = ProActiveGroup.get(mc.getParameter(
00312                                     i),
00313                                 index % ProActiveGroup.size(mc.getParameter(i)));
00314                     } else {
00315                         individualEffectiveArguments[i] = mc.getParameter(i);
00316                     }
00317                 this.threadpool.addAJob(new ProcessForAsyncCall(this,
00318                         this.memberList, memberListOfResultGroup, index,
00319                         new MethodCall(mc.getReifiedMethod(), mc.getGenericTypesMapping(),
00320                             individualEffectiveArguments, mc.getExceptionContext()),
00321                         body));
00322             }
00323         }
00324 
00325         LocalBodyStore.getInstance().setCurrentThreadBody(body);
00326         if (Profiling.GROUP) {
00327             timer.stop();
00328         }
00329         return result;
00330     }
00331 
00337 
00338 
00339 
00340 
00341 
00342 
00343 
00344 
00345 
00346 
00347 
00348 
00349 
00350 
00351 
00352 
00359     protected void addToListOfResult(Vector memberListOfResultGroup,
00360         Object result, int index) {
00361         memberListOfResultGroup.set(index, result);
00362     }
00363 
00364     
00365 
00370     protected void oneWayCallOnGroup(MethodCall mc,
00371         ExceptionListException exceptionList) throws InvocationTargetException {
00372         Body body = ProActive.getBodyOnThis();
00373         if (Profiling.GROUP) {
00374             timer.setTimer("oneWayCallOnGroup." + mc.getName());
00375             timer.start();
00376         }
00377 
00378         
00379         if (isDispatchingCall(mc) == false) {
00380             if (uniqueSerialization) {
00381                 mc.transformEffectiveArgumentsIntoByteArray();
00382             }
00383             for (int index = 0; index < this.memberList.size(); index++) {
00384                 this.threadpool.addAJob(new ProcessForOneWayCall(this,
00385                         this.memberList, index, mc, body, exceptionList));
00386             }
00387         } else { 
00388 
00389             for (int index = 0; index < memberList.size(); index++) {
00390                 Object[] individualEffectiveArguments = new Object[mc.getNumberOfParameter()];
00391                 for (int i = 0; i < mc.getNumberOfParameter(); i++)
00392                     if (ProActiveGroup.isScatterGroupOn(mc.getParameter(i))) {
00393                         individualEffectiveArguments[i] = ProActiveGroup.get(mc.getParameter(
00394                                     i),
00395                                 index % ProActiveGroup.size(mc.getParameter(i)));
00396                     } else {
00397                         individualEffectiveArguments[i] = mc.getParameter(i);
00398                     }
00399                 this.threadpool.addAJob(new ProcessForOneWayCall(this,
00400                         this.memberList, index,
00401                         new MethodCall(mc.getReifiedMethod(), mc.getGenericTypesMapping(),
00402                             individualEffectiveArguments, mc.getExceptionContext()),
00403                         body, exceptionList));
00404             }
00405         }
00406 
00407         LocalBodyStore.getInstance().setCurrentThreadBody(body);
00408 
00409         if (Profiling.GROUP) {
00410             timer.stop();
00411         }
00412     }
00413 
00414     
00415 
00423     public boolean add(Object o) {
00424         try {
00425             if ((MOP.forName(this.className)).isAssignableFrom(o.getClass())) {
00426 
00427                 
00428                 if (MOP.isReifiedObject(o)) {
00429                     return this.memberList.add(o);
00430                 }
00431                 
00432 
00433                 
00434                 else if (o instanceof ProActiveInterface) {
00435                     return this.memberList.add(o);
00436                 }  else if (o instanceof org.objectweb.proactive.core.group.ProxyForGroup) {
00437 
00438                     
00439                     return this.memberList.addAll(((org.objectweb.proactive.core.group.ProxyForGroup) o).memberList);
00440                 }  else {
00441                     return this.memberList.add(o);
00442                 }
00443             } else {
00444                 if (logger.isInfoEnabled()) {
00445                     logger.info("uncompatible Object");
00446                 }
00447                 return false;
00448             }
00449         } catch (java.lang.ClassNotFoundException e) {
00450             if (logger.isInfoEnabled()) {
00451                 logger.info("Unknown class : " + this.className);
00452             }
00453         }
00454         return true;
00455     }
00456 
00462     public boolean addAll(Collection c) {
00463         boolean modified = false;
00464         Iterator iterator = c.iterator();
00465         while (iterator.hasNext()) {
00466             modified |= this.add(iterator.next());
00467         }
00468         return modified;
00469     }
00470 
00475     public void clear() {
00476         this.memberList.clear();
00477     }
00478 
00483     public boolean contains(Object o) {
00484         return this.memberList.contains(o);
00485     }
00486 
00492     public boolean containsAll(Collection c) {
00493         boolean contained;
00494         Iterator iterator = c.iterator();
00495         while (iterator.hasNext()) {
00496             contained = this.contains(iterator.next());
00497             if (!contained) {
00498                 return false;
00499             }
00500         }
00501         return true;
00502     }
00503 
00515     public boolean equals(Object o) {
00516         ProxyForGroup p = ProActiveGroup.findProxyForGroup(o);
00517         if (p != null) {
00518             
00519             return this.memberList.equals(((org.objectweb.proactive.core.group.ProxyForGroup) p).memberList);
00520         } else {
00521             return false;
00522         }
00523     }
00524 
00529     public int hashCode() {
00530         return this.memberList.hashCode();
00531     }
00532 
00537     public boolean isEmpty() {
00538         return this.memberList.isEmpty();
00539     }
00540 
00545     public Iterator iterator() {
00546         return this.memberList.iterator();
00547     }
00548 
00555     public boolean remove(Object o) {
00556         return this.memberList.remove(o);
00557     }
00558 
00565     public boolean removeAll(Collection c) {
00566         boolean modified = false;
00567         Iterator iterator = c.iterator();
00568         while (iterator.hasNext()) {
00569             modified |= this.remove(iterator.next());
00570         }
00571         return modified;
00572     }
00573 
00580     public boolean retainAll(Collection c) {
00581         boolean modified = false;
00582         Iterator iterator = c.iterator();
00583         while (iterator.hasNext()) {
00584             Object tmp = iterator.next();
00585             if (this.contains(tmp)) {
00586                 modified |= this.remove(tmp);
00587             }
00588         }
00589         return modified;
00590     }
00591 
00596     public int size() {
00597         return this.memberList.size();
00598     }
00599 
00604     public Object[] toArray() {
00605         return this.memberList.toArray();
00606     }
00607 
00615     public Object[] toArray(Object[] a) {
00616         return this.memberList.toArray(a);
00617     }
00618 
00619     
00620 
00629     public void addMerge(Object oGroup) {
00630         try {
00631 
00632             
00633             if ((MOP.isReifiedObject(oGroup)) &&
00634                     ((MOP.forName(this.className)).isAssignableFrom(
00635                         oGroup.getClass()))) {
00636 
00637                 
00638                 if (((StubObject) oGroup).getProxy() instanceof org.objectweb.proactive.core.group.ProxyForGroup) {
00639                     memberList.addAll(((ProxyForGroup) ((StubObject) oGroup).getProxy()).memberList);
00640                 }  else {
00641                     this.add(oGroup);
00642                 }
00643             }  else if (oGroup instanceof org.objectweb.proactive.core.group.ProxyForGroup) {
00644                 memberList.addAll(((org.objectweb.proactive.core.group.ProxyForGroup) oGroup).memberList);
00645             }
00646         } catch (java.lang.ClassNotFoundException e) {
00647             if (logger.isInfoEnabled()) {
00648                 logger.info("Unknown class : " + this.className);
00649             }
00650         }
00651     }
00652 
00659     public int indexOf(Object obj) {
00660         return this.memberList.indexOf(obj);
00661     }
00662 
00667     public ListIterator listIterator() {
00668         return this.memberList.listIterator();
00669     }
00670 
00676     public Object remove(int index) {
00677         
00678         Iterator it = elementNames.keySet().iterator();
00679         while (it.hasNext()) {
00680             String key = (String) it.next();
00681             Integer value = (Integer) elementNames.get(key);
00682             if (value.intValue() > index) {
00683                 elementNames.put(key, new Integer(value.intValue() - 1));
00684             }
00685         }
00686         return this.memberList.remove(index);
00687     }
00688 
00694     public Object get(int i) {
00695         return this.memberList.get(i);
00696     }
00697 
00703     public Class getType() throws java.lang.ClassNotFoundException {
00704         return MOP.forName(this.className);
00705     }
00706 
00711     public String getTypeName() {
00712         return this.className;
00713     }
00714 
00719     public Object getGroupByType() {
00720         Object result;
00721         try { 
00722             result = MOP.newInstance(this.className, 
00723                     null, null, ProxyForGroup.class.getName(), null);
00724         } catch (Exception e) {
00725             e.printStackTrace();
00726             return null;
00727         }
00728         ProxyForGroup proxy = (ProxyForGroup) ((StubObject) result).getProxy();
00729         proxy.memberList = this.memberList;
00730         proxy.className = this.className;
00731         proxy.proxyForGroupID = this.proxyForGroupID;
00732         proxy.waited = this.waited;
00733         return result;
00734     }
00735 
00736     
00737     
00738     
00739     
00740     
00741     
00742     
00743     
00744 
00750     public Group union(Group g) {
00751         try {
00752             if ((MOP.forName(this.getTypeName())).isAssignableFrom(MOP.forName(
00753                             g.getTypeName()))) {
00754                 ProxyForGroup result = new ProxyForGroup(this.getTypeName());
00755 
00756                 
00757                 Iterator it = this.iterator();
00758                 while (it.hasNext()) {
00759                     result.add(it.next());
00760                 }
00761 
00762                 
00763                 it = g.iterator();
00764                 while (it.hasNext()) {
00765                     result.add(it.next());
00766                 }
00767                 return result;
00768             }
00769         } catch (ClassNotFoundException e) {
00770             e.printStackTrace();
00771         } catch (ConstructionOfReifiedObjectFailedException e) {
00772             e.printStackTrace();
00773         }
00774 
00775         
00776         return null;
00777     }
00778 
00784     public Group intersection(Group g) {
00785         try {
00786             if ((MOP.forName(this.getTypeName())).isAssignableFrom(MOP.forName(
00787                             g.getTypeName()))) {
00788                 ProxyForGroup result = new ProxyForGroup(this.getTypeName());
00789                 Object member;
00790                 Iterator it = this.iterator();
00791 
00792                 
00793                 while (it.hasNext()) {
00794                     member = it.next();
00795                     if (g.indexOf(member) > -1) {
00796                         result.add(member);
00797                     }
00798                 }
00799                 return result;
00800             }
00801         } catch (ClassNotFoundException e) {
00802             e.printStackTrace();
00803         } catch (ConstructionOfReifiedObjectFailedException e) {
00804             e.printStackTrace();
00805         }
00806 
00807         
00808         return null;
00809     }
00810 
00816     public Group exclude(Group g) {
00817         try {
00818             if ((MOP.forName(this.getTypeName())).isAssignableFrom(MOP.forName(
00819                             g.getTypeName()))) {
00820                 ProxyForGroup result = new ProxyForGroup(this.getTypeName());
00821                 Object member;
00822                 Iterator it = this.iterator();
00823                 while (it.hasNext()) {
00824                     member = it.next();
00825                     if (g.indexOf(member) < 0) {
00826                         result.add(member);
00827                     }
00828                 }
00829                 return result;
00830             }
00831         } catch (ClassNotFoundException e) {
00832             e.printStackTrace();
00833         } catch (ConstructionOfReifiedObjectFailedException e) {
00834             e.printStackTrace();
00835         }
00836 
00837         
00838         return null;
00839     }
00840 
00846     public Group difference(Group g) {
00847         try {
00848             if ((MOP.forName(this.getTypeName())).isAssignableFrom(MOP.forName(
00849                             g.getTypeName()))) {
00850                 ProxyForGroup result = new ProxyForGroup(this.getTypeName());
00851                 Object member;
00852                 Iterator it = this.iterator();
00853 
00854                 
00855                 while (it.hasNext()) {
00856                     member = it.next();
00857                     if (g.indexOf(member) < 0) {
00858                         result.add(member);
00859                     }
00860                 }
00861                 it = g.iterator();
00862                 
00863                 while (it.hasNext()) {
00864                     member = it.next();
00865                     if (this.indexOf(member) < 0) {
00866                         result.add(member);
00867                     }
00868                 }
00869                 return result;
00870             }
00871         } catch (ClassNotFoundException e) {
00872             e.printStackTrace();
00873         } catch (ConstructionOfReifiedObjectFailedException e) {
00874             e.printStackTrace();
00875         }
00876 
00877         
00878         return null;
00879     }
00880 
00887     public Group range(int begin, int end) {
00888         
00889         if (begin > end) {
00890             return null;
00891         }
00892         if (begin < 0) {
00893             begin = 0;
00894         }
00895         if (end > this.size()) {
00896             end = this.size();
00897         }
00898         try {
00899             ProxyForGroup result = new ProxyForGroup(this.getTypeName());
00900             for (int i = begin; i <= end; i++) {
00901                 result.add(this.get(i));
00902             }
00903             return result;
00904         } catch (ConstructionOfReifiedObjectFailedException e) {
00905             e.printStackTrace();
00906             return null;
00907         }
00908     }
00909 
00914     public void setSPMDGroup(Object spmdGroup) {
00915         try {
00916             this.reify(new MethodCallSetSPMDGroup(spmdGroup));
00917         } catch (InvocationTargetException e) {
00918             logger.info("Unable to set the SPMD group");
00919             e.printStackTrace();
00920         }
00921     }
00922 
00926     public void display() {
00927         logger.info("Number of member : " + memberList.size());
00928         for (int i = 0; i < memberList.size(); i++)
00929             logger.info("  " + i + " : " +
00930                 memberList.get(i).getClass().getName());
00931     }
00932 
00933     
00934 
00938     public void waitAll() {
00939         ProActive.waitForAll(this.memberList);
00940     }
00941 
00945     public void waitOne() {
00946         ProActive.waitForAny(this.memberList);
00947     }
00948 
00953     public void waitTheNth(int n) {
00954         ProActive.waitFor(this.memberList.get(n));
00955     }
00956 
00961     public void waitN(int n) {
00962         for (int i = 0; i < n; i++) {
00963             this.waitTheNth(i);
00964         }
00965     }
00966 
00971     public Object waitAndGetOne() {
00972         return this.memberList.get(ProActive.waitForAny(this.memberList));
00973     }
00974 
00979     public Object waitAndGetOneThenRemoveIt() {
00980         return this.memberList.remove(ProActive.waitForAny(this.memberList));
00981     }
00982 
00988     public Object waitAndGetTheNth(int n) {
00989         ProActive.waitForTheNth(this.memberList, n);
00990         return this.memberList.get(n);
00991     }
00992 
00997     public int waitOneAndGetIndex() {
00998         int index = 0;
00999         this.memberList.get(ProActive.waitForAny(this.memberList));
01000         while (ProActive.isAwaited(this.memberList.get(index))) {
01001             index++;
01002         }
01003         return index;
01004     }
01005 
01010     public boolean allAwaited() {
01011         for (int i = 0; i < this.memberList.size(); i++)
01012             if (!(ProActive.isAwaited(this.memberList.get(i)))) {
01013                 return false;
01014             }
01015         return true;
01016     }
01017 
01022     public boolean allArrived() {
01023         for (int i = 0; i < this.memberList.size(); i++)
01024             if (ProActive.isAwaited(this.memberList.get(i))) {
01025                 return false;
01026             }
01027         return true;
01028     }
01029 
01035     public ExceptionListException getExceptionList() {
01036         ExceptionListException exceptionList = new ExceptionListException();
01037         for (int i = 0; i < this.memberList.size(); i++) {
01038             if (this.memberList.get(i) instanceof Throwable) {
01039                 exceptionList.add(new ExceptionInGroup(null, i,
01040                         (Throwable) this.memberList.get(i)));
01041             }
01042         }
01043         return exceptionList;
01044     }
01045 
01052     public void purgeExceptionAndNull() {
01053         Iterator it = this.memberList.iterator();
01054         while (it.hasNext()) {
01055             Object element = (Object) it.next();
01056             if ((element instanceof Throwable) || (element == null)) {
01057                 it.remove();
01058             }
01059         }
01060     }
01061 
01066     public void setRatioMemberToThread(int i) {
01067         this.threadpool.ratio(i);
01068     }
01069 
01074     public void setAdditionalThread(int i) {
01075         this.threadpool.thread(i);
01076     }
01077 
01078     
01079 
01086     public void createMemberWithMultithread(String className, Class[] genericParameters,
01087         Object[][] params, Node[] nodeList) {
01088         
01089         for (int i = 0; i < params.length; i++) {
01090             this.memberList.add(null);
01091         }
01092         for (int i = 0; i < params.length; i++) {
01093             this.threadpool.addAJob(new ProcessForGroupCreation(this,
01094                     className, genericParameters, params[i], nodeList[i % nodeList.length], i));
01095         }
01096         this.threadpool.complete();
01097     }
01098 
01105     protected void createMemberWithMultithread(String className, Class[] genericParameters,
01106         Object[] params, Node[] nodeList) {
01107         
01108         for (int i = 0; i < nodeList.length; i++) {
01109             this.memberList.add(null);
01110         }
01111         for (int i = 0; i < nodeList.length; i++) {
01112             this.threadpool.addAJob(new ProcessForGroupCreation(this,
01113                     className, genericParameters, params, nodeList[i], i));
01114         }
01115         this.threadpool.complete();
01116     }
01117 
01118     
01119 
01120 
01121      public Object set(int index, Object o) {
01122         return this.memberList.set(index, o);
01123     }
01124      
01125      
01126 
01127     
01128 
01129 
01130     public void add(int index, Object element) {
01131         memberList.add(index, element);
01132     }
01133 
01134     
01135 
01136 
01137     public boolean addAll(int index, Collection c) {
01138         return memberList.addAll(index, c);
01139     }
01140 
01141     
01142 
01143 
01144     public int lastIndexOf(Object o) {
01145         return memberList.lastIndexOf(o);
01146     }
01147 
01148     
01149 
01150 
01151     public ListIterator listIterator(int index) {
01152         return memberList.listIterator(index);
01153     }
01154 
01155     
01156 
01157 
01158     public List subList(int fromIndex, int toIndex) {
01159         return memberList.subList(fromIndex, toIndex);
01160     }
01161 
01162     
01163     private void writeObject(java.io.ObjectOutputStream out)
01164         throws java.io.IOException {
01165         
01166         out.defaultWriteObject();
01167     }
01168 
01169     private void readObject(java.io.ObjectInputStream in)
01170         throws java.io.IOException, ClassNotFoundException {
01171         in.defaultReadObject();
01172         this.proxyForGroupID = new UniqueID();
01173         this.threadpool = new ThreadPool();
01174     }
01175 
01176     
01177 
01188     public boolean containsKey(String key) {
01189         return this.elementNames.containsKey(key);
01190     }
01191 
01201     public boolean containsValue(Object value) {
01202         return this.memberList.contains(value);
01203     }
01204 
01220     public synchronized Object getNamedElement(String key) {
01221         return get(((Integer) this.elementNames.get(key)).intValue());
01222     }
01223 
01237     public synchronized void addNamedElement(String key, Object value) {
01238         if (elementNames.containsKey(key)) {
01239             removeNamedElement(key);
01240         }
01241         this.elementNames.put(key, new Integer(this.size()));
01242         this.add(value);
01243     }
01244 
01255     public Set keySet() {
01256         return this.elementNames.keySet();
01257     }
01258 
01264     public synchronized Object removeNamedElement(String key) {
01265         int index = ((Integer) elementNames.get(key)).intValue();
01266         Object removed = get(index);
01267         remove(index);
01268         elementNames.remove(key);
01269         return removed;
01270     }
01271     
01272     protected void redistributeParameters(MethodCall mc) {
01273         
01274     }
01275 
01276     
01280     public String getClassName() {
01281     
01282         return className;
01283     }
01284 
01285     
01289     public Vector getMemberList() {
01290     
01291         return memberList;
01292     }
01293 
01294     
01298     public void setClassName(String className) {
01299     
01300         this.className = className;
01301     }
01302 
01303 }