19package org.sleuthkit.autopsy.casemodule;
21import java.io.BufferedWriter;
23import java.io.FileOutputStream;
24import java.io.IOException;
25import java.io.OutputStreamWriter;
26import java.io.StringWriter;
27import java.nio.charset.StandardCharsets;
28import java.nio.file.Path;
29import java.nio.file.Paths;
30import java.text.DateFormat;
31import java.text.SimpleDateFormat;
33import java.util.Locale;
34import javax.xml.parsers.DocumentBuilder;
35import javax.xml.parsers.DocumentBuilderFactory;
36import javax.xml.parsers.ParserConfigurationException;
37import javax.xml.transform.OutputKeys;
38import javax.xml.transform.Result;
39import javax.xml.transform.Source;
40import javax.xml.transform.Transformer;
41import javax.xml.transform.TransformerException;
42import javax.xml.transform.TransformerFactory;
43import javax.xml.transform.dom.DOMSource;
44import javax.xml.transform.stream.StreamResult;
45import org.apache.commons.lang3.StringUtils;
46import org.sleuthkit.autopsy.coreutils.Version;
47import org.sleuthkit.autopsy.coreutils.XMLUtil;
48import org.w3c.dom.Document;
49import org.w3c.dom.Element;
50import org.w3c.dom.NodeList;
51import org.xml.sax.SAXException;
56public final class CaseMetadata {
186 createdDate = CaseMetadata.DATE_FORMAT.format(
new Date());
214 final File[] files = directoryPath.toFile().listFiles();
216 for (File file : files) {
217 final String fileName = file.getName().toLowerCase();
218 if (fileName.endsWith(CaseMetadata.getFileExtension()) && file.isFile()) {
219 return file.toPath();
231 return this.contentProviderName;
249 return StringUtils.isBlank(this.caseDatabasePath)
251 : Paths.get(this.caseDatabasePath).getParent().toString();
292 this.caseDetails = newCaseDetails;
295 }
catch (CaseMetadataException ex) {
296 this.caseDetails = oldCaseDetails;
348 String oldCaseDatabaseName = this.caseDatabaseName;
352 }
catch (CaseMetadataException ex) {
353 this.caseDatabaseName = oldCaseDatabaseName;
390 }
catch (CaseMetadataException ex) {
391 this.createdDate = oldCreatedDate;
401 String getCreatedByVersion() {
413 void setCreatedByVersion(String buildVersion)
throws CaseMetadataException {
414 String oldCreatedByVersion = this.createdByVersion;
415 this.createdByVersion = buildVersion;
419 this.createdByVersion = oldCreatedByVersion;
435 Document doc = XMLUtil.createDocument();
442 Source source =
new DOMSource(doc);
443 StringWriter stringWriter =
new StringWriter();
444 Result streamResult =
new StreamResult(stringWriter);
445 Transformer transformer = TransformerFactory.newInstance().newTransformer();
446 transformer.setOutputProperty(OutputKeys.INDENT,
"yes");
447 transformer.setOutputProperty(
"{http://xml.apache.org/xslt}indent-amount",
"2");
448 transformer.transform(source, streamResult);
454 try (BufferedWriter fileWriter =
new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(
metadataFilePath.toFile()), StandardCharsets.UTF_8))) {
455 fileWriter.write(stringWriter.toString());
459 }
catch (ParserConfigurationException | TransformerException | IOException ex) {
472 doc.appendChild(rootElement);
479 rootElement.appendChild(caseElement);
482 rootElement.appendChild(contentProviderEl);
485 if (this.contentProviderName !=
null) {
486 contentProviderNameEl.setTextContent(this.contentProviderName);
488 contentProviderEl.appendChild(contentProviderNameEl);
499 rootElement.appendChild(originalCaseElement);
503 originalCaseElement.appendChild(originalCaseDetailsElement);
540 private void createChildElement(Document doc, Element parentElement, String elementName, String elementContent) {
541 Element element = doc.createElement(elementName);
542 element.appendChild(doc.createTextNode(elementContent));
543 parentElement.appendChild(element);
557 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
558 Document doc = builder.parse(this.
getFilePath().toFile());
559 doc.getDocumentElement().normalize();
560 Element rootElement = doc.getDocumentElement();
577 if (contentProviderEl !=
null) {
579 this.contentProviderName = contentProviderNameEl !=
null ? contentProviderNameEl.getTextContent() :
null;
581 this.contentProviderName =
null;
588 if (caseElements.getLength() == 0) {
591 Element caseElement = (Element) caseElements.item(0);
593 String caseDisplayName;
602 String examinerPhone;
603 String examinerEmail;
615 this.caseDetails =
new CaseDetails(caseDisplayName, caseNumber, examinerName, examinerPhone, examinerEmail, caseNotes);
617 if (
null == this.caseType) {
620 switch (schemaVersion) {
642 Path possibleAbsoluteCaseDbPath = Paths.get(this.caseDatabaseName);
644 if (possibleAbsoluteCaseDbPath.toFile().isAbsolute()) {
645 this.caseDatabasePath = this.caseDatabaseName;
646 this.caseDatabaseName = caseDirectoryPath.relativize(possibleAbsoluteCaseDbPath).toString();
649 }
catch (ParserConfigurationException | SAXException | IOException ex) {
655 NodeList nl = parent.getElementsByTagName(childTag);
656 if (nl !=
null && nl.getLength() > 0 && nl.item(0) instanceof Element) {
657 return (Element) nl.item(0);
676 NodeList elementsList = parentElement.getElementsByTagName(elementName);
677 if (elementsList.getLength() == 0) {
680 String textContent = elementsList.item(0).getTextContent();
681 if (textContent.isEmpty() && contentIsRequired) {
700 super(message, cause);
714 return StringUtils.isBlank(this.caseDatabasePath)
715 ? this.metadataFilePath.getParent().resolve(this.caseDatabaseName).toString()
716 : this.caseDatabasePath;
718 throw new UnsupportedOperationException();
String getExaminerPhone()
String getCaseDisplayName()
String getExaminerEmail()
static String getVersion()
static CaseType fromString(String typeName)