19 package org.sleuthkit.autopsy.casemodule;
22 import java.text.DateFormat;
23 import java.text.SimpleDateFormat;
24 import java.util.Date;
25 import java.util.logging.Level;
26 import javax.swing.JOptionPane;
27 import javax.swing.JPanel;
28 import javax.xml.parsers.*;
29 import javax.xml.transform.*;
30 import javax.xml.transform.dom.*;
31 import javax.xml.transform.stream.*;
32 import org.openide.util.NbBundle;
37 import org.xml.sax.SAXException;
49 class XMLCaseManagement
implements CaseConfigFileInterface {
51 final static String XSDFILE =
"CaseSchema.xsd";
52 final static String TOP_ROOT_NAME =
"AutopsyCase";
53 final static String CASE_ROOT_NAME =
"Case";
55 final static String NAME =
"Name";
56 final static String NUMBER =
"Number";
57 final static String EXAMINER =
"Examiner";
58 final static String CREATED_DATE_NAME =
"CreatedDate";
59 final static String MODIFIED_DATE_NAME =
"ModifiedDate";
60 final static String SCHEMA_VERSION_NAME =
"SchemaVersion";
61 final static String AUTOPSY_CRVERSION_NAME =
"AutopsyCreatedVersion";
62 final static String AUTOPSY_MVERSION_NAME =
"AutopsySavedVersion";
63 final static String CASE_TEXT_INDEX_NAME =
"TextIndexName";
65 final static String LOG_FOLDER_NAME =
"LogFolder";
66 final static String LOG_FOLDER_RELPATH =
"Log";
67 final static String TEMP_FOLDER_NAME =
"TempFolder";
68 final static String TEMP_FOLDER_RELPATH =
"Temp";
69 final static String EXPORT_FOLDER_NAME =
"ExportFolder";
70 final static String EXPORT_FOLDER_RELPATH =
"Export";
71 final static String CACHE_FOLDER_NAME =
"CacheFolder";
72 final static String CACHE_FOLDER_RELPATH =
"Cache";
73 final static String CASE_TYPE =
"CaseType";
74 final static String DATABASE_NAME =
"DatabaseName";
76 final static String RELATIVE_NAME =
"Relative";
78 final static String RELATIVE_TRUE =
"true";
79 final static String RELATIVE_FALSE =
"false";
83 private final DateFormat dateFormat =
new SimpleDateFormat(
"yyyy/MM/dd HH:mm:ss (z)");
84 private String caseDirPath;
85 private String caseName;
86 private String caseNumber;
87 private String examiner;
88 private final String schemaVersion =
"1.0";
89 private final String autopsySavedVersion;
90 private CaseType caseType;
91 private String dbName;
92 private String textIndexName;
95 private JPanel caller;
96 private final String className = this.getClass().toString();
97 private static final Logger logger = Logger.getLogger(XMLCaseManagement.class.getName());
102 public XMLCaseManagement() {
103 autopsySavedVersion = System.getProperty(
"netbeans.buildnumber");
111 private void setCaseDirPath(String givenPath) {
112 caseDirPath = givenPath;
121 public void setCaseName(String givenCaseName)
throws CaseActionException {
123 Element nameElement = (Element) getCaseElement().getElementsByTagName(NAME).item(0);
124 nameElement.setTextContent(givenCaseName);
128 String newDate = dateFormat.format(
new Date());
129 Element rootEl = getRootElement();
130 rootEl.getElementsByTagName(MODIFIED_DATE_NAME).item(0).setTextContent(newDate);
142 public void setCaseNumber(String givenCaseNumber)
throws CaseActionException {
144 Element nameElement = (Element) getCaseElement().getElementsByTagName(NUMBER).item(0);
145 nameElement.setTextContent(String.valueOf(givenCaseNumber));
149 String newDate = dateFormat.format(
new Date());
150 Element rootEl = getRootElement();
151 rootEl.getElementsByTagName(MODIFIED_DATE_NAME).item(0).setTextContent(newDate);
166 public void setCreatedDate(String createdDate)
throws CaseActionException {
167 String newDate = dateFormat.format(
new Date());
168 Element rootEl = getRootElement();
169 rootEl.getElementsByTagName(CREATED_DATE_NAME).item(0).setTextContent(createdDate);
170 rootEl.getElementsByTagName(MODIFIED_DATE_NAME).item(0).setTextContent(newDate);
180 public void setCaseExaminer(String givenExaminer)
throws CaseActionException {
182 Element nameElement = (Element) getCaseElement().getElementsByTagName(EXAMINER).item(0);
183 nameElement.setTextContent(givenExaminer);
187 String newDate = dateFormat.format(
new Date());
188 Element rootEl = getRootElement();
189 rootEl.getElementsByTagName(MODIFIED_DATE_NAME).item(0).setTextContent(newDate);
200 private void setName(String givenCaseName) {
201 caseName = givenCaseName;
209 private void setNumber(String givenCaseNumber) {
210 caseNumber = givenCaseNumber;
218 private void setCaseType(CaseType givenCaseType) {
219 caseType = givenCaseType;
228 public CaseType getCaseType() {
230 return CaseType.SINGLE_USER_CASE;
232 if (getCaseElement().getElementsByTagName(CASE_TYPE).getLength() > 0) {
233 Element nameElement = (Element) getCaseElement().getElementsByTagName(CASE_TYPE).item(0);
234 return CaseType.fromString(nameElement.getTextContent());
236 return CaseType.SINGLE_USER_CASE;
246 private void setDatabaseName(String givenDbName) {
247 dbName = givenDbName;
255 public String getDatabaseName() {
259 if (getCaseElement().getElementsByTagName(DATABASE_NAME).getLength() > 0) {
260 Element nameElement = (Element) getCaseElement().getElementsByTagName(DATABASE_NAME).item(0);
261 return nameElement.getTextContent();
274 private void setTextIndexName(String textIndexName) {
275 this.textIndexName = textIndexName;
283 public String getTextIndexName() {
287 if (getCaseElement().getElementsByTagName(CASE_TEXT_INDEX_NAME).getLength() > 0) {
288 Element nameElement = (Element) getCaseElement().getElementsByTagName(CASE_TEXT_INDEX_NAME).item(0);
289 return nameElement.getTextContent();
301 private void setExaminer(String givenExaminer) {
302 examiner = givenExaminer;
311 public String getCaseName() {
315 Element nameElement = (Element) getCaseElement().getElementsByTagName(NAME).item(0);
316 String result = nameElement.getTextContent();
327 public String getCaseNumber() {
331 Element numberElement = (Element) getCaseElement().getElementsByTagName(NUMBER).item(0);
332 String result =
"-1";
333 if (numberElement != null) {
334 result = numberElement.getTextContent();
346 public String getCaseExaminer() {
350 Element examinerElement = (Element) getCaseElement().getElementsByTagName(EXAMINER).item(0);
352 if (examinerElement != null) {
353 result = examinerElement.getTextContent();
364 public String getCaseDirectory() {
378 private Element getRootElement() {
380 return doc.getDocumentElement();
391 public String getCreatedDate() {
393 Element crDateElement = (Element) getRootElement().getElementsByTagName(CREATED_DATE_NAME).item(0);
394 return crDateElement.getTextContent();
405 protected String getModifiedDate() {
407 Element mDateElement = (Element) getRootElement().getElementsByTagName(MODIFIED_DATE_NAME).item(0);
408 return mDateElement.getTextContent();
419 protected String getCreatedVersion() {
421 Element crVerElement = (Element) getRootElement().getElementsByTagName(AUTOPSY_CRVERSION_NAME).item(0);
422 return crVerElement.getTextContent();
434 protected String getSavedVersion() {
436 Element mVerElement = (Element) getRootElement().getElementsByTagName(AUTOPSY_MVERSION_NAME).item(0);
437 return mVerElement.getTextContent();
448 protected String getSchemaVersion() {
450 Element schemaVerElement = (Element) getRootElement().getElementsByTagName(SCHEMA_VERSION_NAME).item(0);
451 return schemaVerElement.getTextContent();
462 private Element getCaseElement() {
464 return (Element) doc.getElementsByTagName(CASE_ROOT_NAME).item(0);
475 protected String getLogDir() {
477 Element logElement = (Element) getCaseElement().getElementsByTagName(LOG_FOLDER_NAME).item(0);
478 if (logElement.getAttribute(RELATIVE_NAME).equals(RELATIVE_TRUE)) {
479 return caseDirPath + File.separator + logElement.getTextContent();
481 return logElement.getTextContent();
493 protected String getTempDir() {
495 Element tempElement = (Element) getCaseElement().getElementsByTagName(TEMP_FOLDER_NAME).item(0);
496 if (tempElement.getAttribute(RELATIVE_NAME).equals(RELATIVE_TRUE)) {
497 return caseDirPath + File.separator + tempElement.getTextContent();
499 return tempElement.getTextContent();
511 protected String getExportDir() {
513 Element exportElement = (Element) getCaseElement().getElementsByTagName(EXPORT_FOLDER_NAME).item(0);
514 if (exportElement.getAttribute(RELATIVE_NAME).equals(RELATIVE_TRUE)) {
515 return caseDirPath + File.separator + exportElement.getTextContent();
517 return exportElement.getTextContent();
529 protected String getCacheDir() {
531 Element cacheElement = (Element) getCaseElement().getElementsByTagName(CACHE_FOLDER_NAME).item(0);
532 if (cacheElement.getAttribute(RELATIVE_NAME).equals(RELATIVE_TRUE)) {
533 return caseDirPath + File.separator + cacheElement.getTextContent();
535 return cacheElement.getTextContent();
556 public void create(String dirPath, String caseName, String examiner, String caseNumber, CaseType caseType, String dbName, String textIndexName)
throws CaseActionException {
560 setCaseDirPath(dirPath);
562 setExaminer(examiner);
563 setNumber(caseNumber);
564 setCaseType(caseType);
565 setDatabaseName(dbName);
566 setTextIndexName(textIndexName);
567 DocumentBuilder docBuilder;
568 DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
572 docBuilder = docFactory.newDocumentBuilder();
573 }
catch (ParserConfigurationException ex) {
575 throw new CaseActionException(
576 NbBundle.getMessage(
this.getClass(),
"XMLCaseManagement.create.exception.msg"), ex);
579 doc = docBuilder.newDocument();
580 Element rootElement = doc.createElement(TOP_ROOT_NAME);
581 doc.appendChild(rootElement);
583 Element crDateElement = doc.createElement(CREATED_DATE_NAME);
584 crDateElement.appendChild(doc.createTextNode(dateFormat.format(
new Date())));
585 rootElement.appendChild(crDateElement);
587 Element mDateElement = doc.createElement(MODIFIED_DATE_NAME);
588 mDateElement.appendChild(doc.createTextNode(dateFormat.format(
new Date())));
589 rootElement.appendChild(mDateElement);
591 Element autVerElement = doc.createElement(AUTOPSY_CRVERSION_NAME);
592 autVerElement.appendChild(doc.createTextNode(autopsySavedVersion));
593 rootElement.appendChild(autVerElement);
595 Element autSavedVerElement = doc.createElement(AUTOPSY_MVERSION_NAME);
596 autSavedVerElement.appendChild(doc.createTextNode(autopsySavedVersion));
597 rootElement.appendChild(autSavedVerElement);
599 Element schVerElement = doc.createElement(SCHEMA_VERSION_NAME);
600 schVerElement.appendChild(doc.createTextNode(schemaVersion));
601 rootElement.appendChild(schVerElement);
603 Element caseElement = doc.createElement(CASE_ROOT_NAME);
604 rootElement.appendChild(caseElement);
606 Element nameElement = doc.createElement(NAME);
607 nameElement.appendChild(doc.createTextNode(caseName));
608 caseElement.appendChild(nameElement);
610 Element numberElement = doc.createElement(NUMBER);
611 numberElement.appendChild(doc.createTextNode(String.valueOf(caseNumber)));
612 caseElement.appendChild(numberElement);
614 Element examinerElement = doc.createElement(EXAMINER);
615 examinerElement.appendChild(doc.createTextNode(examiner));
616 caseElement.appendChild(examinerElement);
618 Element exportElement = doc.createElement(EXPORT_FOLDER_NAME);
619 exportElement.appendChild(doc.createTextNode(EXPORT_FOLDER_RELPATH));
620 exportElement.setAttribute(RELATIVE_NAME,
"true");
621 caseElement.appendChild(exportElement);
623 Element logElement = doc.createElement(LOG_FOLDER_NAME);
624 logElement.appendChild(doc.createTextNode(LOG_FOLDER_RELPATH));
625 logElement.setAttribute(RELATIVE_NAME,
"true");
626 caseElement.appendChild(logElement);
628 Element tempElement = doc.createElement(TEMP_FOLDER_NAME);
629 tempElement.appendChild(doc.createTextNode(TEMP_FOLDER_RELPATH));
630 tempElement.setAttribute(RELATIVE_NAME,
"true");
631 caseElement.appendChild(tempElement);
633 Element cacheElement = doc.createElement(CACHE_FOLDER_NAME);
634 cacheElement.appendChild(doc.createTextNode(CACHE_FOLDER_RELPATH));
635 cacheElement.setAttribute(RELATIVE_NAME,
"true");
636 caseElement.appendChild(cacheElement);
638 Element typeElement = doc.createElement(CASE_TYPE);
639 typeElement.appendChild(doc.createTextNode(caseType.toString()));
640 caseElement.appendChild(typeElement);
642 Element dbNameElement = doc.createElement(DATABASE_NAME);
643 dbNameElement.appendChild(doc.createTextNode(dbName));
644 caseElement.appendChild(dbNameElement);
646 Element indexNameElement = doc.createElement(CASE_TEXT_INDEX_NAME);
647 indexNameElement.appendChild(doc.createTextNode(textIndexName));
648 caseElement.appendChild(indexNameElement);
659 public void writeFile() throws CaseActionException {
660 if (doc == null || caseName.equals(
"")) {
661 throw new CaseActionException(
662 NbBundle.getMessage(
this.getClass(),
"XMLCaseManagement.writeFile.exception.noCase.msg"));
666 Source source =
new DOMSource(doc);
669 StringWriter sw =
new StringWriter();
670 Result result =
new StreamResult(sw);
674 TransformerFactory tfactory = TransformerFactory.newInstance();
677 xformer = tfactory.newTransformer();
678 }
catch (TransformerConfigurationException ex) {
679 logger.log(Level.SEVERE,
"Could not setup tranformer and write case file");
680 throw new CaseActionException(
681 NbBundle.getMessage(
this.getClass(),
"XMLCaseManagement.writeFile.exception.errWriteToFile.msg"), ex);
685 xformer.setOutputProperty(OutputKeys.INDENT,
"yes");
686 xformer.setOutputProperty(
"{http://xml.apache.org/xslt}indent-amount",
"2");
689 xformer.transform(source, result);
690 }
catch (TransformerException ex) {
691 logger.log(Level.SEVERE,
"Could not run tranformer and write case file");
692 throw new CaseActionException(
693 NbBundle.getMessage(
this.getClass(),
"XMLCaseManagement.writeFile.exception.errWriteToFile.msg"), ex);
697 String xmlString = sw.toString();
698 File file =
new File(caseDirPath + File.separator + caseName +
".aut");
702 BufferedWriter bw =
new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(file)));
706 }
catch (IOException ex) {
707 logger.log(Level.SEVERE,
"Error writing to case file");
708 throw new CaseActionException(
709 NbBundle.getMessage(
this.getClass(),
"XMLCaseManagement.writeFile.exception.errWriteToFile.msg"), ex);
720 public void open(String conFilePath)
throws CaseActionException {
722 File file =
new File(conFilePath);
724 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
727 db = dbf.newDocumentBuilder();
728 doc = db.parse(file);
729 }
catch (ParserConfigurationException | SAXException | IOException ex) {
730 throw new CaseActionException(
731 NbBundle.getMessage(
this.getClass(),
"XMLCaseManagement.open.exception.errReadXMLFile.msg",
735 doc.getDocumentElement().normalize();
736 doc.getDocumentElement().normalize();
742 Element rootEl = doc.getDocumentElement();
743 String rootName = rootEl.getNodeName();
746 if (!rootName.equals(TOP_ROOT_NAME)) {
749 if (RuntimeProperties.coreComponentsAreActive()) {
751 JOptionPane.showMessageDialog(caller,
752 NbBundle.getMessage(
this.getClass(),
753 "XMLCaseManagement.open.msgDlg.notAutCase.msg",
754 file.getName(), className),
755 NbBundle.getMessage(
this.getClass(),
756 "XMLCaseManagement.open.msgDlg.notAutCase.title"),
757 JOptionPane.ERROR_MESSAGE);
763 String createdVersion = getCreatedVersion();
766 if (!createdVersion.equals(autopsySavedVersion)) {
768 getRootElement().getElementsByTagName(AUTOPSY_MVERSION_NAME).item(0).setTextContent(autopsySavedVersion);
774 String schemaVer = getSchemaVersion();
776 if (!schemaVer.equals(schemaVersion)) {
782 setCaseDirPath(file.getParent());
783 String fullFileName = file.getName();
784 String fileName = fullFileName.substring(0, fullFileName.lastIndexOf(
"."));
796 public void close() throws CaseActionException {
804 private void clear() {
810 caseType = CaseType.SINGLE_USER_CASE;