Andrew,

I ran into this same issue doing stuff with SAML. Make sure you haven't
moved the class file after it has been compiled. In other words, once
you compile the Java class, you can't move it around to the classes
library or some other directory. I don't know why, but ever time I moved
my class file, the Init.init() call would fail. Also, ensure all the
Apache XML libraries are in your CF classpath. Finally, you don't have a
constructor on your class so your call should be: <cfset ret =
myObj.main("input.xml")>. HTH,

Phil

-----Original Message-----
From: Andrew Whone [mailto:[EMAIL PROTECTED] 
Sent: Friday, April 13, 2007 10:53 AM
To: CF-Talk
Subject: CF and Java

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(ancest
or-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:275160
Subscription: http://www.houseoffusion.com/groups/CF-Talk/subscribe.cfm
Unsubscribe: 
http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=11502.10531.4

Reply via email to