Author: digitaleagle

Blog Moving Again

Ok, It is time to move the blog again!  But, this time you shouldn’t have to change your bookmarks!  I am just moving the website to new web host.

The transfer is supposed to be seamless, but I suspect you might see a little downtime over the next week as the domain re-registers and points to the new site.  If it’s not working, please give me some time and check back.

I’ll update you on the other side!

Running Jasper Reports from Java

As a follow-up to my previous post about using iReport, I wanted to write some code that would run the report.  My goal is something that I can launch from PeopleTools.

Below is some Java that will execute the report and build a PDF output.  This class takes the XML data file and the report designed by iReport and produces a PDF out of it.

package net.digitaleagle.psst0101;

import java.io.File;
import java.util.HashMap;
import java.util.Locale;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.query.JRXPathQueryExecuterFactory;
import net.sf.jasperreports.engine.util.FileResolver;
import net.sf.jasperreports.engine.util.JRXmlUtils;

import org.w3c.dom.Document;

public class JasperInterface {
	private String dataPath;
	private String basePath;
	private String reportName;
	private String reportOutput;

	public JasperInterface(String dataPath, String basePath, String reportName, String reportOutput) {
		this.dataPath = dataPath;
		this.basePath = basePath;
		this.reportName = reportName;
		this.reportOutput = reportOutput;
	}

	public void run() throws JRException {
		Document data = JRXmlUtils.parse(dataPath);

		HashMap parms = new HashMap();
		parms.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT, data);
		parms.put(JRXPathQueryExecuterFactory.XML_DATE_PATTERN, "yyyy-MM-dd");
		parms.put(JRXPathQueryExecuterFactory.XML_LOCALE, Locale.ENGLISH);
		parms.put(JRParameter.REPORT_LOCALE, Locale.US);

		FileResolver fileResolver = new FileResolver() {
			 @Override
			 public File resolveFile(String fileName) {
			  return new File(basePath, fileName);
			 }
			};
		parms.put(JRParameter.REPORT_FILE_RESOLVER, fileResolver);

		JasperReport jr = JasperCompileManager.compileReport(basePath + reportName);
		JasperPrint pr = JasperFillManager.fillReport(jr, parms);
		JasperExportManager.exportReportToPdfFile(pr, reportOutput);
	}
}

Here’s some code that can launch the report without needing the JasperReports classes in the classpath.  I originally thought about just putting the jar files into the class directory in the PeopleSoft Home, but Jasper Reports has a number of Jar files.  So, I created a class that had no dependencies on JasperReports.  I tell it the location of the JasperReports installation, and it builds the necessary class path.

package net.digitaleagle.psst0101;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;

public class JasperReportRunner {
	private String jasperPath;
	private String dataPath;
	private String basePath;
	private String reportName;
	private String reportOutput;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String jasperPath = args[0];
		String dataPath = args[1];
		String basePath = args[2];
		String reportName = args[3];
		String reportOutput = args[4];

		JasperReportRunner jrr = new JasperReportRunner(jasperPath, dataPath, basePath, reportName, reportOutput);
		jrr.run();
	}

	public JasperReportRunner(String jasperPath, String dataPath, String basePath, String reportName, String reportOutput) {
		this.jasperPath = jasperPath;
		this.dataPath = dataPath;
		this.basePath = basePath;
		this.reportName = reportName;
		this.reportOutput = reportOutput;
	}

	public void run() {
		ArrayList urls = new ArrayList();
		File jasperDir = new File(jasperPath);
		addJars(urls, new File(jasperDir, "dist"));
		addJars(urls, new File(jasperDir, "lib"));
		URLClassLoader ucl = new URLClassLoader(urls.toArray(new URL[0]));
		Class jic;
		try {
			jic = ucl.loadClass(this.getClass().getPackage().getName() + ".JasperInterface");
		} catch (ClassNotFoundException e) {
			System.err.println("Could not access JasperInterface class");
			e.printStackTrace();
			return;
		}
		Constructor c = jic.getConstructors()[0];
		Object ji;
		try {
			ji = c.newInstance(dataPath, basePath, reportName, reportOutput);
		} catch (Exception e) {
			System.err.println("Error creating new instance of JasperInterface");
			e.printStackTrace();
			return;
		}
		Method method;
		try {
			method = jic.getMethod("run");
		} catch (Exception e) {
			System.err.println("Could not get run method");
			e.printStackTrace();
			return;
		}
		try {
			method.invoke(ji);
		} catch (Exception e) {
			System.err.println("Could not get execute run method");
			e.printStackTrace();
			return;
		}
	}

	private void addJars(ArrayList urls, File jarDir) {
		if(!jarDir.exists()) {
			System.err.println("Could not find Jasper Jar files in directory: " + jarDir.getAbsolutePath());
			System.err.println("Check installation directory");
			return;
		}
		for(File jarFile : jarDir.listFiles()) {
			if(jarFile.isFile() && jarFile.getName().toLowerCase().endsWith(".jar")) {
				try {
					urls.add(jarFile.toURI().toURL());
				} catch (MalformedURLException e) {
					System.err.println("Error loading jar for class path: " + jarFile.getAbsolutePath());
					e.printStackTrace();
				}
			}
		}
	}

}

