Open Kilda Java Documentation
DatabaseConfigurator.java
Go to the documentation of this file.
1 package org.openkilda.config;
2 
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.core.io.ResourceLoader;
5 import org.springframework.stereotype.Repository;
6 import org.springframework.transaction.annotation.Propagation;
7 import org.springframework.transaction.annotation.Transactional;
8 
9 import com.ibatis.common.jdbc.ScriptRunner;
10 
11 import java.io.FileNotFoundException;
12 import java.io.IOException;
13 import java.io.InputStream;
14 import java.io.InputStreamReader;
15 import java.sql.Connection;
16 import java.util.LinkedHashMap;
17 import java.util.List;
18 import java.util.Map;
19 
20 import javax.sql.DataSource;
21 
22 import org.apache.log4j.Logger;
26 
27 @Repository("databaseConfigurator")
28 public class DatabaseConfigurator {
29 
30  private static final Logger LOGGER = Logger.getLogger(FlowService.class);
31 
32  private final static String SCRIPT_LOCATION = "db";
33  private final static String SCRIPT_FILE_PREFIX = "import-script_";
34  private final static String SCRIPT_FILE_SUFFIX = ".sql";
35 
36  private ResourceLoader resourceLoader;
37 
38  private VersionRepository versionRepository;
39 
40  private DataSource dataSource;
41 
42  public DatabaseConfigurator(@Autowired final VersionRepository versionRepository,
43  final DataSource dataSource, final ResourceLoader resourceLoader) {
44  this.versionRepository = versionRepository;
45  this.dataSource = dataSource;
46  this.resourceLoader = resourceLoader;
47  init();
48  }
49 
50  @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false)
51  public void init() {
52  loadInitialData();
53  }
54 
55  private void loadInitialData() {
56  List<VersionEntity> versionEntities = versionRepository.findAll();
57  long lastestScriptNumber = getLatestScriptVersion(versionEntities);
58  Map<String, InputStream> filesByName = getScriptFiles(lastestScriptNumber);
59 
60  for(int i = 0; i < filesByName.size(); i++) {
61  try (InputStream inputStream = filesByName.get(lastestScriptNumber + i +1)) {
62  runScript(inputStream);
63  } catch (IOException e) {
64  LOGGER.error("Failed to load db script", e);
65  }
66  }
67  }
68 
69  private Long getLatestScriptVersion(final List<VersionEntity> versionEntities) {
70  Long lastestVersion = 0l;
71  for (VersionEntity versionEntity : versionEntities) {
72  if (lastestVersion < versionEntity.getVersionNumber()) {
73  lastestVersion = versionEntity.getVersionNumber();
74  }
75  }
76  return lastestVersion;
77  }
78 
79  @SuppressWarnings("resource")
80  private Map<String, InputStream> getScriptFiles(final long scriptNumber) {
81  long lastestScriptNumber = scriptNumber;
82  Map<String, InputStream> filesByName = new LinkedHashMap<>();
83  InputStream is;
84  try {
85  while (true) {
86  lastestScriptNumber++;
87  is = resourceLoader.getResource("classpath:" + SCRIPT_LOCATION + "/" +
88  SCRIPT_FILE_PREFIX + lastestScriptNumber + SCRIPT_FILE_SUFFIX).getInputStream();
89  if (is != null) {
90  runScript(is);
91  } else {
92  break;
93  }
94  }
95  } catch (FileNotFoundException e) {
96  // Do Nothing
97  } catch (IOException e) {
98  LOGGER.error("Failed to load db scripts", e);
99  }
100  return filesByName;
101  }
102 
103  private void runScript(final InputStream inputStream) {
104  try (Connection con = dataSource.getConnection()) {
105  ScriptRunner sr = new ScriptRunner(con, false, false);
106  sr.runScript(new InputStreamReader(inputStream));
107  } catch (Exception e) {
108  LOGGER.error("Error while executing script.", e);
109  }
110  }
111 }
DatabaseConfigurator(@Autowired final VersionRepository versionRepository, final DataSource dataSource, final ResourceLoader resourceLoader)