Just a quick post to let you know the website move is complete. I’m sorry about any down time you may have experienced. Hopefully, I can get active again and start blogging again.
If you are interested in the details check out:
Just a quick post to let you know the website move is complete. I’m sorry about any down time you may have experienced. Hopefully, I can get active again and start blogging again.
If you are interested in the details check out:
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!
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
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.
I had an issue with some indexes that would not create. The database complained that the table had duplicates in it that violated the index. For me, the table was PS_AUC_HDR, but these steps should work for any table. Maybe some of the techniques will be helpful too. Also, if you know a better way to take care of the problem, please comment.
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;
I have been fighting with this error message:
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
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:
On the Advanced Properties page, I adjusted the ig.log.level from 2 to 5:
While that was a good tip to learn, that didn’t really help me. It didn’t produce any extra information.
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.
After logging in, click on the Advanced Properties Page link:
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.
Finally, copy the encrypted version back up to the setting.
Click OK, and exit out of the Gateway setup saving along the way. Now, your error should be fixed!
I have been wanting to blog more about the PTF, and this seemed like a good place to start. Here’s just a first simple test just to show the basics of creating a test.
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.
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
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!
Here’s a great link that helped me out today:
PeopleSoft Integration with ASP.NET Using CI based(In-Bound) Web Services
This article is a great article that describes step-by-step how to integrate a Component Interface with ASP.Net through web services.