I have some java code which I want to kick in from a coldfusion page
e.g. <cfobject type="Java" class="IRMark" name="myObj">
<cfset ret=myObj.init("input.xml")
It ought to be simple enough, pass the file name to the class and get the
base64 number back.
The Coldfusion documentation states:
"Note: The init method is not a method of the object, but a ColdFusion
identifier that calls the new function on the class constructor. So, if a Java
object has an init method, a name conflict exists and you cannot call the
objectâs init method."
and I suspect this is where my problem lies but my java is still basic. I would
be very grateful if anyone could at least give me a few pointers to solve this
problem. I have tried lots of things without any success.
The Java Code:
import java.io.*;
import javax.xml.parsers.*;
import java.security.*;
import org.w3c.dom.*;
import org.apache.xml.security.signature.*;
import org.apache.xml.security.transforms.*;
import org.apache.xml.security.Init;
import org.bouncycastle.util.encoders.Base64;
/**
* This code generates an IRmark value for an input document.
* The value is a base64 encoded SHA1 digest of a signature
* transform over a certain style of document. The value has
* to be placed inside documents to be signed by the XPE when
* used in a EDS/IR deployment.
*
* The code has a number of jar dependencies:-
* xmlsec.jar - The Apache XML Security Library
* log4j-1.2.5.jar - The Apache Log utility
* xalan.jar - Apache XSLT/XPath processor
* xercesImpl.jar - Apache XML processor
* bc-jce-jdk13-114.jar - Bouncy Castle JCE library
*
* The Bouncy Castle JCE provider is automatically downloaded
* by the Apache XML sec library build so you may already have
* that.
*/
public class IRMark {
/**
* Generate and print the IRmark.
*
* @param args - Pass the filename of the input document
* @throws Exception
*/
public static void main(String args[]) throws Exception {
// Init the Apache XML security library
Init.init();
// Check we are given a file to work with
if (args.length!=1) {
System.out.println("Use: IRmark <file> ");
return;
}
// Open the input file
FileInputStream fis=null;
try {
fis=new FileInputStream(args[0]);
} catch (FileNotFoundException e) {
System.out.println("The file " + args[0] + " could not
be opened.");
return;
}
// Load file into a byte array
byte[] data=null;
try {
int bytes=fis.available();
data=new byte[bytes];
fis.read(data);
} catch (IOException e) {
System.out.println("Error reading file.");
e.printStackTrace();
}
// First part is to run the a transform over the input to
extract the
// fragment to be digested. This is done by setting up a
Transforms
// object from a Template and then executing against the input
document
// The transforms to be performed are specified by using the
template XML below.
String transformStr =
"<?xml version='1.0'?>\n"
+ "<dsig:Transforms xmlns:dsig='http://www.w3.org/2000/09/xmldsig#'
xmlns:gt='http://www.govtalk.gov.uk/CM/envelope'
xmlns:ir='http://www.govtalk.gov.uk/taxation/CISrequest'>\n"
+ "<dsig:Transform
Algorithm='http://www.w3.org/TR/1999/REC-xpath-19991116'>\n"
+ "<dsig:XPath>\n"
+
"count(ancestor-or-self::node()|/gt:GovTalkMessage/gt:Body)=count(ancestor-or-self::node())\n"
+ " and count(self::ir:IRmark)=0 \n"
+ " and count(../self::ir:IRmark)=0 \n"
+ "</dsig:XPath>\n"
+ "</dsig:Transform>\n"
+ "<dsig:Transform
Algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315#'/>\n"
+ "</dsig:Transforms>\n"
;
// Parse the transform details to create a document
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db=dbf.newDocumentBuilder();
Document doc=db.parse(new
ByteArrayInputStream(transformStr.getBytes()));
// Construct a Apache security Transforms object from that
document
Transforms transforms = new
Transforms(doc.getDocumentElement(), null);
// Now perform the transform on the input to get the results.
XMLSignatureInput input = new XMLSignatureInput(data);
XMLSignatureInput result = transforms.performTransforms(input);
// Uncomment this line to see transform output
// System.out.println(new String(result.getBytes()));
// Second part is to run output via SHA1 digest
// This is done via the standard java.security API
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(result.getBytes());
byte[] digest=md.digest();
// And finally print a Base64 of the digest with
// The help of the BouncyCastle JCE library
System.out.println("IRmark: " + new
String(Base64.encode(digest)));
}
}
Thanks A+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Create Web Applications With ColdFusion MX7 & Flex 2.
Build powerful, scalable RIAs. Free Trial
http://www.adobe.com/products/coldfusion/flex2/?sdid=RVJS
Archive:
http://www.houseoffusion.com/groups/CF-Talk/message.cfm/messageid:275148
Subscription: http://www.houseoffusion.com/groups/CF-Talk/subscribe.cfm
Unsubscribe:
http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=11502.10531.4