package org.talend.repository.ui.wizards.exportjob.scriptsmanager.esb; import java.net.URI; import java.util.Collection; import org.talend.core.model.properties.ProcessItem; import org.talend.designer.core.model.utils.emf.talendfile.NodeType; import org.talend.repository.utils.EmfModelUtils; // OSGi DataSource public class DataSourceConfig { private static final String DB_JDBC = "tJDBCConnection"; //$NON-NLS-1$ private static final String DB_MYSQL = "tMysqlConnection"; //$NON-NLS-1$ private String additionalJobBeanParams = ""; //$NON-NLS-1$ private String additionalJobBundleConfig = ""; //$NON-NLS-1$ public static boolean isDBConnectionJob(ProcessItem processItem) { return !getDBConnectionComponents(processItem).isEmpty(); } private static Collection<NodeType> getDBConnectionComponents(ProcessItem processItem) { return EmfModelUtils.getComponentsByName(processItem, DB_JDBC, DB_MYSQL); } public DataSourceConfig(ProcessItem processItem) { Collection<NodeType> dbComponents = getDBConnectionComponents(processItem); if (!dbComponents.isEmpty()) { additionalJobBeanParams += "\n\t\t<property name=\"dataSources\">" + "\n\t\t\t<map>"; for (NodeType dbComponent : dbComponents) { String id = EmfModelUtils.computeTextElementValue("UNIQUE_NAME", dbComponent); String beanPool = id + "Pool"; additionalJobBeanParams += "\n\t\t\t\t<entry key=\"" + id + "\" value-ref=\"" + beanPool + "\" />"; String beanDataSource = id + "DataSource"; additionalJobBundleConfig += getDataSourceConfig(dbComponent, beanDataSource); additionalJobBundleConfig += "\n\t<bean id=\"" + beanPool + "\" class=\"org.apache.commons.dbcp.datasources.SharedPoolDataSource\" destroy-method=\"close\">" + "\n\t\t<property name=\"connectionPoolDataSource\" ref=\"" + beanDataSource + "\"/>" + "\n\t</bean>"; } additionalJobBeanParams += "\n\t\t\t</map>" + "\n\t\t</property>"; } } public String getAdditionalJobBeanParams() { return additionalJobBeanParams; } public String getAdditionalJobBundleConfig() { return additionalJobBundleConfig; } private static String getDataSourceConfig(NodeType dbComponent, String beanDataSource) { String componentName = dbComponent.getComponentName(); if(DB_JDBC.equals(componentName)) { String url = EmfModelUtils.computeTextElementValue("URL", dbComponent); URI jdbcURI = URI.create(url.substring("jdbc:".length())); if ("derby".equals(jdbcURI.getScheme())) { return "\n\t<bean id=\"" + beanDataSource + "\" class=\"org.apache.derby.jdbc.ClientConnectionPoolDataSource\">" + "\n\t\t<property name=\"serverName\" value=\"" + jdbcURI.getHost() + "\"/>" + "\n\t\t<property name=\"portNumber\" value=\"" + jdbcURI.getPort() + "\"/>" + "\n\t\t<property name=\"databaseName\" value=\"" + jdbcURI.getPath() + "\"/>" + "\n\t\t<property name=\"user\" value=\"" + EmfModelUtils.computeTextElementValue("USER", dbComponent) + "\"/>" + "\n\t\t<property name=\"password\" value=\"" + EmfModelUtils.computeTextElementValue("PASS", dbComponent) + "\"/>" + "\n\t</bean>"; } else if ("mysql".equals(jdbcURI.getScheme())) { return getMysqlDataSourceConfig(dbComponent, beanDataSource, url); } else { throw new IllegalArgumentException("Unsupported database for tJDBCConnection component: " + jdbcURI.getScheme()); } } else if(DB_MYSQL.equals(componentName)) { return getMysqlDataSourceConfig(dbComponent, beanDataSource, null); } else { throw new IllegalArgumentException("Unsupported database component: " + componentName); } } private static String getMysqlDataSourceConfig(NodeType dbComponent, String beanDataSource, String url) { if (null == url) { url = "jdbc:mysql://" + EmfModelUtils.computeTextElementValue("HOST", dbComponent) + ':' + EmfModelUtils.computeTextElementValue("PORT", dbComponent) + '/' + EmfModelUtils.computeTextElementValue("DBNAME", dbComponent); } return "\n\t<bean id=\"" + beanDataSource + "\" class=\"com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource\">" + "\n\t\t<property name=\"url\" value=\"" + url + "\"/>" + "\n\t\t<property name=\"user\" value=\"" + EmfModelUtils.computeTextElementValue("USER", dbComponent) + "\"/>" + "\n\t\t<property name=\"password\" value=\"" + EmfModelUtils.computeTextElementValue("PASS", dbComponent) + "\"/>" + "\n\t</bean>"; } }