19 package org.sleuthkit.autopsy.casemodule;
 
   21 import java.io.BufferedWriter;
 
   22 import java.io.FileOutputStream;
 
   23 import java.io.IOException;
 
   24 import java.io.OutputStreamWriter;
 
   25 import java.io.StringWriter;
 
   26 import java.nio.file.Path;
 
   27 import java.nio.file.Paths;
 
   28 import java.text.DateFormat;
 
   29 import java.text.SimpleDateFormat;
 
   30 import java.util.Date;
 
   31 import javax.xml.parsers.DocumentBuilder;
 
   32 import javax.xml.parsers.DocumentBuilderFactory;
 
   33 import javax.xml.parsers.ParserConfigurationException;
 
   34 import javax.xml.transform.OutputKeys;
 
   35 import javax.xml.transform.Result;
 
   36 import javax.xml.transform.Source;
 
   37 import javax.xml.transform.Transformer;
 
   38 import javax.xml.transform.TransformerException;
 
   39 import javax.xml.transform.TransformerFactory;
 
   40 import javax.xml.transform.dom.DOMSource;
 
   41 import javax.xml.transform.stream.StreamResult;
 
   44 import org.w3c.dom.Document;
 
   45 import org.w3c.dom.Element;
 
   46 import org.w3c.dom.NodeList;
 
   47 import org.xml.sax.SAXException;
 
   55     private static final DateFormat 
DATE_FORMAT = 
new SimpleDateFormat(
"yyyy/MM/dd HH:mm:ss (z)");
 
  128         metadataFilePath = Paths.get(caseDirectory, caseDisplayName + FILE_EXTENSION);
 
  134         this.caseDatabaseName = caseDatabase;
 
  169         return metadataFilePath.getParent().toString();
 
  210         } 
catch (CaseMetadataException ex) {
 
  211             this.caseDisplayName = oldCaseName;
 
  249         String oldIndexName = caseTextIndexName;
 
  250         this.textIndexName = caseTextIndexName;
 
  253         } 
