CA’s Software Change Manager is a tool that we use to manage software and documents. Although much of our development staff is using GIT, many of our engineers still use SCM (or Harvest as it used to be known). The primary way our web applications use Harvest is as a version controlled repository for documents. Our web apps can link directly to the latest versions of documents and can even allow our users to checkout and modify documents through the web. I’d like to share some of the techniques we’ve used to build a relationship between a Java EE application apps and Harvest.
The obvious choice for using Harvest with java is the JHSDK (Java Harvest SDK). But through trial and error, I’ve learned that JHSDK fails in Java EE because it’s classes are not thread safe. At the CA World conference a few years ago, I had the privilege of consulting with the father of Harvest (can’t remember his name) about this problem. He said that I have two options, make the API thread safe or just make system calls to the command line interface (Harvest CLI). Not knowing exactly how to make the API thread safe, I chose the latter. It has never failed us.
Things to consider when designing a Harvest-related web app:
1. The server on which your app server resides must have a Harvest client installed. You’re essentially creating an automated Harvest user in your web app.
2. Because you’re using a CLI instead of JHSDK, you have to retrieve errors and exceptions by reading logs. Each Harvest command creates its own log file on the server. So you have to manage log files in real time. We create a new log file with a new random name with every command. After the command runs, we check the log messages so that we can send the messages (including errors) back to the browser. And finally, we delete the log file. This is handled differently for asynchronous calls (see #5).
3. Each Harvest command must contain user credentials. When the user logs in, you could capture his/her username and password, but this isn’t very secure. Ultimately, you want to use an auth file on the server. This can be generated with a command using the username and password one time and never again (unless the password changes). You name the auth file after the user name and then you can reference it anytime you need it. The svrenc command looks like this:
String command = new String;
int i = 0;
command[i++] = “svrenc”;
command[i++] = “-f”;
command[i++] = userName+”.auth”;
command[i++] = “-usr”;
command[i++] = userName;
command[i++] = “-pw”;
command[i++] = password;
command[i++] = “-dir”;
command[i++] = siService.getAuthRootPath();
command[i++] = “-o”;
command[i++] = log;
4. Building commands can be error prone if it’s done in one big String. Fortunately, Java’s Runtime class takes a String array. It’s best to build your commands this way. (see above example for building a command)
5. Commands can be run asynchronously for long-running processes by putting the command into a thread. As the thread runs it writes the progress of the log file output into the database and the client polls it with AJAX calls. That way you can show progress on the process.
6. When the user needs to view a file, it’s easier and quicker to use SQL rather than the hco command to get a blob and stream it out to the browser
7. When the user needs to checkout a file (hci command), you’re checking it out to the server’s file system then streaming a copy of that file back to the web browser.
8. To check in a file, upload the file through the web browser to the exact spot where it was checked out to, then run the hco command on it.
9. Finally, use the documentation. It comes with your installation and is called “CA Software Change Manager Command Line Reference Guide”. Everything you can do with the SCM client can be done via the CLI, and therefore can be done in a web app.
Integrating your web apps with CA SCM can be a very powerful asset to your users. We allow users to list, view, and manage files, promote/demote packages, edit forms, create comments, and approve/deny packages. We had hoped that CA would be a decent web version of SCM, but it never happened, so we built the parts that we need. We’ve been very successful, and using CLI calls has been very reliable.
Thanks for reading! If you would like to see what else I’m up to, check out Whiff