Re: New to Inline::Java and a quick question

[email protected] (Russ Tremain) Fri, 13 Dec 2013 12:10:25 -0800
Newsgroups perl.inline
Message-ID <p06240805ced1097d06a7@[10.0.100.199]>
The problem is your constructor is generating an 
exception, which you are not catching in your 
perl code.  Try creating the following files and 
then:

$ javac MyJAXB.java testMyJAXB.java
$ perl testjaxb.pl
hello world args length is 1
arg[0]=HELLO FROM PERL
checkpoint1
JAVA CAUGHT EXCEPTION: "com.example.foo" doesnt 
contain ObjectFactory.class or jaxb.index
checkpoint1
PERL CAUGHT UNEXPECTED EXCEPTION: 'Unexpected 
exception of type 'javax.xml.bind.JAXBException': 
"com.example.foo" doesnt contain 
ObjectFactory.class or jaxb.index at 
/usr/local/perl/lib/site_perl/5.8.9/darwin-2level/Inline/Java/Object.pm 
line 49.
  at testjaxb.pl line 18.
  at testjaxb.pl line 18.
'

Note that Inline::Java::caught() is *not* 
catching the java exception.  Possibly because 
the MyJAXB object was never created, the 
exception object was also destroyed.

-Russ

==> testjaxb.pl <==
package main;

use Inline::Java qw(caught);
use Inline (
     Java => 'STUDY',
     STUDY => ['testMyJAXB', 'MyJAXB'],
     CLASSPATH => '.',
) ;

my $obj;

$obj = main::testMyJAXB->new();
$obj->main(["HELLO FROM PERL"]);

#now create MyJAXB, but catch the exception in perl instead of java:
eval {
     $obj = main::MyJAXB->new();
};

if ($@){
     if (caught("java.lang.Exception")) {
         my $msg = $@->getMessage() ;
         printf "PERL CAUGHT java exception: '%s'\n", $msg;
     }
     else{
         #unexpected Inline::Java exception:
         printf "PERL CAUGHT UNEXPECTED EXCEPTION: '%s'\n", $@;
     }
}

==> MyJAXB.java <==
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigInteger;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import java.util.*;

public class MyJAXB {
     public MyJAXB() throws 
javax.xml.bind.JAXBException, 
FileNotFoundException, SAXException
     {
         System.out.println("checkpoint1");
         JAXBContext context = 
JAXBContext.newInstance("com.example.foo:com.example.bar");
         System.out.println("checkpoint2");
     }
}

==> testMyJAXB.java <==
public class testMyJAXB {
     public static void main(String[] args) {

         System.out.println("hello world args length is " + args.length );

         for (int ii=0; ii< args.length; ii++) {
             System.out.println("arg["+ii+"]="+args[ii]);
         }


         try {
             MyJAXB xx = new MyJAXB();
         } catch (Exception e) {
             System.out.println("CAUGHT EXCEPTION: " + e.getMessage());
         }

         return;
     }
}


