151 Files.createDirectories(reportDirectory);
152 }
catch (IOException ex) {
153 logger.log(Level.WARNING,
"Unable to create directory for CASE-UCO report.", ex);
155 Bundle.CaseUcoReportModule_unableToCreateDirectories());
163 try (OutputStream stream =
new FileOutputStream(caseJsonReportFile.toFile());
164 JsonWriter reportWriter =
new JsonWriter(
new OutputStreamWriter(stream,
"UTF-8"))) {
165 Gson gson =
new GsonBuilder().setPrettyPrinting().create();
166 reportWriter.setIndent(
" ");
167 reportWriter.beginObject();
168 reportWriter.name(
"@graph");
169 reportWriter.beginArray();
171 CaseUcoExporter exporter =
new CaseUcoExporter(currentCase.
getSleuthkitCase());
172 for (JsonElement element : exporter.exportSleuthkitCase()) {
173 gson.toJson(element, reportWriter);
181 progressPanel.
start();
186 for (
int i = 0; i < dataSources.size(); i++) {
187 DataSource dataSource = dataSources.get(i);
189 Bundle.CaseUcoReportModule_processingDataSource(),
190 dataSource.getName()));
192 for (JsonElement element : exporter.exportDataSource(dataSource)) {
193 gson.toJson(element, reportWriter);
201 Set<Long> dataSourceIds = dataSources.stream()
202 .map((datasource) -> datasource.getId())
203 .collect(Collectors.toSet());
205 logger.log(Level.INFO,
"Writing all artifacts to the CASE-UCO report. "
206 +
"Keyword hits will be skipped as they can't be represented"
207 +
" in CASE format.");
211 for (ARTIFACT_TYPE artType : currentCase.
getSleuthkitCase().getBlackboardArtifactTypesInUse()) {
212 if(artType.equals(BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT)) {
217 for (BlackboardArtifact artifact : currentCase.
getSleuthkitCase().getBlackboardArtifacts(artType)) {
218 if (dataSourceIds.contains(artifact.getDataSource().getId())) {
220 for (JsonElement element : exporter.exportBlackboardArtifact(artifact)) {
221 gson.toJson(element, reportWriter);
223 }
catch (ContentNotExportableException ex) {
224 logger.log(Level.INFO, String.format(
"Unable to export blackboard artifact (id: %d, type: %d) to CASE/UCO. "
225 +
"The artifact type is either not supported or the artifact instance does not have any "
226 +
"exportable attributes.", artifact.getId(), artType.getTypeID()));
227 }
catch (BlackboardJsonAttrUtil.InvalidJsonException ex) {
228 logger.log(Level.WARNING, String.format(
"Artifact instance (id: %d, type: %d) contained a "
229 +
"malformed json attribute.", artifact.getId(), artType.getTypeID()), ex);
235 reportWriter.endArray();
236 reportWriter.endObject();
239 currentCase.
addReport(caseJsonReportFile.toString(),
240 Bundle.CaseUcoReportModule_srcModuleName(),
243 }
catch (IOException ex) {
244 logger.log(Level.WARNING,
"I/O error encountered while generating the report.", ex);
246 Bundle.CaseUcoReportModule_ioError());
248 logger.log(Level.WARNING,
"No case open.", ex);
250 Bundle.CaseUcoReportModule_noCaseOpen());
251 }
catch (TskCoreException ex) {
252 logger.log(Level.WARNING,
"TskCoreException encounted while generating the report.", ex);
254 String.format(Bundle.CaseUcoReportModule_tskCoreException(), ex.toString()));
288 Gson gson, CaseUcoExporter exporter, JsonWriter reportWriter)
throws IOException, TskCoreException {
290 Deque<Content> stack =
new ArrayDeque<>();
291 stack.addAll(dataSource.getChildren());
294 while (!stack.isEmpty()) {
295 Content current = stack.pop();
296 if (current instanceof AbstractFile) {
297 AbstractFile
file = (AbstractFile) (current);
300 for (JsonElement element : exporter.exportAbstractFile(
file)) {
301 gson.toJson(element, reportWriter);
306 for (Content child : current.getChildren()) {