Java字符串的自动差异和合并

时间:2014-07-28 13:42:41

标签: java string diff

在我的系统中,用户可以通过代码编辑器或GUI对JBoss Drools代码进行更改。我的问题是,如果用户在代码编辑器中进行更改,然后在GUI中进行更改,则代码编辑器中的更改将丢失。因为GUI工具通过获取代码模板并插入通过参数进行的更改(FreeMarkerTemplateUtils.processTemplateIntoString)来工作。

是否有人对此问题有任何建议?

一种想法是使用Diff Match Patch以某种方式将GUI中的更改与代码编辑器中的更改合并。如果这是你可以分享一些代码的方式(我在网上找到的大部分内容仅用于比较文件,而不是用于从字符串生成实际差异)。

感谢。

1 个答案:

答案 0 :(得分:0)

首先假设,代码编辑器中的更改模式总是与GUI使用的一致?

例如,如果文件正文模式类似于

<some text .........>___ReplaceThisString__<some more text ..............>

如果是这样的话,你可以在GUI保存上编写一个方法,它可以像大多数代码库那样工作,就像SVN的diff和merge一样。

在代码编辑器(左侧)和GUI(右侧)保存的文件之间逐行比较,您将有3个条件,

  1. 仅左(通过代码编辑器内容更改一行)
  2. 仅在右侧(由GUI更改一行)
  3. 冲突(代码内容和GUI中的一行更改)
  4. 理想情况下,您可以毫无困难地合并左/右,并使用逻辑进行任何更改。

    对于第三种情况,您必须让用户决定采取什么措施来保持文件的正确性,否则文件可能无法通过下一个程序正常运行。

    为了让用户决定,您可以创建一个显示用户的比较窗口,两个文件的差异,让用户只需点击需要拍摄的文件。

    理想情况下,在所有情况下,最好显示diff并让用户确认合并没有破坏文件的内容完整性。

    这里有两件事很重要:

    A)合并功能应该用于代码编辑器以及GUI;每当有人试图从代码编辑器中保存一些东西。如果不能这样做(比如说你使用的是第三方的代码编辑器,例如记事本),你应该选择2步保存促销解决方案。

    在这种情况下,只保存不会更改实际文件,而是将文件写在不同的位置,作为临时文件。

    在步骤2中,“提升步骤” - 您应该有一个工具(使用上述策略构建一个)来比较临时文件和原始文件。然后,用户可以在视觉上合并更改。

    同样适用于GUI编辑器。

    B)无论何时进行比较和合并,都必须锁定原始文件以进行修改,以便其他用户不会更改文件,而有人正在合并。