At 11:06 PM -0800 12/12/13, David Wang wrote:
>Hi Russ
>
>Thanks. Pls do the following
>
>In your perlAPI.pm add the following (in the same file).
>
>==> perl script calls
>
>eval {$self->{CONNECTION} = new perlAPI::MyJAXB();};
>
>==> The following is the Java JAXB stuff
>__DATA__
>__Java__
>import java.io.BufferedReader;
>import java.io.File;
>import java.io.FileInputStream;
>import java.io.FileNotFoundException;
>import java.io.FileReader;
>import java.io.IOException;
>import java.math.BigInteger;
>
>import javax.xml.bind.JAXBContext;
>import javax.xml.bind.JAXBException;
>import javax.xml.bind.Unmarshaller;
>import javax.xml.parsers.DocumentBuilder;
>import javax.xml.parsers.DocumentBuilderFactory;
>import org.w3c.dom.Document;
>import org.w3c.dom.NamedNodeMap;
>import org.w3c.dom.Node;
>import org.w3c.dom.NodeList;
>import org.xml.sax.SAXException;
>
>import java.util.*;
>
>public class MyJAXB {
>   public MyJAXB() throws javax.xml.bind.JAXBException,
>       FileNotFoundException, SAXException
>   {
>     System.out.println("checkpoint1");
>     JAXBContext context = 
>JAXBContext.newInstance("com.example.foo:com.example.bar");
>     System.out.println("checkpoint2");
>
>   }
>}
>
>
>  "checkpoint2" will never be reached. If you do 
>the DEBUG =>4, you will see the error
>
>>>[perl][3]   perl doesn't know about 
>>>'javax.xml.bind.JAXBException' ('perlAPI::javax::xml::bind::JAXBException')
>>>
>
>use Inline (
>     Java => 'DATA',
>     J2SDK => $ENV{JAVA_HOME},
>     CLASSPATH => 'classes',
>
>     DEBUG => 4,
>);
>
>Pls let me know how it goes. I really hope its 
>something I did wrong meaning it works on your 
>end.
>
>
>From: Russ Tremain <[email protected]>
>To: David Wang <[email protected]>
>Cc: "[email protected]" <[email protected]>
>Sent: Thursday, December 12, 2013 7:32 PM
>Subject: Re: New to Inline::Java and a quick question
>
>
>#yiv7039752953 #yiv7039752953 -- blockquote, 
>#yiv7039752953 dl, #yiv7039752953 ul, 
>#yiv7039752953 ol, #yiv7039752953 li 
>{padding-top:0;padding-bottom:0;} #yiv7039752953 
>Re: New to Inline::Java and a quick question
>can you publish your full example?  I can try it 
>my environment to see if it works for me.
>
>Also, when you installed inline::Java, did it pass all the tests?
>
>At 5:18 PM -0800 12/12/13, David Wang wrote:
>
>>Thanks. my perl version is v5.8.8 . It works 
>>with Java fine. Just not with JAXB at this 
>>current
>>
>>moment.
>>
>>
>>
>>From: Russ Tremain <[email protected]>
>>To: David Wang <[email protected]>
>>Cc: David Mertens <[email protected]>; 
>>"[email protected]" <[email protected]>
>>Sent: Thursday, December 12, 2013 5:05 PM
>>Subject: Re: New to Inline::Java and a quick question
>>
>>
>>#yiv3571647833 #yiv3571647833 -- blockquote, 
>>#yiv3571647833 dl, #yiv3571647833 ul, 
>>#yiv3571647833 ol, #yiv3571647833 li 
>>{padding-top:0;padding-bottom:0;} 
>>#yiv3571647833 Re: New to Inline::Java and a 
>>quick question
>>
>>one thing I can tell you is I have never gotten 
>>Inline::Java to work with any perl later than 
>>5.8.9.
>>
>>I have used it extensively with JDBC.pm.  Example of this can be found here:
>>
>>
>>         https://github.com/russt/sqlpj
>>
>>
>>best of luck!
>>
>>-Russ
>>
>>
>>
>>At 4:57 PM -0800 12/12/13, David Wang wrote:
>>
>>>Thanks
>>>
>>>
>>>I am not sure if anybody has any experience 
>>>with perl Inline::Java to call Java JAXB . 
>>>Basically, I have added some code in my perl 
>>>script to call some of my Java API that calls 
>>>JAXB.
>>>
>>>
>>>System.out.println("before·");
>>>
>>>JAXBContext context = JAXBContext.newInstance("SomeXMLPackage");
>>>
>>>System.out.println("after·");
>>>
>>>
>>>and it fails on the JAXB statement above. I 
>>>then added Debug and AUTOSTUDY  option in perl 
>>>like below
>>>
>>>
>>>use Inline (
>>>
>>>     Java => 'DATA',
>>>
>>>     J2SDK => $ENV{JAVA_HOME},
>>>
>>>     CLASSPATH => 'classes',
>>>
>>>     AUTOSTUDY => 1,
>>>
>>>     DEBUG => 4,
>>>
>>>);
>>>
>>>
>>>then I see
>>>
>>>[java][3]   packet sent is ok java_object:1:1:javax.xml.bind.JAXBException
>>>
>>>[perl][3]   packet recv is ok java_object:1:1:javax.xml.bind.JAXBException
>>>
>>>[perl][3]   checking if stub is array...
>>>
>>>[perl][3]   perl doesn't know about 
>>>'javax.xml.bind.JAXBException' 
>>>('perlAPI::javax::xml::bind::JAXBException')
>>>
>>>[perl][2]  autostudying javax.xml.bind.JAXBException...
>>>
>>>[perl][3]   perl doesn't know about 
>>>'javax.xml.bind.JAXBException' 
>>>('perlAPI::javax::xml::bind::JAXBException')
>>>
>>>[perl][3]   reporting on javax.xml.bind.JAXBException
>>>
>>>
>>>I hope perl inline works with JAXB . BTW, my 
>>>Java API works fine meaning I use a Java main 
>>>to call this
>>>
>>>API and the xml file is loaded without problem.
>>>
>>>
>>>thanks,
>>>
>>>
>>>David
>>>
>>>
>>>
>>>
>>>
>>>
>>>From: David Mertens <[email protected]>
>>>To: David Wang <[email protected]>
>>>Cc: "[email protected]" <[email protected]>
>>>Sent: Thursday, December 12, 2013 5:37 AM
>>>Subject: Re: New to Inline::Java and a quick question
>>>
>>>
>>>Yep, as a rule, if you need to install a Perl 
>>>module, a simple "cpan Module::Name" should do 
>>>it. If you are on a Unixish system, you may 
>>>have installation permission issues, in which 
>>>case there are known work-arounds. But I'm 
>>>sure you'll ask when you come to those. :-)
>>>
>>>Good luck, and don't be afraid to ask more questions as they come up!
>>>
>>>David
>>>
>>>
>>>
>>>On Wed, Dec 11, 2013 at 7:38 PM, David Wang 
>>><<mailto:[email protected]>[email protected]> 
>>>wrote:
>>>
>>>Ok, I figured it out. Hope it can be documented somewhere.
>>>
>>>
>>>Download Inline-0.53
>>>
>>>go to the dir
>>>
>>>cpan Inline::Java  << was instructed by some nice guy
>>>
>>>
>>>Thanks
>>>
>>>
>>>David
>>>
>>>
>>>
>>>
>>>From: David Wang <<mailto:[email protected]>[email protected]>
>>>To: "<mailto:[email protected]>[email protected]" 
>>><<mailto:[email protected]>[email protected]>
>>>Sent: Wednesday, December 11, 2013 4:25 PM
>>>Subject: New to Inline::Java and a quick question
>>>
>>>
>>>Hi
>>>
>>>
>>>I am very new to this stuff, just started to 
>>>hear about it today. I looked around the web 
>>>and I find the installation
>>>
>>>instructions for inline::c like the following
>>>
>>>
>>>perl Makefile.PL;
>>>
>>>make;
>>>
>>>make test;
>>>
>>>make install;
>>>
>>>
>>>But I can't find anywhere else that tells us 
>>>how to install inline::Java ? BTW, I found the 
>>>latest Inline is Inline-0.53.tar.gz  and I use 
>>>Redhat 5
>>>
>>>
>>>Thanks
>>>
>>>
>>>David
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>--
>>>  "Debugging is twice as hard as writing the code in the first place.
>>>   Therefore, if you write the code as cleverly as possible, you are,
>>>   by definition, not smart enough to debug it." -- Brian Kernighan