@Override
 public int getChildCount(Object parent) {
   if (parent == root) {
     return repositories.size();
   } else if (parent instanceof RemoteRepository) {
     ProcessList list = getProcessList((RemoteRepository) parent);
     if ((list == null) || (list.size() == 0)) {
       return 1; // if empty, just display single message string
     } else {
       return list.size();
     }
   } else if (parent instanceof ProcessResponse) {
     ProcessResponse proResponse = (ProcessResponse) parent;
     if (proResponse.getException() != null) {
       return 1;
     } else {
       int size = 0;
       ProcessStackTrace trace = proResponse.getTrace();
       if ((trace != null) && (trace.getElements() != null)) {
         size += trace.getElements().size();
       }
       if (proResponse.getOutputLocations() != null) {
         size += proResponse.getOutputLocations().size();
       }
       return size;
     }
   } else {
     return 0;
   }
 }
 private void dump(ProcessResponse pInfo, PrintStream out) {
   out.println("State of process " + pInfo.getProcessLocation() + " (id=" + pInfo.getId() + ")");
   out.println("  Started:   " + pInfo.getStartTime());
   if (pInfo.getCompletionTime() != null) {
     out.println("  Completed: " + pInfo.getCompletionTime());
   }
   out.println("  State:     " + pInfo.getState());
   if (pInfo.getException() != null) {
     out.println("  Exception: " + pInfo.getException());
   }
   final ProcessStackTrace trace = pInfo.getTrace();
   if (trace != null) {
     out.println("  Trace:");
     for (ProcessStackTraceElement ste : trace.getElements()) {
       System.out.println(
           "     "
               + ste.getOperatorName()
               + " ("
               + ste.getApplyCount()
               + ", "
               + Tools.formatDuration(ste.getExecutionTime())
               + ")");
     }
   }
 }
 @Override
 public Object getChild(Object parent, int index) {
   if (parent == root) {
     return repositories.get(index);
   } else if (parent instanceof RemoteRepository) {
     ProcessList processList = getProcessList((RemoteRepository) parent);
     if (processList.size() == 0) {
       if (processList.getState() == ProcessListState.PENDING) {
         return PENDING_PROCESS_LIST;
       } else {
         return EMPTY_PROCESS_LIST;
       }
     } else {
       return processList.getByIndex(index);
     }
   } else if (parent instanceof ProcessResponse) {
     ProcessResponse proResponse = (ProcessResponse) parent;
     if (proResponse.getException() != null) {
       if (index == 0) {
         return new ExceptionWrapper(proResponse.getException());
       } else {
         return null;
       }
     } else {
       ProcessStackTrace trace = proResponse.getTrace();
       int elementsSize = 0;
       if ((trace != null) && (trace.getElements() != null)) {
         elementsSize = trace.getElements().size();
       }
       if (index < elementsSize && trace != null) {
         return trace.getElements().get(index);
       } else {
         return new OutputLocation(proResponse.getOutputLocations().get(index - elementsSize));
       }
     }
   } else {
     return null;
   }
 }
 @Override
 public int getIndexOfChild(Object parent, Object child) {
   if (child == RemoteProcessesTreeModel.EMPTY_PROCESS_LIST
       || child == RemoteProcessesTreeModel.PENDING_PROCESS_LIST) {
     return 0;
   } else if (parent == root) {
     return repositories.indexOf(child);
   } else if (parent instanceof RemoteRepository) {
     if (child instanceof ProcessResponse) {
       return getProcessList((RemoteRepository) parent).indexOf((ProcessResponse) child);
     } else {
       return 0;
     }
   } else if (parent instanceof ProcessResponse) {
     ProcessResponse proResponse = (ProcessResponse) parent;
     if (child instanceof ProcessStackTraceElement) {
       ProcessStackTrace trace = proResponse.getTrace();
       if ((trace != null) && (trace.getElements() != null)) {
         return trace.getElements().indexOf(child);
       } else {
         return -1;
       }
     } else if (child instanceof OutputLocation) {
       if (proResponse.getOutputLocations() != null) {
         return proResponse.getOutputLocations().indexOf(((OutputLocation) child).getLocation());
       } else {
         return -1;
       }
     } else if (child instanceof ExceptionWrapper) {
       return 0;
     } else {
       return -1;
     }
   } else {
     return -1;
   }
 }