1 package com.atlassian.activeobjects.backup;
2
3 import com.atlassian.activeobjects.admin.PluginToTablesMapping;
4 import com.atlassian.activeobjects.ao.PrefixedSchemaConfiguration;
5 import com.atlassian.activeobjects.osgi.ActiveObjectsServiceFactory;
6 import com.atlassian.activeobjects.spi.NullBackupProgressMonitor;
7 import com.atlassian.activeobjects.test.model.Model;
8 import com.atlassian.dbexporter.ImportExportErrorService;
9 import com.atlassian.plugin.PluginAccessor;
10 import com.google.common.collect.ImmutableMap;
11 import net.java.ao.EntityManager;
12 import net.java.ao.atlassian.AtlassianFieldNameConverter;
13 import net.java.ao.builder.EntityManagerBuilder;
14 import net.java.ao.test.jdbc.Hsql;
15 import net.java.ao.test.jdbc.JdbcConfiguration;
16 import net.java.ao.test.jdbc.MySql;
17 import net.java.ao.test.jdbc.Oracle;
18 import net.java.ao.test.jdbc.Postgres;
19 import net.java.ao.test.jdbc.SqlServer;
20
21 import java.io.BufferedReader;
22 import java.io.ByteArrayOutputStream;
23 import java.io.IOException;
24 import java.io.InputStreamReader;
25 import java.util.Map;
26
27 import static org.mockito.Mockito.mock;
28
29 public final class CreateBackup {
30 private final static ImmutableMap<String, JdbcConfiguration> JDBC = ImmutableMap.<String, JdbcConfiguration>builder()
31 .put("hsql", new Hsql())
32 .put("mysql", new MySql())
33 .put("postgres", new Postgres())
34 .put("oracle", new Oracle())
35 .put("sqlserver", new SqlServer())
36 .build();
37
38 private static final String CUSTOM = "custom";
39
40 public static void main(String[] args) throws Exception {
41 final ImportExportErrorService errorService = new ImportExportErrorServiceImpl(new PluginInformationFactory(mock(PluginToTablesMapping.class), mock(PluginAccessor.class)));
42
43 final JdbcConfiguration jdbc = selectJdbcDriver();
44
45 final EntityManager entityManager = newEntityManager(jdbc);
46
47 final Model model = new Model(entityManager);
48 model.createData();
49
50 final ByteArrayOutputStream stream = new ByteArrayOutputStream();
51 new ActiveObjectsBackup(entityManager.getProvider(), entityManager.getNameConverters(), errorService, mock(ActiveObjectsServiceFactory.class)).save(stream, NullBackupProgressMonitor.INSTANCE);
52
53 System.out.println(stream.toString("UTF-8"));
54 }
55
56 private static EntityManager newEntityManager(JdbcConfiguration jdbc) {
57 return EntityManagerBuilder
58 .url(jdbc.getUrl())
59 .username(jdbc.getUsername())
60 .password(jdbc.getPassword())
61 .auto()
62 .tableNameConverter(new BackupActiveObjectsTableNameConverter())
63 .fieldNameConverter(new AtlassianFieldNameConverter())
64 .schemaConfiguration(new PrefixedSchemaConfiguration(ActiveObjectsBackup.PREFIX))
65 .build();
66 }
67
68 private static JdbcConfiguration selectJdbcDriver() throws IOException {
69 final String choice = chooseJdbcConfiguration();
70 if (CUSTOM.equalsIgnoreCase(choice)) {
71 return customJdbc();
72 } else if (JDBC.containsKey(choice)) {
73 return JDBC.get(choice);
74 } else {
75 System.out.println("Please choose a valid JDBC configuration!");
76 return selectJdbcDriver();
77 }
78 }
79
80 private static JdbcConfiguration customJdbc() throws IOException {
81 final String url = prompt("Url:");
82 final String username = prompt("Username:", "ao_user");
83 final String password = prompt("Password:", "ao_password");
84 final String schema = prompt("Schema:", "");
85
86 return new JdbcConfiguration() {
87 @Override
88 public String getUrl() {
89 return url;
90 }
91
92 @Override
93 public String getSchema() {
94 return schema;
95 }
96
97 @Override
98 public String getUsername() {
99 return username;
100 }
101
102 @Override
103 public String getPassword() {
104 return password;
105 }
106
107 @Override
108 public void init() {
109 }
110 };
111 }
112
113 private static String chooseJdbcConfiguration() throws IOException {
114 final StringBuilder sb = new StringBuilder();
115 for (Map.Entry<String, JdbcConfiguration> configs : JDBC.entrySet()) {
116 final JdbcConfiguration jdbc = configs.getValue();
117 sb.append(configs.getKey()).append(": ")
118 .append(jdbc.getUrl()).append(" - <")
119 .append(jdbc.getSchema()).append("> - ")
120 .append(jdbc.getUsername()).append(" - ")
121 .append(jdbc.getPassword()).append("\n");
122 }
123 sb.append(CUSTOM).append("\n");
124
125 return prompt("Choose a configuration:\n" + sb, JDBC.keySet().iterator().next());
126 }
127
128 private static String prompt(String message) throws IOException {
129 return prompt(message, null);
130 }
131
132 private static String prompt(String message, String defaultValue) throws IOException {
133 System.out.println(isNotEmpty(defaultValue) ? message + "[" + defaultValue + "]" : message);
134 final String value = new BufferedReader(new InputStreamReader(System.in)).readLine();
135 return isNotEmpty(value) ? value : defaultValue;
136 }
137
138 private static boolean isNotEmpty(String s) {
139 return s != null && !s.equals("");
140 }
141 }