|
Lines 224-298
Link Here
|
| 224 |
} |
224 |
} |
| 225 |
|
225 |
|
| 226 |
protected IModuleResourceDelta[] getDelta(IModuleResource[] original, IModuleResource[] current) { |
226 |
protected IModuleResourceDelta[] getDelta(IModuleResource[] original, IModuleResource[] current) { |
| 227 |
if (original == null || current == null) |
227 |
if (original == null || current == null) { |
|
|
228 |
// TODO does not make sense if either is not null |
| 228 |
return new IModuleResourceDelta[0]; |
229 |
return new IModuleResourceDelta[0]; |
| 229 |
|
|
|
| 230 |
List list = new ArrayList(); |
| 231 |
|
| 232 |
// look for duplicates |
| 233 |
List found = new ArrayList(); |
| 234 |
int size = original.length; |
| 235 |
int size2 = current.length; |
| 236 |
for (int i = 0; i < size; i++) { |
| 237 |
for (int j = 0; j < size2; j++) { |
| 238 |
if (!found.contains(original[i]) && !found.contains(current[j]) && original[i].equals(current[j])) { |
| 239 |
// found a match |
| 240 |
found.add(original[i]); |
| 241 |
if (original[i] instanceof IModuleFile) { |
| 242 |
// include files only if the modification stamp has changed |
| 243 |
IModuleFile mf1 = (IModuleFile) original[i]; |
| 244 |
IModuleFile mf2 = (IModuleFile) current[j]; |
| 245 |
if (mf1.getModificationStamp() != mf2.getModificationStamp()) { |
| 246 |
list.add(new ModuleResourceDelta(original[i], IModuleResourceDelta.CHANGED)); |
| 247 |
} |
| 248 |
} else { |
| 249 |
// include folders only if their contents have changed |
| 250 |
IModuleFolder mf1 = (IModuleFolder) original[i]; |
| 251 |
IModuleFolder mf2 = (IModuleFolder) current[j]; |
| 252 |
IModuleResourceDelta[] mrdc = getDelta(mf1.members(), mf2.members()); |
| 253 |
if (mrdc.length > 0) { |
| 254 |
ModuleResourceDelta mrd = new ModuleResourceDelta(original[i], IModuleResourceDelta.NO_CHANGE); |
| 255 |
mrd.setChildren(mrdc); |
| 256 |
list.add(mrd); |
| 257 |
} |
| 258 |
} |
| 259 |
} |
| 260 |
} |
| 261 |
} |
230 |
} |
| 262 |
|
231 |
|
| 263 |
// add deletions (unfound items in the original list) |
232 |
List result = new ArrayList(); |
| 264 |
for (int i = 0; i < size; i++) { |
233 |
|
| 265 |
if (!found.contains(original[i])) { |
234 |
// |
| 266 |
if (original[i] instanceof IModuleFile) { |
235 |
Map originalMap = new HashMap(); |
| 267 |
list.add(new ModuleResourceDelta(original[i], IModuleResourceDelta.REMOVED)); |
236 |
for (int i = 0; i < original.length; i++) { |
|
|
237 |
originalMap.put(original[i], original[i]); |
| 238 |
} |
| 239 |
|
| 240 |
// added and changed resources |
| 241 |
for (int i = 0; i < current.length; i++) { |
| 242 |
// HashMap#remove is as fast as #get, right? |
| 243 |
IModuleResource old = (IModuleResource) originalMap.remove(current[i]); |
| 244 |
if (old == null) { |
| 245 |
ModuleResourceDelta delta = new ModuleResourceDelta(current[i], IModuleResourceDelta.ADDED); |
| 246 |
if (current[i] instanceof IModuleFolder) { |
| 247 |
IModuleFolder currentFolder = (IModuleFolder) current[i]; |
| 248 |
delta.setChildren(getDeltaTree(currentFolder.members(), IModuleResourceDelta.ADDED)); |
| 249 |
} |
| 250 |
result.add(delta); |
| 251 |
} else { |
| 252 |
if (current[i] instanceof IModuleFile) { |
| 253 |
// include files only if the modification stamp has changed |
| 254 |
IModuleFile mf1 = (IModuleFile) old; |
| 255 |
IModuleFile mf2 = (IModuleFile) current[i]; |
| 256 |
if (mf1.getModificationStamp() != mf2.getModificationStamp()) { |
| 257 |
result.add(new ModuleResourceDelta(current[i], IModuleResourceDelta.CHANGED)); |
| 258 |
} |
| 268 |
} else { |
259 |
} else { |
| 269 |
IModuleFolder mf = (IModuleFolder) original[i]; |
260 |
// include folders only if their contents have changed |
| 270 |
ModuleResourceDelta mrd = new ModuleResourceDelta(original[i], IModuleResourceDelta.REMOVED); |
261 |
IModuleFolder mf1 = (IModuleFolder) old; |
| 271 |
IModuleResourceDelta[] mrdc = getDeltaTree(mf.members(), IModuleResourceDelta.REMOVED); |
262 |
IModuleFolder mf2 = (IModuleFolder) current[i]; |
| 272 |
mrd.setChildren(mrdc); |
263 |
IModuleResourceDelta[] mrdc = getDelta(mf1.members(), mf2.members()); |
| 273 |
list.add(mrd); |
264 |
if (mrdc.length > 0) { |
|
|
265 |
ModuleResourceDelta mrd = new ModuleResourceDelta(current[i], IModuleResourceDelta.NO_CHANGE); |
| 266 |
mrd.setChildren(mrdc); |
| 267 |
result.add(mrd); |
| 268 |
} |
| 274 |
} |
269 |
} |
| 275 |
} |
270 |
} |
| 276 |
} |
271 |
} |
| 277 |
|
272 |
|
| 278 |
// add additions (unfound items in the current list) |
273 |
// removed resources |
| 279 |
for (int j = 0; j < size2; j++) { |
274 |
for (int i = 0; i < original.length; i++) { |
| 280 |
if (!found.contains(current[j])) { |
275 |
if (!originalMap.containsKey(original[i])) continue; |
| 281 |
if (current[j] instanceof IModuleFile) { |
276 |
ModuleResourceDelta delta = new ModuleResourceDelta(original[i], IModuleResourceDelta.REMOVED); |
| 282 |
list.add(new ModuleResourceDelta(current[j], IModuleResourceDelta.ADDED)); |
277 |
if (original[i] instanceof IModuleFolder) { |
| 283 |
} else { |
278 |
IModuleFolder removedFolder = (IModuleFolder) original[i]; |
| 284 |
IModuleFolder mf = (IModuleFolder) current[j]; |
279 |
delta.setChildren(getDeltaTree(removedFolder.members(), IModuleResourceDelta.REMOVED)); |
| 285 |
ModuleResourceDelta mrd = new ModuleResourceDelta(current[j], IModuleResourceDelta.ADDED); |
|
|
| 286 |
IModuleResourceDelta[] mrdc = getDeltaTree(mf.members(), IModuleResourceDelta.ADDED); |
| 287 |
mrd.setChildren(mrdc); |
| 288 |
list.add(mrd); |
| 289 |
} |
| 290 |
} |
280 |
} |
|
|
281 |
result.add(delta); |
| 291 |
} |
282 |
} |
| 292 |
|
283 |
|
| 293 |
IModuleResourceDelta[] delta = new IModuleResourceDelta[list.size()]; |
284 |
return (IModuleResourceDelta[]) result.toArray(new IModuleResourceDelta[result.size()]); |
| 294 |
list.toArray(delta); |
|
|
| 295 |
return delta; |
| 296 |
} |
285 |
} |
| 297 |
|
286 |
|
| 298 |
protected boolean hasDelta(IModule[] module) { |
287 |
protected boolean hasDelta(IModule[] module) { |
|
Lines 315-365
Link Here
|
| 315 |
} |
304 |
} |
| 316 |
|
305 |
|
| 317 |
protected boolean hasDelta(IModuleResource[] original, IModuleResource[] current) { |
306 |
protected boolean hasDelta(IModuleResource[] original, IModuleResource[] current) { |
| 318 |
if (original == null || current == null) |
307 |
if (original == null || current == null) { |
|
|
308 |
// TODO does not make sense if either is not null |
| 319 |
return false; |
309 |
return false; |
| 320 |
|
|
|
| 321 |
// look for duplicates |
| 322 |
List found = new ArrayList(); |
| 323 |
int size = original.length; |
| 324 |
int size2 = current.length; |
| 325 |
for (int i = 0; i < size; i++) { |
| 326 |
for (int j = 0; j < size2; j++) { |
| 327 |
if (!found.contains(original[i]) && !found.contains(current[j]) && original[i].equals(current[j])) { |
| 328 |
// found a match |
| 329 |
found.add(original[i]); |
| 330 |
if (original[i] instanceof IModuleFile) { |
| 331 |
// include files only if the modification stamp has changed |
| 332 |
IModuleFile mf1 = (IModuleFile) original[i]; |
| 333 |
IModuleFile mf2 = (IModuleFile) current[j]; |
| 334 |
if (mf1.getModificationStamp() != mf2.getModificationStamp()) |
| 335 |
return true; |
| 336 |
} else { |
| 337 |
// include folders only if their contents have changed |
| 338 |
IModuleFolder mf1 = (IModuleFolder) original[i]; |
| 339 |
IModuleFolder mf2 = (IModuleFolder) current[j]; |
| 340 |
IModuleResourceDelta[] mrdc = getDelta(mf1.members(), mf2.members()); |
| 341 |
if (mrdc.length > 0) |
| 342 |
return true; |
| 343 |
} |
| 344 |
} |
| 345 |
} |
| 346 |
} |
310 |
} |
| 347 |
|
311 |
|
| 348 |
// add deletions (unfound items in the original list) |
312 |
// |
| 349 |
for (int i = 0; i < size; i++) { |
313 |
Map originalMap = new HashMap(); |
| 350 |
if (!found.contains(original[i])) { |
314 |
for (int i = 0; i < original.length; i++) { |
| 351 |
return true; |
315 |
originalMap.put(original[i], original[i]); |
| 352 |
} |
|
|
| 353 |
} |
316 |
} |
| 354 |
|
317 |
|
| 355 |
// add additions (unfound items in the current list) |
318 |
// added and changed resources |
| 356 |
for (int j = 0; j < size2; j++) { |
319 |
for (int i = 0; i < current.length; i++) { |
| 357 |
if (!found.contains(current[j])) { |
320 |
// HashMap#remove is as fast as #get, right? |
|
|
321 |
IModuleResource old = (IModuleResource) originalMap.remove(current[i]); |
| 322 |
if (old == null) { |
| 358 |
return true; |
323 |
return true; |
|
|
324 |
} else { |
| 325 |
if (current[i] instanceof IModuleFile) { |
| 326 |
// include files only if the modification stamp has changed |
| 327 |
IModuleFile mf1 = (IModuleFile) old; |
| 328 |
IModuleFile mf2 = (IModuleFile) current[i]; |
| 329 |
if (mf1.getModificationStamp() != mf2.getModificationStamp()) { |
| 330 |
return true; |
| 331 |
} |
| 332 |
} else { |
| 333 |
// include folders only if their contents have changed |
| 334 |
IModuleFolder mf1 = (IModuleFolder) old; |
| 335 |
IModuleFolder mf2 = (IModuleFolder) current[i]; |
| 336 |
return hasDelta(mf1.members(), mf2.members()); |
| 337 |
} |
| 359 |
} |
338 |
} |
| 360 |
} |
339 |
} |
| 361 |
|
340 |
|
| 362 |
return false; |
341 |
return !originalMap.isEmpty(); |
| 363 |
} |
342 |
} |
| 364 |
|
343 |
|
| 365 |
/** |
344 |
/** |