public static String getProjectName(URI uri) {
    if ("platform".equals(uri.scheme())) {
      if (uri.segmentCount() < 3) {
        return null;
      }

      String[] segments = uri.segments();
      if (!"resource".equals(segments[0])) {
        return null;
      }

      return segments[1];
    }

    if ("file".equals(uri.scheme())) {
      // TODO getLocation() not working for linked projects!!!
      String[] wsSegments = ResourcesHelper.ROOT.getLocation().segments();
      String[] uriSegments = uri.segments();
      if (uriSegments.length - 1 < wsSegments.length) {
        return null;
      }

      for (int i = 0; i < wsSegments.length; i++) {
        String wsSegment = wsSegments[i];
        String uriSegment = uriSegments[i];
        if (!uriSegment.equals(wsSegment)) {
          return null;
        }
      }

      return uriSegments[wsSegments.length];
    }

    return null;
  }
  public Set<IProject> getAllProjects() {
    Set<IProject> result = new HashSet<IProject>();
    result.add(getProject());

    for (IPath fullPath : inputToGenAppsMap.keySet()) {
      IResource resource = ResourcesHelper.ROOT.findMember(fullPath);
      if (resource != null) result.add(resource.getProject());
    }

    for (IPath fullPath : targetToGenAppsMap.keySet()) {
      IResource resource = ResourcesHelper.ROOT.findMember(fullPath);
      if (resource != null) result.add(resource.getProject());
    }

    return result;
  }
  public static IFile getFile(Resource resource) {
    URI uri = resource.getURI();
    if (!"platform".equals(uri.scheme())) {
      return null;
    }
    if (uri.segmentCount() < 3) {
      return null;
    }

    String[] segments = uri.segments();
    if (!"resource".equals(segments[0])) {
      return null;
    }

    IPath path = new Path("/");
    for (int i = 1; i < segments.length; i++) {
      path = path.append(segments[i]);
    }

    return ResourcesHelper.ROOT.getFile(path);
  }