Autopsy  4.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
XMLCaseManagement.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2012-2015 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.casemodule;
20 
21 import java.io.*;
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;
36 import org.w3c.dom.*;
37 import org.xml.sax.SAXException;
38 
49 class XMLCaseManagement implements CaseConfigFileInterface {
50 
51  final static String XSDFILE = "CaseSchema.xsd"; //NON-NLS
52  final static String TOP_ROOT_NAME = "AutopsyCase"; //NON-NLS
53  final static String CASE_ROOT_NAME = "Case"; //NON-NLS
54  // general metadata about the case file
55  final static String NAME = "Name"; //NON-NLS
56  final static String NUMBER = "Number"; //NON-NLS
57  final static String EXAMINER = "Examiner"; //NON-NLS
58  final static String CREATED_DATE_NAME = "CreatedDate"; //NON-NLS
59  final static String MODIFIED_DATE_NAME = "ModifiedDate"; //NON-NLS
60  final static String SCHEMA_VERSION_NAME = "SchemaVersion"; //NON-NLS
61  final static String AUTOPSY_CRVERSION_NAME = "AutopsyCreatedVersion"; //NON-NLS
62  final static String AUTOPSY_MVERSION_NAME = "AutopsySavedVersion"; //NON-NLS
63  final static String CASE_TEXT_INDEX_NAME = "TextIndexName"; //NON-NLS
64  // folders inside case directory
65  final static String LOG_FOLDER_NAME = "LogFolder"; //NON-NLS
66  final static String LOG_FOLDER_RELPATH = "Log"; //NON-NLS
67  final static String TEMP_FOLDER_NAME = "TempFolder"; //NON-NLS
68  final static String TEMP_FOLDER_RELPATH = "Temp"; //NON-NLS
69  final static String EXPORT_FOLDER_NAME = "ExportFolder"; //NON-NLS
70  final static String EXPORT_FOLDER_RELPATH = "Export"; //NON-NLS
71  final static String CACHE_FOLDER_NAME = "CacheFolder"; //NON-NLS
72  final static String CACHE_FOLDER_RELPATH = "Cache"; //NON-NLS
73  final static String CASE_TYPE = "CaseType"; //NON-NLS
74  final static String DATABASE_NAME = "DatabaseName"; //NON-NLS
75  // folders attribute
76  final static String RELATIVE_NAME = "Relative"; // relevant path info NON-NLS
77  // folder attr values
78  final static String RELATIVE_TRUE = "true"; // if it's a relative path NON-NLS
79  final static String RELATIVE_FALSE = "false"; // if it's not a relative path NON-NLS
80  // the document
81  private Document doc;
82  // general info
83  private final DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss (z)");
84  private String caseDirPath; // case directory path
85  private String caseName; // case name
86  private String caseNumber; // case number
87  private String examiner; // examiner name
88  private final String schemaVersion = "1.0";
89  private final String autopsySavedVersion;
90  private CaseType caseType; // The type of case: local or shared
91  private String dbName; // The name of the database
92  private String textIndexName; // The name of the index where extracted text is stored.
93 
94  // for error handling
95  private JPanel caller;
96  private final String className = this.getClass().toString();
97  private static final Logger logger = Logger.getLogger(XMLCaseManagement.class.getName());
98 
102  public XMLCaseManagement() {
103  autopsySavedVersion = System.getProperty("netbeans.buildnumber");
104  }
105 
111  private void setCaseDirPath(String givenPath) {
112  caseDirPath = givenPath; // change this to change the xml file if needed
113  }
114 
120  @Override
121  public void setCaseName(String givenCaseName) throws CaseActionException {
122  // change this to change the xml file if needed
123  Element nameElement = (Element) getCaseElement().getElementsByTagName(NAME).item(0);
124  nameElement.setTextContent(givenCaseName);
125  doc.normalize();
126 
127  // edit the modified data
128  String newDate = dateFormat.format(new Date());
129  Element rootEl = getRootElement();
130  rootEl.getElementsByTagName(MODIFIED_DATE_NAME).item(0).setTextContent(newDate);
131 
132  writeFile();
133 
134  }
135 
141  @Override
142  public void setCaseNumber(String givenCaseNumber) throws CaseActionException {
143  // change this to change the xml file if needed
144  Element nameElement = (Element) getCaseElement().getElementsByTagName(NUMBER).item(0);
145  nameElement.setTextContent(String.valueOf(givenCaseNumber));
146  doc.normalize();
147 
148  // edit the modified data
149  String newDate = dateFormat.format(new Date());
150  Element rootEl = getRootElement();
151  rootEl.getElementsByTagName(MODIFIED_DATE_NAME).item(0).setTextContent(newDate);
152 
153  writeFile();
154 
155  }
156 
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);
171  writeFile();
172  }
173 
179  @Override
180  public void setCaseExaminer(String givenExaminer) throws CaseActionException {
181  // change this to change the xml file if needed
182  Element nameElement = (Element) getCaseElement().getElementsByTagName(EXAMINER).item(0);
183  nameElement.setTextContent(givenExaminer);
184  doc.normalize();
185 
186  // edit the modified data
187  String newDate = dateFormat.format(new Date());
188  Element rootEl = getRootElement();
189  rootEl.getElementsByTagName(MODIFIED_DATE_NAME).item(0).setTextContent(newDate);
190 
191  writeFile();
192 
193  }
194 
200  private void setName(String givenCaseName) {
201  caseName = givenCaseName; // change this to change the xml file if needed
202  }
203 
209  private void setNumber(String givenCaseNumber) {
210  caseNumber = givenCaseNumber; // change this to change the xml file if needed
211  }
212 
218  private void setCaseType(CaseType givenCaseType) {
219  caseType = givenCaseType; // change this to change the xml file if needed
220  }
221 
228  public CaseType getCaseType() {
229  if (doc == null) {
230  return CaseType.SINGLE_USER_CASE;
231  } else {
232  if (getCaseElement().getElementsByTagName(CASE_TYPE).getLength() > 0) {
233  Element nameElement = (Element) getCaseElement().getElementsByTagName(CASE_TYPE).item(0);
234  return CaseType.fromString(nameElement.getTextContent());
235  } else {
236  return CaseType.SINGLE_USER_CASE;
237  }
238  }
239  }
240 
246  private void setDatabaseName(String givenDbName) {
247  dbName = givenDbName; // change this to change the xml file if needed
248  }
249 
255  public String getDatabaseName() {
256  if (doc == null) {
257  return "";
258  } else {
259  if (getCaseElement().getElementsByTagName(DATABASE_NAME).getLength() > 0) {
260  Element nameElement = (Element) getCaseElement().getElementsByTagName(DATABASE_NAME).item(0);
261  return nameElement.getTextContent();
262  } else {
263  return "";
264  }
265  }
266  }
267 
274  private void setTextIndexName(String textIndexName) {
275  this.textIndexName = textIndexName; // change this to change the xml file if needed
276  }
277 
283  public String getTextIndexName() {
284  if (doc == null) {
285  return "";
286  } else {
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();
290  } else {
291  return "";
292  }
293  }
294  }
295 
301  private void setExaminer(String givenExaminer) {
302  examiner = givenExaminer; // change this to change the xml file if needed
303  }
304 
310  @Override
311  public String getCaseName() {
312  if (doc == null) {
313  return "";
314  } else {
315  Element nameElement = (Element) getCaseElement().getElementsByTagName(NAME).item(0);
316  String result = nameElement.getTextContent();
317  return result;
318  }
319  }
320 
326  @Override
327  public String getCaseNumber() {
328  if (doc == null) {
329  return "";
330  } else {
331  Element numberElement = (Element) getCaseElement().getElementsByTagName(NUMBER).item(0);
332  String result = "-1";
333  if (numberElement != null) {
334  result = numberElement.getTextContent();
335  }
336  return result;
337  }
338  }
339 
345  @Override
346  public String getCaseExaminer() {
347  if (doc == null) {
348  return "";
349  } else {
350  Element examinerElement = (Element) getCaseElement().getElementsByTagName(EXAMINER).item(0);
351  String result = "";
352  if (examinerElement != null) {
353  result = examinerElement.getTextContent();
354  }
355  return result;
356  }
357  }
358 
364  public String getCaseDirectory() {
365  if (doc == null) {
366  return "";
367  } else {
368  return caseDirPath;
369  }
370  // Note: change this to get the case name from the xml file if needed
371  }
372 
378  private Element getRootElement() {
379  if (doc != null) {
380  return doc.getDocumentElement();
381  } else {
382  return null; // should throw error or exception
383  }
384  }
385 
391  public String getCreatedDate() {
392  if (doc != null) {
393  Element crDateElement = (Element) getRootElement().getElementsByTagName(CREATED_DATE_NAME).item(0);
394  return crDateElement.getTextContent();
395  } else {
396  return ""; // should throw error or exception
397  }
398  }
399 
405  protected String getModifiedDate() {
406  if (doc != null) {
407  Element mDateElement = (Element) getRootElement().getElementsByTagName(MODIFIED_DATE_NAME).item(0);
408  return mDateElement.getTextContent();
409  } else {
410  return ""; // should throw error or exception
411  }
412  }
413 
419  protected String getCreatedVersion() {
420  if (doc != null) {
421  Element crVerElement = (Element) getRootElement().getElementsByTagName(AUTOPSY_CRVERSION_NAME).item(0);
422  return crVerElement.getTextContent();
423  } else {
424  return ""; // should throw error or exception
425  }
426  }
427 
434  protected String getSavedVersion() {
435  if (doc != null) {
436  Element mVerElement = (Element) getRootElement().getElementsByTagName(AUTOPSY_MVERSION_NAME).item(0);
437  return mVerElement.getTextContent();
438  } else {
439  return ""; // should throw error or exception
440  }
441  }
442 
448  protected String getSchemaVersion() {
449  if (doc != null) {
450  Element schemaVerElement = (Element) getRootElement().getElementsByTagName(SCHEMA_VERSION_NAME).item(0);
451  return schemaVerElement.getTextContent();
452  } else {
453  return ""; // should throw error or exception
454  }
455  }
456 
462  private Element getCaseElement() {
463  if (doc != null) {
464  return (Element) doc.getElementsByTagName(CASE_ROOT_NAME).item(0);
465  } else {
466  return null; // should throw error or exception
467  }
468  }
469 
475  protected String getLogDir() {
476  if (doc != null) {
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();
480  } else {
481  return logElement.getTextContent();
482  }
483  } else {
484  return ""; // should throw error or exception
485  }
486  }
487 
493  protected String getTempDir() {
494  if (doc != null) {
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();
498  } else {
499  return tempElement.getTextContent();
500  }
501  } else {
502  return ""; // should throw error or exception
503  }
504  }
505 
511  protected String getExportDir() {
512  if (doc != null) {
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();
516  } else {
517  return exportElement.getTextContent();
518  }
519  } else {
520  return ""; // should throw error or exception
521  }
522  }
523 
529  protected String getCacheDir() {
530  if (doc != null) {
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();
534  } else {
535  return cacheElement.getTextContent();
536  }
537  } else {
538  return ""; // should throw error or exception
539  }
540  }
541 
556  public void create(String dirPath, String caseName, String examiner, String caseNumber, CaseType caseType, String dbName, String textIndexName) throws CaseActionException {
557  clear(); // clear the previous data
558 
559  // set the case Name and Directory and the parent directory
560  setCaseDirPath(dirPath);
561  setName(caseName);
562  setExaminer(examiner);
563  setNumber(caseNumber);
564  setCaseType(caseType);
565  setDatabaseName(dbName);
566  setTextIndexName(textIndexName);
567  DocumentBuilder docBuilder;
568  DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
569 
570  // throw an error here
571  try {
572  docBuilder = docFactory.newDocumentBuilder();
573  } catch (ParserConfigurationException ex) {
574  clear();
575  throw new CaseActionException(
576  NbBundle.getMessage(this.getClass(), "XMLCaseManagement.create.exception.msg"), ex);
577  }
578 
579  doc = docBuilder.newDocument();
580  Element rootElement = doc.createElement(TOP_ROOT_NAME); // <AutopsyCase> ... </AutopsyCase>
581  doc.appendChild(rootElement);
582 
583  Element crDateElement = doc.createElement(CREATED_DATE_NAME); // <CreatedDate> ... </CreatedDate>
584  crDateElement.appendChild(doc.createTextNode(dateFormat.format(new Date())));
585  rootElement.appendChild(crDateElement);
586 
587  Element mDateElement = doc.createElement(MODIFIED_DATE_NAME); // <ModifedDate> ... </ModifedDate>
588  mDateElement.appendChild(doc.createTextNode(dateFormat.format(new Date())));
589  rootElement.appendChild(mDateElement);
590 
591  Element autVerElement = doc.createElement(AUTOPSY_CRVERSION_NAME); // <AutopsyVersion> ... </AutopsyVersion>
592  autVerElement.appendChild(doc.createTextNode(autopsySavedVersion));
593  rootElement.appendChild(autVerElement);
594 
595  Element autSavedVerElement = doc.createElement(AUTOPSY_MVERSION_NAME); // <AutopsySavedVersion> ... </AutopsySavedVersion>
596  autSavedVerElement.appendChild(doc.createTextNode(autopsySavedVersion));
597  rootElement.appendChild(autSavedVerElement);
598 
599  Element schVerElement = doc.createElement(SCHEMA_VERSION_NAME); // <SchemaVersion> ... </SchemaVersion>
600  schVerElement.appendChild(doc.createTextNode(schemaVersion));
601  rootElement.appendChild(schVerElement);
602 
603  Element caseElement = doc.createElement(CASE_ROOT_NAME); // <Case> ... </Case>
604  rootElement.appendChild(caseElement);
605 
606  Element nameElement = doc.createElement(NAME); // <Name> ... </Name>
607  nameElement.appendChild(doc.createTextNode(caseName));
608  caseElement.appendChild(nameElement);
609 
610  Element numberElement = doc.createElement(NUMBER); // <Number> ... </Number>
611  numberElement.appendChild(doc.createTextNode(String.valueOf(caseNumber)));
612  caseElement.appendChild(numberElement);
613 
614  Element examinerElement = doc.createElement(EXAMINER); // <Examiner> ... </Examiner>
615  examinerElement.appendChild(doc.createTextNode(examiner));
616  caseElement.appendChild(examinerElement);
617 
618  Element exportElement = doc.createElement(EXPORT_FOLDER_NAME); // <ExportFolder> ... </ExportFolder>
619  exportElement.appendChild(doc.createTextNode(EXPORT_FOLDER_RELPATH));
620  exportElement.setAttribute(RELATIVE_NAME, "true"); //NON-NLS
621  caseElement.appendChild(exportElement);
622 
623  Element logElement = doc.createElement(LOG_FOLDER_NAME); // <LogFolder> ... </LogFolder>
624  logElement.appendChild(doc.createTextNode(LOG_FOLDER_RELPATH));
625  logElement.setAttribute(RELATIVE_NAME, "true"); //NON-NLS
626  caseElement.appendChild(logElement);
627 
628  Element tempElement = doc.createElement(TEMP_FOLDER_NAME); // <TempFolder> ... </TempFolder>
629  tempElement.appendChild(doc.createTextNode(TEMP_FOLDER_RELPATH));
630  tempElement.setAttribute(RELATIVE_NAME, "true"); //NON-NLS
631  caseElement.appendChild(tempElement);
632 
633  Element cacheElement = doc.createElement(CACHE_FOLDER_NAME); // <CacheFolder> ... </CacheFolder>
634  cacheElement.appendChild(doc.createTextNode(CACHE_FOLDER_RELPATH));
635  cacheElement.setAttribute(RELATIVE_NAME, "true"); //NON-NLS
636  caseElement.appendChild(cacheElement);
637 
638  Element typeElement = doc.createElement(CASE_TYPE); // <CaseType> ... </CaseType>
639  typeElement.appendChild(doc.createTextNode(caseType.toString()));
640  caseElement.appendChild(typeElement);
641 
642  Element dbNameElement = doc.createElement(DATABASE_NAME); // <DatabaseName> ... </DatabaseName>
643  dbNameElement.appendChild(doc.createTextNode(dbName));
644  caseElement.appendChild(dbNameElement);
645 
646  Element indexNameElement = doc.createElement(CASE_TEXT_INDEX_NAME); // <TextIndexName> ... </TextIndexName>
647  indexNameElement.appendChild(doc.createTextNode(textIndexName));
648  caseElement.appendChild(indexNameElement);
649 
650  // write more code if needed ...
651  }
652 
658  @Override
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"));
663  }
664 
665  // Prepare the DOM document for writing
666  Source source = new DOMSource(doc);
667 
668  // Prepare the data for the output file
669  StringWriter sw = new StringWriter();
670  Result result = new StreamResult(sw);
671 
672  // Write the DOM document to the file
673  Transformer xformer;// = TransformerFactory.newInstance().newTransformer();
674  TransformerFactory tfactory = TransformerFactory.newInstance();
675 
676  try {
677  xformer = tfactory.newTransformer();
678  } catch (TransformerConfigurationException ex) {
679  logger.log(Level.SEVERE, "Could not setup tranformer and write case file"); //NON-NLS
680  throw new CaseActionException(
681  NbBundle.getMessage(this.getClass(), "XMLCaseManagement.writeFile.exception.errWriteToFile.msg"), ex);
682  }
683 
684  //Setup indenting to "pretty print"
685  xformer.setOutputProperty(OutputKeys.INDENT, "yes"); //NON-NLS
686  xformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); //NON-NLS
687 
688  try {
689  xformer.transform(source, result);
690  } catch (TransformerException ex) {
691  logger.log(Level.SEVERE, "Could not run tranformer and write case file"); //NON-NLS
692  throw new CaseActionException(
693  NbBundle.getMessage(this.getClass(), "XMLCaseManagement.writeFile.exception.errWriteToFile.msg"), ex);
694  }
695 
696  // preparing the output file
697  String xmlString = sw.toString();
698  File file = new File(caseDirPath + File.separator + caseName + ".aut");
699 
700  // write the file
701  try {
702  BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
703  bw.write(xmlString);
704  bw.flush();
705  bw.close();
706  } catch (IOException ex) {
707  logger.log(Level.SEVERE, "Error writing to case file"); //NON-NLS
708  throw new CaseActionException(
709  NbBundle.getMessage(this.getClass(), "XMLCaseManagement.writeFile.exception.errWriteToFile.msg"), ex);
710  }
711  }
712 
719  @Override
720  public void open(String conFilePath) throws CaseActionException {
721  clear();
722  File file = new File(conFilePath);
723 
724  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
725  DocumentBuilder db;
726  try {
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",
732  conFilePath), ex);
733  }
734 
735  doc.getDocumentElement().normalize();
736  doc.getDocumentElement().normalize();
737 
738  // TODO: Restore later
739 // if (!XMLUtil.xmlIsValid(doc, XMLCaseManagement.class, XSDFILE)) {
740 // logger.log(Level.WARNING, "Could not validate against [" + XSDFILE + "], results may not accurate"); //NON-NLS
741 // }
742  Element rootEl = doc.getDocumentElement();
743  String rootName = rootEl.getNodeName();
744 
745  // check if it's the autopsy case, if not, throws an error
746  if (!rootName.equals(TOP_ROOT_NAME)) {
747  // throw an error ...
748  clear();
749  if (RuntimeProperties.coreComponentsAreActive()) {
750 
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);
758  }
759  } else {
760  /*
761  * Autopsy Created Version
762  */
763  String createdVersion = getCreatedVersion(); // get the created version
764 
765  // check if it has the same autopsy version as the current one
766  if (!createdVersion.equals(autopsySavedVersion)) {
767  // if not the same version, update the saved version in the xml to the current version
768  getRootElement().getElementsByTagName(AUTOPSY_MVERSION_NAME).item(0).setTextContent(autopsySavedVersion);
769  }
770 
771  /*
772  * Schema Version
773  */
774  String schemaVer = getSchemaVersion();
775  // check if it has the same schema version as the current one
776  if (!schemaVer.equals(schemaVersion)) {
777  // do something here if not the same version
778  // ... @Override
779  }
780 
781  // set the case Directory and Name
782  setCaseDirPath(file.getParent());
783  String fullFileName = file.getName();
784  String fileName = fullFileName.substring(0, fullFileName.lastIndexOf(".")); // remove the extension
785  setName(fileName);
786  }
787  }
788 
795  @Override
796  public void close() throws CaseActionException {
797  writeFile(); // write any changes to xml
798  clear();
799  }
800 
804  private void clear() {
805  doc = null;
806  caseDirPath = "";
807  caseName = "";
808  caseNumber = "";
809  examiner = "";
810  caseType = CaseType.SINGLE_USER_CASE;
811  dbName = "";
812  textIndexName = "";
813  }
814 }

Copyright © 2012-2015 Basis Technology. Generated on: Wed Apr 6 2016
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.