public void decorate(Object element, IDecoration decoration) {
    if (!(element instanceof IResource)) return;
    IResource resource = (IResource) element;
    if (!resource.exists()) return;
    IProject project = resource.getProject();
    if (project == null) {
      Log.error(
          Messages.getString("ErrorDecorator.PROJECT_FOR")
              + resource.getName()
              + Messages.getString("ErrorDecorator.IS_NULL"),
          new Throwable()); //$NON-NLS-1$ //$NON-NLS-2$
      return;
    }
    try {
      if (!project.isOpen()) return;
      project.open(null);
      if (project.hasNature(LSLProjectNature.ID)) {
        LSLProjectNature nature = (LSLProjectNature) project.getNature(LSLProjectNature.ID);

        if (nature == null) return;

        IMarker[] m =
            resource.findMarkers("lslforge.problem", true, IResource.DEPTH_INFINITE); // $NON-NLS-1$

        if (m == null || m.length == 0) return;
      } else {
        return;
      }
    } catch (CoreException e) {
      Log.error("exception caught trying to determine project nature!", e); // $NON-NLS-1$
      return;
    }

    decoration.addOverlay(descriptor, IDecoration.BOTTOM_LEFT);
  }
  public void run() {
    String line = null;

    try {
      while ((line = reader.readLine()) != null) {
        Log.debug("read:" + Util.URIDecode(line)); // $NON-NLS-1$
        TestEvent event = TestEvents.fromXML(Util.URIDecode(line));

        // kludge for the mo'
        if (event instanceof TestCompleteEvent) {
          manager.postTestResult(((TestCompleteEvent) event).getTestResult());
          String cmd = continueText();
          Log.debug("writing: " + cmd); // $NON-NLS-1$
          writeOut(cmd);
        } else if (event instanceof AllCompleteEvent) {
          endSession();
          fireComplete();
          // TODO: this is a place where a debug event would happen
          return;
        } else if (event instanceof TestSuspendedEvent) {
          // TODO: this is where we'd extract the debug info...
          Log.debug("hit a breakpoint... suspending!"); // $NON-NLS-1$
          fireSuspended(((TestSuspendedEvent) event).getScriptState());
          return;
        }
      }
    } catch (IOException e) {
      Log.error(e);
    } catch (RuntimeException e) {
      Log.error(e);
      try {
        endSession();
      } catch (Exception e1) {
      }
    }
  }
 private BreakpointData[] createBreakpointData() {
   IBreakpointManager bpm = getBreakpointManager();
   IBreakpoint[] breakpoints = bpm.getBreakpoints(LSLDebugTarget.LSLFORGE);
   LinkedList<BreakpointData> list = new LinkedList<BreakpointData>();
   for (int i = 0; i < breakpoints.length; i++) {
     try {
       if (breakpoints[i] instanceof LSLLineBreakpoint) {
         LSLLineBreakpoint bp = (LSLLineBreakpoint) breakpoints[i];
         int line = bp.getLineNumber();
         IMarker marker = bp.getMarker();
         IResource resource = marker.getResource();
         IFile file = (IFile) resource.getAdapter(IFile.class);
         if (file == null) continue;
         if (!marker.getAttribute(IBreakpoint.ENABLED, false)) continue;
         IPath fullPath = file.getLocation();
         list.add(new BreakpointData(fullPath.toOSString(), line));
       }
     } catch (CoreException e) {
       Log.error(e);
     }
   }
   return list.toArray(new BreakpointData[list.size()]);
 }