April 22nd, 2010

...now browsing by day


Why I use Linux as a desktop

Thursday, April 22nd, 2010

Penguins are cool!

I have two Macs, a high-end PC running Linux, my work laptop running Linux, three PCs running Windows XP, and one more laptop also running XP in my house. I have several PCs that are mostly used for parts. An upper end PC running Linux that is my main server that is my file server on the host level, and runs a web server, mail server, database server, test server all as virtual machines. Lastly, I have a left over PC that I am using as a special project database server for APEX applications that is also running Linux.

I have told the kids that as each of their PCs die, they will be replaced by a Mac Mini. The one that I currently have is about five years old, and the only thing I do is turn it off before leaving the house on vacations. I don’t think it has ever crashed. Ever!

So why not use a Mac as my primary platform. Cost for one. I can get much more horsepower for a lot less money with Linux. This year for my Christmas present to myself I built my own dream machine. I already had an LCD monitor, keyboard and mouse and was limited to about $500 dollars. It is amazing what you can purchase at Newegg! I was able to get a 3.2 GHz Quad core processor, 8 GB of high speed ram, and a fast SATA HD. I also replaced the stock fan, just in-case I ever decide to overclock the CPU to 4 GHz or higher. Sometimes just knowing you can is just as good as actually doing.

I still haven’t answered the question. I spend most of my time using ant to build java projects, JDeveloper as an IDE, and SQL Developer working with PL/SQL. Linux is simply so much faster, especially starting up SQL Developer or JDeveloper. Even on my work laptop (which is painfully slow to begin with), I can launch SQL Developer and have the IDE ready to go in 15 seconds, where my colleagues can wait more than a minute, sometimes two – just to see the IDE. I don’t even want to talk about my PPC Mac. Apple doesn’t have a version of Java that will run any of the current version of JDeveloper or SQL Server. Too bad, so sad!

If speed was the only issue, I probably would be running just about everything from the command line as well, but I do have my limits. I love the interface on the Mac. Plain and simple, it is just beautiful. A work of art! I just wish the delete key worked like the backspace key. Delete just doesn’t work right and is really my only complaint. If the Mac was faster and cheaper, I would replace all of my PC’s with them.

Windows. Well, besides re-imaging each PC yearly due to a variety of reasons, blue screens of death when playing games in my free time (ha ha), dealing with viruses that caused another round of re-imaging, etc… I like it. My dream includes buying Windows as a Windows manager that runs in X-Windows like Gnome or KDE. Yea, I would buy start buying Windows again if that happens.

I really don’t have any love for the Window managers in Linux. Just like I really don’t have any particular preference for a specific distribution. Typically, I run Fedora on my Desktops, and Ubuntu LTS for all of my servers and virtual machine servers. I have run Gentoo, and think that is a really great distribution. It just is a lot of work to setup, or at least I think it is. Don’t get upset, one of my favorite coffee mugs is my Gentoo Linux mug, and I don’t have any other Linux mugs.

And what’s wrong with Linux. I can’t run notepad++ or textpad natively. I really dislike vi and emacs even more so. Windows has the best text editors of all the platforms. That will hopefully be fixed one day! Until then, I’ll happily type away using gedit. And yes, I still use Windows running in VMWare for Visio and Microsoft Project. As long as these products run under XP, I will keep waiting for Windows as a Window Manager.

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

Thursday, 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:

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();
            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 {
            // 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;