package org.joget.plugin.etl;
import org.joget.plugin.base.ApplicationPlugin;
import org.joget.plugin.base.DefaultPlugin;
import org.joget.plugin.base.PluginProperty;
import org.joget.workflow.model.WorkflowAssignment;
import org.joget.workflow.util.WorkflowUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Map;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class MySqlPlugin extends DefaultPlugin implements ApplicationPlugin {
public static final String FORM_DATA = "form";
public static final String WORKFLOW_ASSIGNMENT = "assignment";
public static final String WORKFLOW_VARIABLE = "variable";
public String getName() {
return "MySQL Plugin";
}
public String getDescription() {
return "Executes SQL INSERT and UPDATE statement on MySQL database via JDBC.";
}
public String getVersion() {
return "1.0.3";
}
public PluginProperty[] getPluginProperties() {
PluginProperty[] properties = new PluginProperty[]{
new PluginProperty("formDataTable", "Form Data Table", PluginProperty.TYPE_TEXTFIELD, null, ""),
new PluginProperty("host", "MySQL Host Address", PluginProperty.TYPE_TEXTFIELD, null, "localhost"),
new PluginProperty("username", "Username", PluginProperty.TYPE_TEXTFIELD, null, "root"),
new PluginProperty("password", "Password", PluginProperty.TYPE_PASSWORD, null, ""),
new PluginProperty("port", "Port", PluginProperty.TYPE_TEXTFIELD, null, "3306"),
new PluginProperty("database", "Database", PluginProperty.TYPE_TEXTFIELD, null, ""),
new PluginProperty("extraParameters", "Extra Parameters (Optional)", PluginProperty.TYPE_TEXTFIELD, null, ""),
new PluginProperty("query", "Query", PluginProperty.TYPE_TEXTAREA, null, null)
};
return properties;
}
public Object execute(Map properties) {
Object result = null;
try {
String formDataTable = (String) properties.get("formDataTable");
String host = (String) properties.get("host");
String username = (String) properties.get("username");
String password = (String) properties.get("password");
String port = (String) properties.get("port");
String database = (String) properties.get("database");
String extraParameters = (String) properties.get("extraParameters");
String query = (String) properties.get("query");
String url = "jdbc:mysql://" + host + ":" + port + "/" + database;
if( !extraParameters.equalsIgnoreCase("") ){
if( extraParameters.substring(0, 1).equalsIgnoreCase("?") )
url += extraParameters;
else
url += "?" + extraParameters;
}
WorkflowAssignment wfAssignment = (WorkflowAssignment) properties.get("workflowAssignment");
Map<String, String> replace = new HashMap<String, String>();
replace.put("\\\\", "\\\\");
replace.put("'", "\\'");
query = WorkflowUtil.processVariable(query, formDataTable, wfAssignment, "regex", replace);
Properties props = new Properties();
//hard code mysql driver class name
props.put("driverClassName", "com.mysql.jdbc.Driver");
props.put("url", url);
props.put("username", username);
props.put("password", password);
DataSource ds = createDataSource(props);
result = executeQuery(ds, query);
return result;
} catch (Exception e) {
Logger.getLogger(getClass().getName()).log(Level.WARNING, "Error executing plugin", e);
return null;
}
}
protected DataSource createDataSource(Properties props) throws Exception {
DataSource ds = BasicDataSourceFactory.createDataSource(props);
return ds;
}
protected boolean executeQuery(DataSource ds, String sql) throws SQLException {
Connection con = null;
PreparedStatement pstmt = null;
try {
con = ds.getConnection();
pstmt = con.prepareStatement(sql);
return pstmt.execute(sql);
} finally {
if (pstmt != null) {
pstmt.close();
}
if (con != null) {
con.close();
}
}
}
}