1 package com.atlassian.dbexporter.importer;
2
3 import com.atlassian.dbexporter.Context;
4 import com.atlassian.dbexporter.DatabaseInformation;
5 import com.atlassian.dbexporter.ImportExportErrorService;
6 import com.atlassian.dbexporter.node.NodeParser;
7 import com.atlassian.dbexporter.progress.ProgressMonitor;
8
9 import java.util.Map;
10
11 import static com.atlassian.dbexporter.importer.ImporterUtils.checkEndNode;
12 import static com.atlassian.dbexporter.importer.ImporterUtils.checkStartNode;
13 import static com.atlassian.dbexporter.node.NodeBackup.DatabaseInformationNode;
14 import static com.atlassian.dbexporter.node.NodeBackup.DatabaseInformationNode.getMetaKey;
15 import static com.atlassian.dbexporter.node.NodeBackup.DatabaseInformationNode.getMetaValue;
16 import static com.atlassian.dbexporter.progress.ProgressMonitor.Task;
17 import static com.google.common.base.Preconditions.checkNotNull;
18 import static com.google.common.collect.Maps.newHashMap;
19
20 public final class DatabaseInformationImporter extends AbstractSingleNodeImporter {
21 private DatabaseInformationChecker infoChecker;
22
23 public DatabaseInformationImporter(ImportExportErrorService errorService) {
24 this(errorService, NoOpDatabaseInformationChecker.INSTANCE);
25 }
26
27 public DatabaseInformationImporter(ImportExportErrorService errorService, DatabaseInformationChecker infoChecker) {
28 super(errorService);
29 this.infoChecker = checkNotNull(infoChecker);
30 }
31
32 @Override
33 protected void doImportNode(NodeParser node, ImportConfiguration configuration, Context context) {
34 final ProgressMonitor monitor = configuration.getProgressMonitor();
35 monitor.begin(Task.DATABASE_INFORMATION);
36
37 final DatabaseInformation info = doImportDatabaseInformation(node);
38 infoChecker.check(info);
39 context.put(info);
40
41 monitor.end(Task.DATABASE_INFORMATION);
42 }
43
44 private DatabaseInformation doImportDatabaseInformation(NodeParser node) {
45 final Map<String, String> meta = newHashMap();
46 checkStartNode(node, DatabaseInformationNode.NAME);
47 doImportMetas(node.getNextNode(), meta);
48 checkEndNode(node, DatabaseInformationNode.NAME);
49 node.getNextNode();
50 return new DatabaseInformation(meta);
51 }
52
53 private void doImportMetas(NodeParser node, Map<String, String> meta) {
54 while (node.getName().equals(DatabaseInformationNode.META)) {
55 doImportMeta(node, meta);
56 }
57 }
58
59 private void doImportMeta(NodeParser node, Map<String, String> meta) {
60 checkStartNode(node, DatabaseInformationNode.META);
61 meta.put(getMetaKey(node), getMetaValue(node));
62 checkEndNode(node.getNextNode(), DatabaseInformationNode.META);
63 node.getNextNode();
64 }
65
66 @Override
67 protected String getNodeName() {
68 return DatabaseInformationNode.NAME;
69 }
70
71 private static final class NoOpDatabaseInformationChecker implements DatabaseInformationChecker {
72 private static final DatabaseInformationChecker INSTANCE = new NoOpDatabaseInformationChecker();
73
74 private NoOpDatabaseInformationChecker() {
75 }
76
77 public void check(DatabaseInformation information) {
78
79 }
80 }
81 }