catch (CaseMetadataException ex) {
 
  254             this.textIndexName = oldIndexName;
 
  273     String getCreatedDate() {
 
  283     void setCreatedDate(String createdDate) 
throws CaseMetadataException {
 
  288         } 
catch (CaseMetadataException ex) {
 
  289             this.createdDate = oldCreatedDate;
 
  299     String getCreatedByVersion() {
 
  309     void setCreatedByVersion(String buildVersion) 
throws CaseMetadataException {
 
  311         this.createdByVersion = buildVersion;
 
  314         } 
catch (CaseMetadataException ex) {
 
  315             this.createdByVersion = oldCreatedByVersion;
 
  338             Source source = 
new DOMSource(doc);
 
  339             StringWriter stringWriter = 
new StringWriter();
 
  340             Result streamResult = 
new StreamResult(stringWriter);
 
  341             Transformer transformer = TransformerFactory.newInstance().newTransformer();
 
  342             transformer.setOutputProperty(OutputKeys.INDENT, 
"yes"); 
 
  343             transformer.setOutputProperty(
"{http://xml.apache.org/xslt}indent-amount", 
"2"); 
 
  344             transformer.transform(source, streamResult);
 
  349             try (BufferedWriter fileWriter = 
new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(metadataFilePath.toFile())))) {
 
  350                 fileWriter.write(stringWriter.toString());
 
  354         } 
catch (ParserConfigurationException | TransformerException | IOException ex) {
 
  355             throw new CaseMetadataException(String.format(
"Error writing to case metadata file %s", metadataFilePath), ex);
 
  366         Element rootElement = doc.createElement(ROOT_ELEMENT_NAME);
 
  367         doc.appendChild(rootElement);
 
  368         createChildElement(doc, rootElement, SCHEMA_VERSION_ELEMENT_NAME, CURRENT_SCHEMA_VERSION);
 
  370         createChildElement(doc, rootElement, MODIFIED_DATE_ELEMENT_NAME, DATE_FORMAT.format(
new Date()));
 
  371         createChildElement(doc, rootElement, AUTOPSY_CREATED_BY_ELEMENT_NAME, createdByVersion);
 
  373         Element caseElement = doc.createElement(CASE_ELEMENT_NAME);
 
  374         rootElement.appendChild(caseElement);
 
  380         createChildElement(doc, caseElement, CASE_DISPLAY_NAME_ELEMENT_NAME, caseDisplayName);
 
  384         createChildElement(doc, caseElement, CASE_DATABASE_ABSOLUTE_PATH_ELEMENT_NAME, caseDatabasePath);
 
  385         createChildElement(doc, caseElement, CASE_DATABASE_NAME_RELATIVE_ELEMENT_NAME, caseDatabaseName);
 
  398     private void createChildElement(Document doc, Element parentElement, String elementName, String elementContent) {
 
  399         Element element = doc.createElement(elementName);
 
  400         element.appendChild(doc.createTextNode(elementContent));
 
  401         parentElement.appendChild(element);
 
  415             DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
 
  416             Document doc = builder.parse(this.getFilePath().toFile());
 
  417             doc.getDocumentElement().normalize();
 
  418             Element rootElement = doc.getDocumentElement();
 
  419             if (!rootElement.getNodeName().equals(ROOT_ELEMENT_NAME)) {
 
  420                 throw new CaseMetadataException(
"Case metadata file corrupted");
 
  428             if (schemaVersion.equals(SCHEMA_VERSION_ONE)) {
 
  437             NodeList caseElements = doc.getElementsByTagName(CASE_ELEMENT_NAME);
 
  438             if (caseElements.getLength() == 0) {
 
  439                 throw new CaseMetadataException(
"Case metadata file corrupted");
 
  441             Element caseElement = (Element) caseElements.item(0);
 
  443             if (schemaVersion.equals(SCHEMA_VERSION_ONE) || schemaVersion.equals(SCHEMA_VERSION_TWO)) {
 
  452                 throw new CaseMetadataException(
"Case metadata file corrupted");
 
  454             if (schemaVersion.equals(SCHEMA_VERSION_ONE)) {
 
  457             } 
else if (schemaVersion.equals(SCHEMA_VERSION_TWO)) {
 
  458                 this.caseDatabaseName = 
getElementTextContent(caseElement, CASE_DATABASE_ABSOLUTE_PATH_ELEMENT_NAME, 
true);
 
  461                 this.caseDatabaseName = 
getElementTextContent(caseElement, CASE_DATABASE_NAME_RELATIVE_ELEMENT_NAME, 
true);
 
  471             Path possibleAbsoluteCaseDbPath = Paths.get(this.caseDatabaseName);
 
  473             if (possibleAbsoluteCaseDbPath.getNameCount() > 1) {
 
  475                 this.caseDatabaseName = caseDirectoryPath.relativize(possibleAbsoluteCaseDbPath).toString();
 
  477                 this.caseDatabasePath = caseDirectoryPath.resolve(caseDatabaseName).toAbsolutePath().toString();
 
  480         } 
catch (ParserConfigurationException | SAXException | IOException ex) {
 
  481             throw new CaseMetadataException(String.format(
"Error reading from case metadata file %s", metadataFilePath), ex);
 
  498         NodeList elementsList = parentElement.getElementsByTagName(elementName);
 
  499         if (elementsList.getLength() == 0) {
 
  500             throw new CaseMetadataException(String.format(
"Missing %s element from case metadata file %s", elementName, metadataFilePath));
 
  502         String textContent = elementsList.item(0).getTextContent();
 
  503         if (textContent.isEmpty() && contentIsRequired) {
 
  504             throw new CaseMetadataException(String.format(
"Empty %s element in case metadata file %s", elementName, metadataFilePath));
 
  522             super(message, cause);
 
  540             throw new UnsupportedOperationException();
 
static CaseType fromString(String typeName)
 
static Document createDocument()
 
static String getVersion()