blob: 226e043dec250b9c48152771664ef73be28d9ceb [file] [log] [blame]
/*
* Copyright 2000-2011 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.
*/
package com.intellij.codeInspection.ex;
import com.intellij.codeInspection.InspectionApplication;
import com.intellij.codeInspection.InspectionsReportConverter;
import com.intellij.openapi.util.io.FileUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.xml.transform.*;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.List;
import java.util.Map;
/**
* @author Roman.Chernyatchik
*/
public class XSLTReportConverter implements InspectionsReportConverter {
private final String myXSLTSchemePath;
public XSLTReportConverter(@NotNull final String xsltSchemePath) {
myXSLTSchemePath = xsltSchemePath;
}
@Override
public String getFormatName() {
return "xslt";
}
@Override
public boolean useTmpDirForRawData() {
return true;
}
@Override
public void convert(@NotNull final String rawDataDirectoryPath,
@Nullable final String outputPath,
@NotNull final Map<String, Tools> tools,
@NotNull final List<File> inspectionsResults) throws InspectionsReportConverter.ConversionException {
if (outputPath == null) {
throw new ConversionException("Output path isn't specified.");
}
final SAXTransformerFactory transformerFactory = (SAXTransformerFactory)TransformerFactory.newInstance();
final Source xslSource;
final Transformer transformer;
try {
final File xsltSchemeFile = new File(myXSLTSchemePath);
if (!xsltSchemeFile.exists()) {
throw new ConversionException("Cannot find XSLT scheme: " + myXSLTSchemePath);
}
xslSource = new StreamSource(xsltSchemeFile);
transformer = transformerFactory.newTransformer(xslSource);
}
catch (TransformerConfigurationException e) {
throw new ConversionException("Fail to load XSLT scheme.");
}
final Writer w;
final File outputFile = new File(outputPath);
try {
w = new FileWriter(outputFile);
}
catch (IOException e) {
throw new ConversionException("Cannot edit file: " + outputFile.getPath());
}
try {
for (File inspectionData : inspectionsResults) {
if (inspectionData.isDirectory()) {
warn("Folder isn't expected here: " + inspectionData.getName());
continue;
}
final String fileNameWithoutExt = FileUtil.getNameWithoutExtension(inspectionData);
if (InspectionApplication.DESCRIPTIONS.equals(fileNameWithoutExt)) {
continue;
}
// Transform results:
try {
transformer.transform(new StreamSource(inspectionData), new StreamResult(w));
}
catch (TransformerException e) {
throw new ConversionException("Cannot apply XSL transformation: " + e.getMessage());
}
}
}
finally {
try {
w.close();
}
catch (IOException e) {
warn("Cannot save inspection results: " + e.getMessage());
}
}
}
private void warn(@NotNull final String msg) {
System.err.println(msg);
}
}