Resources

Using iReport with Query Output

Because Oracle has stopped delivering Crystal Reports with PeopleSoft, I heard a few discussions about whether or not to license it for a new installation.  So, it’s an perfect timing to explorer an alternative tool.

Let me introduce JasperReports.  It is open-source, Java-based report generation tool.  The reports are XML files, but they have a tool called iReport that, in my opinion, is very similar to Crystal Reports.

Here’s the descriptions from their website:

iReport:

iReport is the free, open source report designer for JasperReports. Create very sophisticated layouts containing charts, images, subreports, crosstabs and much more. Access your data through JDBC, TableModels, JavaBeans, XML, Hibernate, CSV, and custom sources. Then publish your reports as PDF, RTF, XML, XLS, CSV, HTML, XHTML, text, DOCX, or OpenOffice.

Jasper Reports:

JasperReports is the world’s most popular open source reporting engine. It is entirely written in Java and it is able to use data coming from any kind of data source and produce pixel-perfect documents that can be viewed, printed or exported in a variety of document formats including HTML, PDF, Excel, OpenOffice and Word.

So, as an introduction, let me give you a walk through introduction of using iReport to design a report based on a Query.

Read More

Great Links: Oracle Database Administration Commands

This article is just to remember some links that I found while working on some database issues.  Maybe they will help someone else:

Viewing the Large Pool Size (from here):

SELECT name, SUM(bytes) FROM V$SGASTAT WHERE pool='large pool'
GROUP BY ROLLUP(name);

Here are the command to view the different memory related settings/parameters (from here):

show parameter sga_target

show sga

show parameter pool

Flushing cache, etc. (from here)

alter system flush buffer_cache;

alter system flush shared_pool;

alter system switch log_file;

Resources

Integration Broker error: Cannot establish HTTP connection

I have been fighting with this error message:

IB Error: Cannot  establish HTTP connection

Here’s the text of the message:

Cannot establish HTTP connection (158, 2842)

Can be cause by any of the following:
1. Cannot load certificates due to keystore password (not encrypted)
2. Keystore file not found
3. Proxy server not configured

Finding IB Logging

One thing I found was the error log thanks to the PeopleSoft wiki.  The wiki has a very good article on Integration Broker Logging.

For me, the logs where located at:

  • http://skphcm90/PSIGW/errorLog.html
  • http://skphcm90/PSIGW/msgLog.html

On the Advanced Properties page, I adjusted the ig.log.level from 2 to 5:

IB Setting Log Level

While that was a good tip to learn, that didn’t really help me.  It didn’t produce any extra information.

Finding a Solution

I actually found my solution on Oracle support in article [ID 1270683.1].

The fix is back on the Advanced Gateway Properties.  Go to PeopleTools > Integration Broker > Configuration > Gateways and click on the Gateway Setup Properties.

Gateway Properties

After logging in, click on the Advanced Properties Page link:

Advanced Properties Page

Then, find the secureFileKeystorePasswd option and copy the password down to the Password Encryption box.  Next, click the Encrypt button to get your encrypted version.

Copying password for IB

Finally, copy the encrypted version back up to the setting.

Applying Encrypted Password

Click OK, and exit out of the Gateway setup saving along the way.  Now, your error should be fixed!

Integration Broker: Message Already Used in WSDL

I ran across this error message the other day, and my web search didn’t return any results.  So, in case anyone else tries the same thing, here’s some info …

Error Message:

Message cannot be changed. Message used in exported WSDL.

Message cannot be changed. Message used in exported WSDL.

If you are like me, you want to change this message that you created, but you can’t.  The message is read only because you just created a WSDL.

You can delete the WSDL at: PeopleTools > Integration Broker > Service Utilities > Service Administration

Service Administration where you can delete your WSDL

You just search for your Service that includes the Message.  Then, you check the box for that service and click the delete button.  Now, you can head back to your message and you should find that you can edit it!