How to validate against a system table when checking in a document

Written by klee on April 22nd, 2010

One of the problems we continue to face is comboboxes that contain a lot of data. 40,000 rows of data. Just having a few of these on a form can really make the system slow enough to be unusable. One solution is to just validate the data on submit. The key is to not loose the data if there are any problems.

Using examples from the howtobundle of examples from Oracle and also using Bex’s book – Custom Java Components chapter, I have put together a quick example. First create a component in the ComponentWizard. I named mine EmployeeCheckinValidation. Once you have this created (Follow the directions in Bex’s book if you are having trouble) create a project in JDeveloper. For this to work, you have to use the same JDK that is used in your UCM instance. In my case, I created a Samba mount point, and was able to point to the correct JDK using this method. You also have to add UCM’s server.jar file to your project’s jar library. To make things easier, I also set the projects source directory and output directories to directories named src and classes in the component – in my example ucm/server/cusom/EmployeeCheckinValidation/src and ucm/server/cusom/EmployeeCheckinValidation/classes. The last change was to the hda file. I added the following line below the line containing the version:
classpath=$COMPONENT_DIR/classes

Now when I rebuild the project, both the src and classes get updated automatically. Don’t forget to restart your server anytime you rebuild your file!

Here is the sample file that I have created. Basically, this will check that the title is not in the list of doctypes, which is one of the system tables. I’m sure there are other ways to accomplish this, but I thought I would share one way to do this. If you have ideas to make this better, please leave me a comment!

package testing;

import intradoc.common.ExecutionContext;
import intradoc.common.ServiceException;
import intradoc.common.SystemUtils;

import intradoc.data.DataBinder;
import intradoc.data.DataException;
import intradoc.data.DataResultSet;
import intradoc.data.ResultSet;
import intradoc.data.Workspace;

import intradoc.provider.Provider;
import intradoc.provider.Providers;

import intradoc.shared.FilterImplementor;

import intradoc.util.IdcMessage;


public class CheckinFilter implements FilterImplementor {
    public int doFilter(Workspace ws, DataBinder binder, ExecutionContext cxt) throws DataException, ServiceException {
        SystemUtils.trace("system", "Starting doFilter for EmployeeCheckinValidation");
        
        // Display the binder
        // System.out.println(binder);
        
        String dDocTitle = binder.getLocal("dDocTitle");
        SystemUtils.trace("system", "dDocTitle=" + dDocTitle);

        String SQL = "select count(*) counter from doctypes where upper(ddoctype) = '" + dDocTitle.trim().toUpperCase() + "'";
        String ResultSetName = "DDOCTYPECOUNT";
        SystemUtils.trace("system", "SQL=" + SQL);
        
        // Search database for ddoctitle in doctypes.ddoctype  Fail if
        // this this is true
                
        if (ws == null) {
            SystemUtils.trace("system", "ws is null, getting ws from call to getSystemWorkspace()");
            ws = getSystemWorkspace();
        }
        
        String value = "";
        int ivalue=0;
        DataResultSet result = null;
        DataException error = null;
        SystemUtils.trace("system", "try-catch block to get ResultSet from SQL");
        try {
            ResultSet temp = ws.createResultSetSQL(SQL);
            result = new DataResultSet();
            result.copy(temp);
            binder.addResultSet(ResultSetName,result);  // Makes results avilable for other Java methods or IdocScript templates.
        } catch (DataException de) { 
            error = de;
        } finally {
            // ws.releaseConnection();  // do NOT uncomment this, unless you like broken code!
        }

        try {
            result.first();
            // value = result.getStringValueByName("counter");
            value = result.getStringValue(0);
            SystemUtils.trace("system", "value(getStringValue(0)) = " + value);
            ivalue = Integer.parseInt(value);
            SystemUtils.trace("system", "ivalue=" + ivalue);
        } catch (NumberFormatException nfe) {
            SystemUtils.trace("system", "nfe.getMessage()=" + nfe.getMessage());
        }

        
        if (ivalue > 0) {
            SystemUtils.trace("system", "Throw error since dDocTitle cannot be a dDocType");
            throw new ServiceException("dDocTitle cannot be a dDocType");
        }
        
        if (error != null) {
            SystemUtils.trace("system", "Throw error since error condition exists.");
            throw error;
        }

        SystemUtils.trace("system", "Ending doFilter for EmployeeCheckinValidation");
        return CONTINUE;
    }
    
    public Workspace getSystemWorkspace() {
        Workspace workspace = null;
        Provider wsProvider = Providers.getProvider("SystemDatabase");
        if (wsProvider != null) {
            workspace = (Workspace)wsProvider.getProvider();
        }
        return workspace;        
    }
}
 

Comments are closed.