可转移/ URL导出:在Java App和Mozilla之间传输书签数据

时间:2012-12-28 23:06:07

标签: java firefox mozilla data-transfer drag-and-drop

我正在编写一个Java应用程序,我想集成一个功能来修改Mozilla中的书签数据。这听起来很复杂,但这只是一个拖放问题:

1)我无法从Mozilla库中删除多个书签条目到我的Java应用程序,因为没有可用的DataFlavor。因此,显然,我无法从Transferable中读取原始数据,我得到了......单个条目带有78个DataFlavor。有没有办法让多个书签掉线?
我可以通过将所有书签导出到HTML并从我的应用程序中导入来解决这个问题,但这不是很愉快。

2)要弄清楚如何将任何URL导出到Mozilla书签也很困难。例如,最好的行为是Mozilla以与超链接相同的方式识别我的数据。删除链接,例如Google,从浏览器内部到书签库,立即创建一个名为“Google”和URL“http://www.google.com”的条目。我的应用程序虽然被迫返回java.io.Reader的实现,因为Mozilla Firefox库显然不接受任何其他内容。

TL; DR:有没有办法(通过拖放)这样我可以1)从Mozilla导入多个书签到Java App,2)将任何种类的可转移数据导出到Mozilla书签库,这样两个名称< / strong>和网址可由Firefox直接识别?

我希望我的问题很明确。

提前致意并表示感谢!

2 个答案:

答案 0 :(得分:1)

经过多次试验和错误,我注意到类型text/x-moz-url实际上根本不是文本类型,而是二进制类型。它永远不会有与之相关的字符集;它始终是UTF-16LE。

以下适用于我,至少在x86 Linux中,但它根本不适用于Windows版本的Firefox:

static class Bookmark
implements Transferable {

    private final String mimeType;
    private final byte[] bytes;

    Bookmark(String uri,
             String name) {
        String text = uri + "\r\n" + name;
        this.bytes = text.getBytes(StandardCharsets.UTF_16LE);
        this.mimeType = "text/x-moz-url";
    }

    public DataFlavor[] getTransferDataFlavors() {
        try {
            return new DataFlavor[] {
                new DataFlavor(mimeType + "; class=java.io.InputStream"),
                new DataFlavor(mimeType + "; class=java.nio.ByteBuffer"),
                new DataFlavor(mimeType + "; class=\"[B\""),
            };
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    public boolean isDataFlavorSupported(DataFlavor flavor) {
        return flavor.isMimeTypeEqual(mimeType);
    }

    public Object getTransferData(DataFlavor flavor)
    throws IOException,
           UnsupportedFlavorException {

        Class<?> cls = flavor.getRepresentationClass();
        if (cls.equals(byte[].class)) {
            return bytes;
        }
        if (cls.equals(ByteBuffer.class)) {
            return ByteBuffer.wrap(bytes);
        }
        if (cls.equals(InputStream.class)) {
            return new ByteArrayInputStream(bytes);
        }

        throw new UnsupportedFlavorException(flavor);
    }
}

它在Windows中不起作用的原因是Windows版本的Firefox显然没有使用text/x-moz-url。当我从Firefox拖动书签并打印出支持的DataFlavor时,text/x-moz-url根本不在列表中。仅支持字符串风格(包括text/htmltext/uri-list)以及其表示类为java.net.URL的风格,并且除了{{{{}}之外,其中任何一个都不能保存书签的名称。 1}},正如我上面提到的,似乎是Firefox可以提供但不接受的类型。

答案 1 :(得分:0)

截至2013年1月,在 Windows 7 的当前版本的Java(7u10)/ Firefox(17.0.1)上,似乎没有办法实现我想要的目标。

将多个书签拖放到Java应用程序中时没有任何DataFlavor,因此无法从中读取它们 将书签放入Firefox似乎也是不可能的 - 仅指定text/x-moz-url将使Firefox“接受”数据,但Firefox从不尝试从中读取(从不调用这些方法)。指定不仅仅text/x-moz-url(例如text/x-moz-url; class=java.io.Reader)会导致Firefox根本不接受数据。

除非有人能提供稳定的解决方案,否则这个问题在技术上得到了解答:

这是不可能的。