Eclipseplugins
DatabaseConnectionBuilder.java
1 package com.proalpha.pds.projconf.configure;
2 
3 import java.io.BufferedReader;
4 import java.io.File;
5 import java.io.FileNotFoundException;
6 import java.io.FileReader;
7 import java.io.IOException;
8 import java.util.ArrayList;
9 import java.util.Arrays;
10 import java.util.Enumeration;
11 import java.util.List;
12 import java.util.Properties;
13 import java.util.Set;
14 import java.util.TreeSet;
15 
16 import org.eclipse.core.resources.IProject;
17 import org.eclipse.core.runtime.IStatus;
18 import org.eclipse.core.runtime.Path;
19 import org.eclipse.core.runtime.Status;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
22 
23 import com.openedge.pdt.project.OEProjectPlugin;
24 import com.openedge.pdt.project.connection.DatabaseConnectionManager;
25 import com.openedge.pdt.project.connection.DatabaseConnectionProfile;
26 import com.proalpha.pds.projconf.Activator;
27 import com.proalpha.pds.projconf.properties.PropertiesManager;
28 
29 import net.sourceforge.sqlexplorer.AliasModel;
30 import net.sourceforge.sqlexplorer.IdentifierFactory;
31 import net.sourceforge.sqlexplorer.plugin.SQLExplorerPlugin;
32 import net.sourceforge.squirrel_sql.fw.id.IIdentifier;
33 import net.sourceforge.squirrel_sql.fw.sql.ISQLAlias;
34 
36 
37  private final Logger logger = LoggerFactory.getLogger(DatabaseConnectionBuilder.class);
38 
39  private final Properties databaseProperties;
40  private final String projectVersionIdenifier;
41  private final String databaseDirectory;
42  private final String dlc;
43 
44  public DatabaseConnectionBuilder(String projectVersionIdenifier, String propertiesFile,
45  String databaseDirectory, String dlc) throws IOException {
46 
47  this.projectVersionIdenifier = projectVersionIdenifier;
48  this.databaseDirectory = databaseDirectory;
49  this.dlc = dlc;
50 
51  databaseProperties = PropertiesManager.getProperties(new File(propertiesFile));
52 
53  }
54 
55  private void addProfilesToConnectionManager(IProject project, List<DatabaseConnectionProfile> dbConnections) {
56 
57  DatabaseConnectionManager databaseConnectionManager = OEProjectPlugin.getDefault()
58  .getDatabaseConnectionManager();
59 
60  List<DatabaseConnectionProfile> existDBProfils = Arrays
61  .asList(databaseConnectionManager.getDatabaseConnectionProfiles());
62 
63  // Add the database profile to the DatabaseConnectionProfile pool
64  try {
65  for (DatabaseConnectionProfile dbProfile : dbConnections) {
66  if (existDBProfils.contains(dbProfile)) {
67  databaseConnectionManager.removeDatabaseConnectionProfile(dbProfile.getIdentifier());
68  }
69  dbProfile.setAutoStartServer(false);
70  }
71 
72  databaseConnectionManager
73  .addDatabaseConnectionProfile(dbConnections.toArray(new DatabaseConnectionProfile[0]));
74 
75  } catch (Exception e) {
76  IStatus status = new Status(IStatus.WARNING, Activator.PLUGIN_ID, e.getMessage(), e);
77  Activator.getDefault().getLog().log(status);
78  }
79 
80  if (project.exists()) {
81  databaseConnectionManager.writeDBMappingFile(dbConnections, project);
82  }
83  }
84 
85  private String buildUrl(String dbPort, String dbName, String dbHost) {
86  return "jdbc:datadirect:openedge://" + dbHost + ":" + dbPort + ";databaseName=" + dbName;
87  }
88 
95  private DatabaseConnectionProfile createDatabaseConnectionProfile(String logicalName) {
96 
97  String physicalName = databaseDirectory + "\\"
98  + databaseProperties.getProperty(logicalName + ".dbPhysicalName");
99  String connectionName = projectVersionIdenifier + " " + logicalName;
100 
101  String dbPort = databaseProperties.getProperty(logicalName + ".dbPort");
102  String dbHost = databaseProperties.getProperty(logicalName + ".dbHost");
103  String dbUserName = databaseProperties.getProperty(logicalName + ".dbUserName");
104  String dbPassword = databaseProperties.getProperty(logicalName + ".dbPassword");
105  String dbServerParameter = databaseProperties.getProperty(logicalName + ".dbServerParameter");
106  String dbParameters = databaseProperties.getProperty(logicalName + ".dbParameter");
107  String hasSecurity = databaseProperties.getProperty(logicalName + ".dbHasSecurity");
108 
109  String url = buildUrl(dbPort, new Path(physicalName).lastSegment(), dbHost);
110 
111  ISQLAlias sqlAlias = createSQLAlias(connectionName, url, dbUserName, dbPassword);
112  DatabaseConnectionProfile dbProfile = new DatabaseConnectionProfile(connectionName);
113 
114  dbProfile.setIdentifier(connectionName.replace(' ', '_'));
115  dbProfile.setGroup(projectVersionIdenifier);
116  dbProfile.setPhysicalName(physicalName);
117  dbProfile.setLogicalName(logicalName);
118  dbProfile.setProVersion(identifyProgressVersion());
119 
120  if (Boolean.valueOf(hasSecurity)) {
121  dbProfile.setUser(dbUserName);
122  dbProfile.setPassword(dbPassword);
123  }
124 
125  if (dbParameters != null) {
126  dbProfile.setParameters(dbParameters);
127  }
128 
129  dbProfile.setHost(dbHost);
130  dbProfile.setService(dbPort);
131 
132  if (sqlAlias != null) {
133  dbProfile.setAsociatedSQLAlias(sqlAlias);
134  dbProfile.setSqlIdentifier(sqlAlias.getIdentifier().toString());
135  dbProfile.setSqlName(connectionName + "_SQL");
136  dbProfile.setSqlAliasObject(sqlAlias);
137  dbProfile.setAutoStartServer(true);
138  dbProfile.setAutoShutdownServer(true);
139  dbProfile.setServerParameters("-db " + physicalName + " " + "-S " + dbPort + " " + dbServerParameter);
140  }
141 
142  return dbProfile;
143  }
144 
145  private List<DatabaseConnectionProfile> createDatabaseConnectionProfile() {
146 
147  // Create any database connection definition
148  List<DatabaseConnectionProfile> dbProfiles = new ArrayList<>();
149  Set<String> databaseNames = new TreeSet<>();
150 
151  databaseNames.addAll(getDatabaseNames());
152 
153  for (String logicalName : databaseNames) {
154  dbProfiles.add(createDatabaseConnectionProfile(logicalName));
155  }
156 
157  return dbProfiles;
158  }
159 
168  public void createDbConnections(IProject project) {
169 
170  List<DatabaseConnectionProfile> dbConnections = createDatabaseConnectionProfile();
171 
172  addProfilesToConnectionManager(project, dbConnections);
173 
174  }
175 
176  private static void removeSQLAlias(String connectionName) {
177  AliasModel aliasModel = SQLExplorerPlugin.getDefault().getAliasModel();
178  for (Object alias : aliasModel.getElements()) {
179  if (((ISQLAlias) alias).getName().equals(connectionName + "_SQL")) {
180  aliasModel.removeAlias((ISQLAlias) alias);
181  break;
182  }
183  }
184  }
185 
192  public static void removeDatabaseConnections(String groupName) {
193 
194  DatabaseConnectionManager manager = OEProjectPlugin.getDefault().getDatabaseConnectionManager();
195 
196  try {
197  DatabaseConnectionProfile[] databaseConnectionProfiles = manager.getDatabaseConnectionProfiles();
198 
199  for (int i = 0; i < databaseConnectionProfiles.length; i++) {
200  DatabaseConnectionProfile databaseConnectionProfile = databaseConnectionProfiles[i];
201  String connectionName;
202 
203  if (databaseConnectionProfile.getGroup().equalsIgnoreCase(groupName)) {
204  connectionName = databaseConnectionProfile.getName();
205  manager.removeDatabaseConnectionProfile(databaseConnectionProfile.getIdentifier());
206 
207  removeSQLAlias(connectionName);
208  }
209  }
210 
211  } catch (Exception e) {
212  IStatus status = new Status(IStatus.INFO, Activator.PLUGIN_ID, e.getMessage(), e);
213  Activator.getDefault().getLog().log(status);
214  }
215  }
216 
226  private ISQLAlias createSQLAlias(String connectionName, String url, String userName, String password) {
227 
228  IIdentifier identifier = null;
229  Boolean isAliasExsits = false;
230  ISQLAlias sqlAlias = null;
231 
232  AliasModel aliasModel = SQLExplorerPlugin.getDefault().getAliasModel();
233 
234  for (Object alias : aliasModel.getElements()) {
235  if (((ISQLAlias) alias).getName().equals(connectionName + "_SQL")) {
236  isAliasExsits = true;
237  sqlAlias = (ISQLAlias) alias;
238  break;
239  }
240  }
241 
242  if (!isAliasExsits) {
243  for (int i = 0; i < SQLExplorerPlugin.getDefault().getDriverModel().size(); i++) {
244 
245  if (SQLExplorerPlugin.getDefault().getDriverModel().getElement(i).getUrl()
246  .startsWith("jdbc:datadirect:openedge")) {
247 
248  identifier = SQLExplorerPlugin.getDefault().getDriverModel().getElement(i).getIdentifier();
249  break;
250  }
251  }
252 
253  sqlAlias = aliasModel.createAlias(IdentifierFactory.getInstance().createIdentifier());
254 
255  try {
256  sqlAlias.setName(connectionName + "_SQL");
257  sqlAlias.setDriverIdentifier(identifier);
258  sqlAlias.setUrl(url.trim());
259  sqlAlias.setUserName(userName);
260  sqlAlias.setPassword(password);
261  sqlAlias.setAutoLogon(true);
262  SQLExplorerPlugin.getDefault().getAliasModel().addAlias(sqlAlias);
263 
264  } catch (Exception e) {
265  logger.error(e.getMessage(), e);
266  sqlAlias = null;
267  }
268  }
269 
270  return sqlAlias;
271  }
272 
273  private Set<String> getDatabaseNames() {
274  Set<String> databaseNames = new TreeSet<>();
275 
276  Enumeration<?> propertyNames = databaseProperties.propertyNames();
277 
278  while (propertyNames.hasMoreElements()) {
279 
280  String propertyName = (String) propertyNames.nextElement();
281 
282  databaseNames.add(propertyName.substring(0, propertyName.indexOf('.')));
283 
284  }
285 
286  return databaseNames;
287  }
288 
289  private String identifyProgressVersion() {
290  String progressVersion = "";
291 
292  try (BufferedReader br = new BufferedReader(
293  new FileReader(new File(new Path(dlc).append("version").toString())));) {
294 
295  String line = br.readLine();
296 
297  if (line != null) {
298  progressVersion = line.substring(17, 22);
299  }
300 
301  } catch (FileNotFoundException e) {
302  logger.error("Couldn't find version file in dlc dir", e);
303  } catch (IOException e) {
304  logger.error("IOException occured during search of progress version", e);
305  }
306 
307  return progressVersion;
308  }
309 
310 }