private void compareFile(File sourceFile, File targetFile, ObjDiffNode objDiffNode, String indent) throws IOException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException {
		
		//boolean isMetadataEqual = FileUtils.contentEquals(sourceFile, targetFile);
		boolean isMetadataEqual = isFileContentEqual(sourceFile.getAbsolutePath(), targetFile.getAbsolutePath());
		boolean isContentEqual = false;
		boolean hasContent = false;
		
		System.out.println(indent + "  " + sourceFile.getName() + " <--> " + targetFile.getName() + " " + isMetadataEqual);
		
		if (sourceFile.getName().endsWith(CONTENT_FILENAME_PATTERN)) {
			String sourceContentFileName = sourceFile.getAbsolutePath().substring(0,  sourceFile.getAbsolutePath().length() - CONTENT_FILENAME_PATTERN.length());
			if (contentPattern.matcher(sourceContentFileName).find()) {
				hasContent = true;
				String targetContentFileName = targetFile.getAbsolutePath().substring(0,  targetFile.getAbsolutePath().length() - CONTENT_FILENAME_PATTERN.length());
				if (isTextFile(sourceContentFileName)) {
					/*
					diff_match_patch diff = new diff_match_patch();
					LinkedList<Diff> d = diff.diff_main(readTextFile(sourceContentFileName), 
							readTextFile(targetContentFileName));
					
					Diff dif = d.getFirst();

					isContentEqual = (d.size() == 1 && dif.operation.name().equals("EQUAL"));
					*/
					isContentEqual = isFileContentEqual(sourceContentFileName, targetContentFileName);
				}
				/*
				if (targetContentFileName.endsWith(".cls") || targetContentFileName.endsWith(".component") ||
						targetContentFileName.endsWith(".page")) {
					String content1 = FileUtils.readFileToString(new File(sourceContentFileName));
					String content2 = FileUtils.readFileToString(new File(targetContentFileName));
					isContentEqual = content1.trim().equals(content2.trim());
				}*/
				else {
					isContentEqual = FileUtils.contentEquals(new File(sourceContentFileName), 
							new File(targetContentFileName));
				}
			}
		}
		
		
		if (isContentEqual && isMetadataEqual)
			return;
		
		if (!hasContent && isMetadataEqual)
			return;
		
		copyMetadataFileToUpsert(sourceFile.getAbsolutePath());

		Metadata sourceData = readMetadata(sourceFile);
		Metadata targetData = readMetadata(targetFile);
		objDiffNode.setFileName(sourceFile.getName());
		objDiffNode.setMetadataClassName(sourceData.getClass().getName());

		if (isMetadataEqual && !isContentEqual) {
			ObjDiffNode.AttrDiffNode attrDiffNode = new ObjDiffNode.AttrDiffNode("Content");
			attrDiffNode.setSourceValue("Content 1");;
			attrDiffNode.setTargetValue("Content 2");
			objDiffNode.addAttrDiff(attrDiffNode);
			return;
		}
		
        compareObject(sourceData, targetData, objDiffNode, indent);
	}