Hi Guys,

I want to copy workflow process data into a postgres database before completing the process. So I'm trying to implement a Workflow Process Tool Plugin that can load data from FormRow and save using some spring classes available in spring jar. But when the process runs it returns following error. But i found that  SimpleDriverDataSource is available in default spring jar. How can I resolve this error?

ERROR 06 Mar 2015 10:49:33 org.joget.apps.app.web.JsonResponseFilter  - java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/SimpleDriverDataSource
java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/SimpleDriverDataSource
....
....
....
Caused by: java.lang.ClassNotFoundException: org.springframework.jdbc.datasource.SimpleDriverDataSource not found by nz.net.snap.workflow-joget-archiver [1]
        at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1460)
        at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:72)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1843)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)

My Plugin class as follow.

 package org.joget.workflow;

import java.io.IOException;
import java.sql.Driver;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import org.joget.apps.app.dao.FormDefinitionDao;
import org.joget.apps.app.model.AppDefinition;
import org.joget.apps.app.model.FormDefinition;
import org.joget.apps.app.service.AppService;
import org.joget.apps.app.service.AppUtil;
import org.joget.apps.form.model.FormRowSet;
import org.joget.commons.util.DynamicDataSourceManager;
import org.joget.commons.util.LogUtil;
import org.joget.plugin.base.DefaultApplicationPlugin;
import org.joget.plugin.base.PluginProperty;
import org.joget.plugin.base.PluginWebSupport;
import org.joget.workflow.model.WorkflowAssignment;
import org.springframework.beans.BeansException;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;

public class MyTool extends DefaultApplicationPlugin implements PluginWebSupport {

    private static final String TAG = "MyTool1";

    @Override
    public String getName() {
        return "My Tool";
    }

    @Override
    public String getVersion() {
        return "1.0";
    }

    @Override
    public String getDescription() {
        return getName();
    }

    @Override
    public String getLabel() {
        return getName();
    }

    @Override
    public String getClassName() {
        return getClass().getName();
    }

    @Override
    public PluginProperty[] getPluginProperties() {
        return null;
    }

    @Override
    public String getPropertyOptions() {
        return null;
    }

    @Override
    public void webService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            String action = request.getParameter("action");
            LogUtil.info(TAG, ">>>>>>>action=" + action);

            String processId = request.getParameter("id");
            //
            saveRecord(processId);
        } catch (Exception e) {
            LogUtil.info(TAG, e.getMessage());
        }
    }

    @Override
    public Object execute(Map properties) {

        WorkflowAssignment wfAssignment = (WorkflowAssignment) properties.get("workflowAssignment");

        LogUtil.debug(TAG, wfAssignment.getActivityId());

        String processId = appService().getOriginProcessId(wfAssignment.getProcessId());

        return saveRecord(processId);
    }

    private Object saveRecord(String processId) {
        AppService appService = appService();
        try {

            //Get primary key
            AppDefinition appDef = appService.getAppDefinitionForWorkflowProcess(processId);

            //Get existing data
            String provFormDefId = "my_from_def";
            FormDefinition provFormDef = formDefDao().loadById(provFormDefId, appDef);
            FormRowSet provDataSet = appService.loadFormData(appDef.getAppId(), appDef.getVersion().toString(), provFormDefId, processId);
            String provTable = provFormDef.getTableName();
            LogUtil.info(TAG, ">>>>>>>>>>>>>>>>>>>>>> " + provDataSet.toString());

            try {
                String driverClass = "org.postgresql.Driver";
                String dbURL = "jdbc:postgresql://localhost/workflow";
                String user = "admin";
                String password = "mypass";
                String dbSchema = "public";

                Driver driver = (Driver) Class.forName(driverClass).newInstance();
                //
                DataSource ds = new SimpleDriverDataSource(driver, dbURL, user, password);
                SimpleJdbcInsert insert = new SimpleJdbcInsert(ds);

                insert.withSchemaName(dbSchema);
                insert.withTableName(provTable);
                insert.executeAndReturnKey(provDataSet.get(0).getCustomProperties());

            } catch (Exception e) {
                LogUtil.info(TAG, e.getMessage());
                LogUtil.error(TAG, e, e.getMessage());
            } finally {
                DynamicDataSourceManager.changeProfile("default");

            }

        } catch (Exception e) {
            LogUtil.info(TAG, e.getMessage());
            LogUtil.error(TAG, e, e.getMessage());
        } finally {
        }

        return null;
    }

    private static FormDefinitionDao formDefDao() throws BeansException {
        return (FormDefinitionDao) AppUtil.getApplicationContext().getBean("formDefinitionDao");
    }

    private static AppService appService() throws BeansException {
        return (AppService) AppUtil.getApplicationContext().getBean("appService");
    }
}
  • No labels