以编程方式从eclipse外部列出eclipse工作区中的打开项目

时间:2015-11-20 10:04:33

标签: java eclipse parsing workspace

我想编写一个Gradle插件,它可以检查eclipse工作区目录并遍历工作区内的打开项目并确定每个项目的位置。

这样的东西
Workspace workspace = EclipseUtils.parseWorkspace("c:/myEclipseWorkspace");
Collection<Project> projects = workspace.getProjects();
for (Project project : projects) {
   System.out.println(String.format("name=%s, location=%s, open=%s",
      project.getName(), project.getLocation(), project.isOpen()));
}

我查看了我的工作区,可以看到.location

下的一些c:\myEclipseWorkspace\.metadata\.plugins\org.eclipse.core.resources\.projects\个文件

但这些文件是自定义二进制格式     enter image description here

我是否可以调用eclipse API来解析这些?或者其他一些解决方案来迭代工作区中的打开项目。

请注意,我想在eclipse外部执行此操作,而不是在eclipse插件中执行此操作。

2 个答案:

答案 0 :(得分:3)

阅读私人描述以获取位置

由于您是用Java编写的,因此请重用外部位置的Eclipse代码。

即。从org.eclipse.core.resources.ResourcesPlugin中提取一些关键代码。从org.eclipse.core.resources.ResourcesPlugin.getWorkspace()的impl开始,然后前往org.eclipse.core.resources.IWorkspaceRoot.getProjects()

上面的代码在这里读取项目描述:org.eclipse.core.internal.resources.LocalMetaArea.readPrivateDescription(IProject, ProjectDescription)并且从org.eclipse.core.internal.localstore.FileSystemResourceManager.read(IProject, boolean)调用,其中有一些关于默认位置的逻辑。

这是EPL的乐趣,只要您的新程序/功能是EPL,您就可以重用Eclipse的核心代码来完成新的和精彩的事情。

读取工作区状态以获取打开/关闭状态

读取工作空间状态时,您将进入ElementTree数据结构。不使用ElementTree类读取它可能是不现实的。使用没有完整OSGi的ElementTree类可能是不现实的。我提供以下注释以帮助您。

向后工作:

  • ICoreConstants.M_OPEN是表示项目已打开或关闭的标志值(设置为打开,清除为关闭)
  • 在调用Project.isOpen()
  • 时测试M_OPEN
  • 运行时的标志位于ResourceInfo.flags
  • 标记由ResourceInfo.readFrom()
  • 调用的SaveManager.readElement()加载
  • 传递给input的{​​{3}} readElement来自.metadata/.plugins/org.eclipse.core.resources/.root/<id>.tree中工作空间元目录中存储的元素树。要使用的文件的特定版本(id)记录在安全表.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources
  • 安全表是存储在DataInput
  • 中的SaveManager内部状态的一部分

答案 1 :(得分:1)

我设法使用this作为参考来解析文件

    protected Location parseLocation(File locationFile) throws IOException {
        String name = locationFile.getParentFile().getName();
        DataInputStream in = new DataInputStream(new FileInputStream(locationFile));
        try {
            in.skip(ILocalStoreConstants.BEGIN_CHUNK.length);
            String path = in.readUTF();
            int numRefs = in.readInt();
            String[] refNames = new String[numRefs];
            for (int i = 0; i < numRefs; ++ i) {
                refNames[i] = in.readUTF();
            }
            in.skipBytes(ILocalStoreConstants.END_CHUNK.length);
            return new Location(name, path, refNames);
        } finally {
            in.close();
        }
    }

不幸的是,这似乎无法检测项目是否已关闭。关于获得封闭旗帜的任何指示都将非常感激