1 16 package com.blandware.atleap.webapp.util.core; 17 18 import jlibdiff.Diff; 19 import jlibdiff.Hunk; 20 import jlibdiff.HunkAdd; 21 import jlibdiff.HunkChange; 22 import jlibdiff.HunkDel; 23 import jlibdiff.HunkVisitor; 24 import org.apache.commons.logging.Log; 25 import org.apache.commons.logging.LogFactory; 26 27 import java.io.BufferedReader ; 28 import java.io.StringReader ; 29 import java.util.ArrayList ; 30 31 39 public class MergeUtil { 40 41 public static final int OLD_HTML = 0; 42 public static final int NEW_HTML = 1; 43 44 54 public static String mergeHtml(String oldString, String newString) { 55 Log log = LogFactory.getLog(MergeUtil.class); 56 57 final ArrayList hunks = new ArrayList (); 58 BufferedReader oldReader = new BufferedReader (new StringReader (oldString)); 59 BufferedReader newReader = new BufferedReader (new StringReader (newString)); 60 StringBuffer mergedHtml = new StringBuffer (); 61 62 try { 63 Diff diff = new Diff(); 64 diff.diffBuffer(oldReader, newReader); 65 diff.accept(new HunkVisitor() { 66 public void visitHunkAdd(HunkAdd hunkAdd) { 67 hunks.add(hunkAdd); 68 } 69 70 public void visitHunkChange(HunkChange hunkChange) { 71 hunks.add(hunkChange); 72 } 73 74 public void visitHunkDel(HunkDel hunkDel) { 75 hunks.add(hunkDel); 76 } 77 }); 78 79 int position = 0; 80 if ( hunks.size() != 0 ) { 81 for ( int i = 0; i < hunks.size(); i++ ) { 82 Hunk hunk = (Hunk) hunks.get(i); 83 84 if ( hunk instanceof HunkAdd ) { 85 mergedHtml.append(oldString.substring(position, getOffsetSOL(hunk.lowLine(OLD_HTML), oldString))) 86 .append("<div class=\"addHtml\">") 87 .append(newString.substring(getOffsetSOL(hunk.lowLine(NEW_HTML) - 1, newString), getOffsetEOL(hunk.highLine(NEW_HTML) - 1, newString))) 88 .append("</div>"); 89 position = getOffsetSOL(hunk.highLine(OLD_HTML), oldString); 90 } else if ( hunk instanceof HunkChange ) { 91 mergedHtml.append(oldString.substring(position, getOffsetSOL(hunk.lowLine(OLD_HTML) - 1, oldString))) 92 .append("<div class=\"oldHtml\">") 93 .append(oldString.substring(getOffsetSOL(hunk.lowLine(OLD_HTML) - 1, oldString), getOffsetEOL(hunk.highLine(OLD_HTML) - 1, oldString))) 94 .append("</div>\n") 95 .append("<div class=\"newHtml\">") 96 .append(newString.substring(getOffsetSOL(hunk.lowLine(NEW_HTML) - 1, newString), getOffsetEOL(hunk.highLine(NEW_HTML) - 1, newString))) 97 .append("</div>"); 98 position = getOffsetSOL(hunk.highLine(OLD_HTML), oldString); 99 } else { 100 mergedHtml.append(oldString.substring(position, getOffsetSOL(hunk.lowLine(OLD_HTML) - 1, oldString))) 101 .append("<div class=\"delHtml\">") 102 .append(oldString.substring(getOffsetSOL(hunk.lowLine(OLD_HTML) - 1, oldString), getOffsetEOL(hunk.highLine(OLD_HTML) - 1, oldString))) 103 .append("</div>"); 104 position = getOffsetSOL(hunk.highLine(OLD_HTML), oldString); 105 } 106 } 107 mergedHtml.append(oldString.substring(position)); 108 } else { 109 mergedHtml.append(oldString); 111 } 112 113 } catch ( Exception ex ) { 114 if ( log.isErrorEnabled() ) { 115 log.error("Cannot merge html cause" + ex.getLocalizedMessage(), ex); 116 } 117 } finally { 118 try { 119 oldReader.close(); 120 newReader.close(); 121 } catch ( Exception ex2 ) { 122 } 124 } 125 126 return mergedHtml.toString(); 127 } 128 129 139 public static String mergeText(String oldString, String newString) { 140 Log log = LogFactory.getLog(MergeUtil.class); 141 142 final ArrayList hunks = new ArrayList (); 143 BufferedReader oldReader = new BufferedReader (new StringReader (oldString)); 144 BufferedReader newReader = new BufferedReader (new StringReader (newString)); 145 StringBuffer mergedText = new StringBuffer (); 146 147 try { 148 Diff diff = new Diff(); 149 diff.diffBuffer(oldReader, newReader); 150 diff.accept(new HunkVisitor() { 151 public void visitHunkAdd(HunkAdd hunkAdd) { 152 hunks.add(hunkAdd); 153 } 154 155 public void visitHunkChange(HunkChange hunkChange) { 156 hunks.add(hunkChange); 157 } 158 159 public void visitHunkDel(HunkDel hunkDel) { 160 hunks.add(hunkDel); 161 } 162 }); 163 164 int position = 0; 165 if ( hunks.size() != 0 ) { 166 for ( int i = 0; i < hunks.size(); i++ ) { 167 Hunk hunk = (Hunk) hunks.get(i); 168 169 if ( hunk instanceof HunkAdd ) { 170 mergedText.append(oldString.substring(position, getOffsetSOL(hunk.lowLine(OLD_HTML), oldString))) 171 .append(">>>>>>>>>>>>>>>>>>>>") 172 .append(newString.substring(getOffsetSOL(hunk.lowLine(NEW_HTML) - 1, newString), getOffsetEOL(hunk.highLine(NEW_HTML) - 1, newString))) 173 .append(">>>>>>>>>>>>>>>>>>>>"); 174 position = getOffsetSOL(hunk.highLine(OLD_HTML), oldString); 175 } else if ( hunk instanceof HunkChange ) { 176 mergedText.append(oldString.substring(position, getOffsetSOL(hunk.lowLine(OLD_HTML) - 1, oldString))) 177 .append("<<<<<<<<<<<<<<<<<<<<") 178 .append(oldString.substring(getOffsetSOL(hunk.lowLine(OLD_HTML) - 1, oldString), getOffsetEOL(hunk.highLine(OLD_HTML) - 1, oldString))) 179 .append("\n<<<<<<<<<<<<<<<<<<<<\n") 180 .append(">>>>>>>>>>>>>>>>>>>>") 181 .append(newString.substring(getOffsetSOL(hunk.lowLine(NEW_HTML) - 1, newString), getOffsetEOL(hunk.highLine(NEW_HTML) - 1, newString))) 182 .append("\n>>>>>>>>>>>>>>>>>>>>"); 183 position = getOffsetSOL(hunk.highLine(OLD_HTML), oldString); 184 } else { 185 mergedText.append(oldString.substring(position, getOffsetSOL(hunk.lowLine(OLD_HTML) - 1, oldString))) 186 .append("--------------------") 187 .append(oldString.substring(getOffsetSOL(hunk.lowLine(OLD_HTML) - 1, oldString), getOffsetEOL(hunk.highLine(OLD_HTML) - 1, oldString))) 188 .append("--------------------"); 189 position = getOffsetSOL(hunk.highLine(OLD_HTML), oldString); 190 } 191 } 192 mergedText.append(oldString.substring(position)); 193 } else { 194 mergedText.append(oldString); 196 } 197 198 } catch ( Exception ex ) { 199 if ( log.isErrorEnabled() ) { 200 log.error("Cannot merge text cause" + ex.getLocalizedMessage(), ex); 201 } 202 } finally { 203 try { 204 oldReader.close(); 205 newReader.close(); 206 } catch ( Exception ex2 ) { 207 } 209 } 210 211 return mergedText.toString(); 212 } 213 214 215 222 protected static int getOffsetSOL(int linenumber, String buffer) { 223 if ( linenumber == 0 ) { 224 return 0; 225 } else { 226 int counter = 0; 227 int offset = -1; 228 int tmp = -1; 229 while ( counter < linenumber ) { 230 offset++; 231 counter++; 232 tmp = buffer.indexOf('\n', offset); 233 if ( tmp == -1 ) { 234 return buffer.length(); 235 } 236 offset = tmp; 237 } 238 return offset; 239 } 240 } 241 242 249 protected static int getOffsetEOL(int linenumber, String buffer) { 250 int offsetSOL = getOffsetSOL(linenumber, buffer); 251 int offsetEOL = buffer.indexOf('\n', offsetSOL + 1); 252 if ( offsetEOL == -1 ) { 253 return buffer.length(); 254 } else { 255 return offsetEOL; 256 } 257 } 258 259 281 282 } 283 | Popular Tags |