## Summary report

### Summary report example
```xml
<?xml version="1.0" encoding="UTF-8"?>
<ContentGroups>
  <!-- Example of a conforming file -->
  <ContentGroup>
    <AdditionalInformation>
      <AllowedItems>
        <AllowedItem InstanceCount="3">External Hyperlinks</AllowedItem>
        <AllowedItem InstanceCount="2">Metadata</AllowedItem>
      </AllowedItems>
      <SanitisationItems>
        <SanitisationItem InstanceCount="25">Embedded File</SanitisationItem>
      </SanitisationItems>
    </AdditionalInformation>
    <FileName>/home/glasswall/Documents/Example.doc</FileName>
    <ProcessMessage>Remedies Applied</ProcessMessage>
    <EngineOutcome>Managed</EngineOutcome>
    <LastErrorMessage/>
  </ContentGroup>
  <!-- Example of a non-conforming file -->
  <ContentGroup>
    <AdditionalInformation>
      <AllowedItems>
        <AllowedItem InstanceCount="22">Metadata</AllowedItem>
      </AllowedItems>
    </AdditionalInformation>
    <FileName>/home/glasswall/Documents/Example2.docx</FileName>
    <ProcessMessage>Issues Found</ProcessMessage>
    <EngineOutcome>Non-conforming</EngineOutcome>
    <LastErrorMessage>End of stream 'xl/workbook.xml' not reached</LastErrorMessage>
  </ContentGroup>
  <!-- Example of an unsupported file type when the skip unsupported file types flag is set to true -->
  <ContentGroup>
    <AdditionalInformation/>
    <FileName>/home/glasswall/Documents/UnsupportedFileType.cat</FileName>
    <ProcessMessage/>
    <EngineOutcome>Unsupported</EngineOutcome>
    <LastErrorMessage>Skipping unsupported filetype</LastErrorMessage>
  </ContentGroup>
  <!-- Example of an unsupported file type when the skip unsupported file types flag is set to false -->
  <ContentGroup>
    <AdditionalInformation/>
    <FileName>/home/glasswall/Documents/UnsupportedFileType.cat</FileName>
    <ProcessMessage>Issues Found</ProcessMessage>
    <EngineOutcome>Non-conforming</EngineOutcome>
    <LastErrorMessage>Unable to determine file type</LastErrorMessage>
  </ContentGroup>
</ContentGroups>
```

### API

#### Constructors
```java
SummaryReport() throws ParserConfigurationException, DOMException
SummaryReport(boolean skipUnsupportedFileTypes) throws ParserConfigurationException, DOMException
```

**Parameters**:
- `boolean skipUnsupportedFileTypes` - This sets the skipUnsupportedFileTypes flag. If this flag is not specified then the skip unsupported file types will be set to `false`.

#### Instance methods
```java
void setSkipUnsupportedFileTypes(boolean skipUnsupportedFileTypes)
```

Setter for the skip unsupported file types flag.

**Parameters**:
- `boolean skipUnsupportedFileTypes` - This sets the skip unsupported file types flag.

---

```java
boolean getSkipUnsupportedFileTypes()
```
Getter for the skip unsupported file types flag.

**Returns**:
`true` if unsupported file types should be skipped, and `false` otherwise.

---

```java
void addAnalysisReport(
        Path inputFilePath,
        int sessionStatus,
        String lastErrorMessage,
        String processMessage,
        InputStream analysisInputStream
    ) throws SAXException, ParserConfigurationException, IOException
```

Add a new Glasswall analysis report to the summary report.

**Parameters**:
- `Path inputFilePath` - The file path of the file that was processed.
- `int sessionStatus` - The return status from [GW2RunSession](/embedded-engine/embedded-engine-gw2runsession).
- `String lastErrorMessage` - The error message from [GW2FileErrorMsg]/embedded-engine/embedded-engine-gw2fileerrormsg). If this is null or empty then it won't be included in the summary report.
- `String processMessage` - The process message from [GW2FileSessionStatus](/embedded-engine/embedded-engine-gw2filesessionstatus). If this null or empty then it won't be included in the summary report.
- `InputStream analysisInputStream` - Input stream containing the analysis report to be included.

---

```java
void addAnalysisReport(FileSummary summary) throws SAXException, ParserConfigurationException, IOException
```

Add a new Glasswall file summary to the summary report.

**Parameters**:
- `FileSummary summary` - The summary information to be added to the summary report.

---

```java
public void generateSummaryReport(Writer writer) throws TransformerConfigurationException, TransformerException
```

Generate a XML summary report from the provided analysis reports.

**Parameters**:
- `Writer writer` - A writer where the summary report will be written to.

---

```java
public void generateSummaryReport(Writer writer, Transformer transformer) throws TransformerException
```

Generate a XML summary report from the provided analysis reports using the specified transformer.

**Parameters**:
- `Writer writer` - A writer where the summary report will be written to.
- `Transformer transformer` - The transformer that will be used for generating the XML report.


### API example

The summary report functionality is implemented in `com.glasswall.analysissummary.SummaryReport` class. First an instance of the class is created, `addAnalysisReport` is then called for each analysis report that will be included in the summary report, and then `generateSummaryReport` is called at the end to generate the summary report. An example can be seen below:

```java
File input_directory = new File("Input");
File output_directory = new File("Output");

output_directory.mkdirs();

SummaryReport summary_report = new SummaryReport();
summary_report.setSkipUnsupportedFileTypes(true); // Optionally set the skip unsupported file types flag

for (File file : input_directory.listFiles())
{
    if (file.isDirectory())
        continue;

    try (Core2JavaBridge gw = new Core2JavaBridge())
    {
        // Create the output path for file and analysis report
        String file_output_path = Paths.get(output_directory.getAbsolutePath().toString(), file.getName()).toString();
        String analysis_output_path = file_output_path + ".xml";

        // Run the file through the Glasswall engine
        int session = gw.GW2OpenSession();
        gw.GW2RegisterInputFile(session, file.getAbsolutePath());
        gw.GW2RegisterAnalysisFile(session, analysis_output_path, 0);
        gw.GW2RegisterOutFile(session, file_output_path);
        int run_status = gw.GW2RunSession(session);

        // Retrieve the error message if the file is non-conforming
        String error_message = null;

        if (run_status < 0)
            error_message = gw.GW2FileErrorMsgString(session);

        // Retrieve the session status along with the session description
        FileSessionStatus session_status = gw.GW2FileSessionStatusResult(session);

        // Add the analysis report to the summary report
        try (FileInputStream stream = new FileInputStream(analysis_output_path))
        {
            summary_report.addAnalysisReport(file.toPath(), run_status, error_message, session_status.summaryDescription, stream);
        }
    }
    catch (Exception ex)
    {
        System.err.println("Exception occurred: " + ex.getMessage());
    }
}

// Write the summary report to `SummaryReport.xml` file
try (BufferedWriter writer = Files.newBufferedWriter(
        Paths.get(output_directory.getAbsolutePath().toString(), "SummaryReport.xml"), 
        StandardCharsets.UTF_8, 
        StandardOpenOption.TRUNCATE_EXISTING, 
        StandardOpenOption.CREATE, 
        StandardOpenOption.WRITE))
{
    summary_report.generateSummaryReport(writer);
}
```