blob: e99279d1085792fa7529231dd16a42501e0babd1 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* Created by IntelliJ IDEA.
* User: max
* Date: Jun 21, 2002
* Time: 7:36:28 PM
* To change template for new class use
* Code Style | Class Templates options (Tools | IDE Options).
*/
package com.intellij.codeInspection;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.JDOMUtil;
import com.intellij.util.containers.HashMap;
import org.jdom.Document;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class InspectionDiff {
private static HashMap<String, ArrayList<Element>> ourFileToProblem;
@NonNls
private static final String FILE_ELEMENT = "file";
@NonNls
private static final String CLASS_ELEMENT = "class";
@NonNls
private static final String FIELD_ELEMENT = "field";
@NonNls
private static final String METHOD_ELEMENT = "method";
@NonNls
private static final String CONSTRUCTOR_ELEMENT = "constructor";
@NonNls
private static final String INTERFACE_ELEMENT = "interface";
@NonNls
private static final String PROBLEM_CLASS_ELEMENT = "problem_class";
@NonNls
private static final String DESCRIPTION_ELEMENT = "description";
public static void main(String[] args) {
if (args.length != 3 && args.length != 2) {
System.out.println(InspectionsBundle.message("inspection.diff.format.error"));
}
String oldPath = args[0];
String newPath = args[1];
String outPath = args.length == 3 ? args[2] : null;
final File oldResults = new File(oldPath);
final File newResults = new File(newPath);
if (oldResults.isDirectory() && newResults.isDirectory()) {
final File[] old = oldResults.listFiles();
final File[] results = newResults.listFiles();
for (File result : results) {
final String inspectionName = result.getName();
boolean found = false;
for (File oldFile : old) {
if (oldFile.getName().equals(inspectionName)) {
writeInspectionDiff(oldFile.getPath(), result.getPath(), outPath);
found = true;
break;
}
}
if (!found) {
writeInspectionDiff(null, result.getPath(), outPath);
}
}
}
}
private static void writeInspectionDiff(final String oldPath, final String newPath, final String outPath) {
try {
InputStream oldStream = oldPath != null ? new BufferedInputStream(new FileInputStream(oldPath)) : null;
InputStream newStream = new BufferedInputStream(new FileInputStream(newPath));
Document oldDoc = oldStream != null ? JDOMUtil.loadDocument(oldStream) : null;
Document newDoc = JDOMUtil.loadDocument(newStream);
OutputStream outStream = System.out;
if (outPath != null) {
outStream = new BufferedOutputStream(new FileOutputStream(outPath + File.separator + new File(newPath).getName()));
}
Document delta = createDelta(oldDoc, newDoc);
JDOMUtil.writeDocument(delta, outStream, "\n");
if (outStream != System.out) {
outStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings({"HardCodedStringLiteral"})
private static Document createDelta(@Nullable Document oldDoc, Document newDoc) {
Element newRoot = newDoc.getRootElement();
ourFileToProblem = new HashMap<String, ArrayList<Element>>();
List newProblems = newRoot.getChildren("problem");
for (final Object o : newProblems) {
Element newProblem = (Element)o;
addProblem(newProblem);
}
if (oldDoc != null) {
List oldProblems = oldDoc.getRootElement().getChildren("problem");
for (final Object o : oldProblems) {
Element oldProblem = (Element)o;
if (!removeIfEquals(oldProblem)) {
addProblem(oldProblem);
}
}
}
Element root = new Element("problems");
Document delta = new Document(root);
for (ArrayList<Element> fileList : ourFileToProblem.values()) {
if (fileList != null) {
for (Element element : fileList) {
root.addContent((Element)element.clone());
}
}
}
return delta;
}
private static boolean removeIfEquals(Element problem) {
String fileName = problem.getChildText(FILE_ELEMENT);
ArrayList<Element> problemList = ourFileToProblem.get(fileName);
if (problemList != null) {
Element[] problems = problemList.toArray(new Element[problemList.size()]);
for (Element toCheck : problems) {
if (equals(problem, toCheck)) return problemList.remove(toCheck);
}
}
return false;
}
private static void addProblem(Element problem) {
String fileName = problem.getChildText(FILE_ELEMENT);
ArrayList<Element> problemList = ourFileToProblem.get(fileName);
if (problemList == null) {
problemList = new ArrayList<Element>();
ourFileToProblem.put(fileName, problemList);
}
problemList.add(problem);
}
private static boolean equals(Element oldProblem, Element newProblem) {
if (!Comparing.equal(oldProblem.getChildText(CLASS_ELEMENT), newProblem.getChildText(CLASS_ELEMENT))) return false;
if (!Comparing.equal(oldProblem.getChildText(FIELD_ELEMENT), newProblem.getChildText(FIELD_ELEMENT))) return false;
if (!Comparing.equal(oldProblem.getChildText(METHOD_ELEMENT), newProblem.getChildText(METHOD_ELEMENT))) return false;
if (!Comparing.equal(oldProblem.getChildText(CONSTRUCTOR_ELEMENT), newProblem.getChildText(CONSTRUCTOR_ELEMENT))) return false;
if (!Comparing.equal(oldProblem.getChildText(INTERFACE_ELEMENT), newProblem.getChildText(INTERFACE_ELEMENT))) return false;
if (!Comparing.equal(oldProblem.getChildText(PROBLEM_CLASS_ELEMENT), newProblem.getChildText(PROBLEM_CLASS_ELEMENT))) return false;
if (!Comparing.equal(oldProblem.getChildText(DESCRIPTION_ELEMENT), newProblem.getChildText(DESCRIPTION_ELEMENT))) return false;
return true;
}
}