Thanks Patrick,

The cast didn't blow, but I'm not sure it worked either. 
I changed the variable for comparison - printed below. 

It looks like it did what you described should happen but the subsequent call 
to getService failed with $IenterpriseSession being undefined, like it's not 
really what we had hoped it would be.

In this Java code:
boInfoStore = (IInfoStore) boEnterpriseSession.getService("", "InfoStore");

IInfoStore is the type that the boEnterpriseSession.getService("", 
"InfoStore"); is being cast to (I think)

So I tried this:
$iStore = cast('com.crystaldecisions.sdk.occa.infostore.IInfoStore', 
$IenterpriseSession)->getService("", "InfoStore");

But that failed:
Type casting can only be used on Java objects. Use 'coerce' instead.

Code with you suggested changes:
$sessionMgr = 
com::crystaldecisions::sdk::framework::CrystalEnterprise->getSessionMgr();
$enterpriseSession = $sessionMgr->logon(userid, "password", 
'td334.us.company.net:6400', secEnterprise);

print $enterpriseSession;
main::com::crystaldecisions::sdk::framework::internal::EnterpriseSession=HASH(0xe7f908)

$IentrepriseSession = 
cast('com.crystaldecisions.sdk.framework.IEnterpriseSession', 
$enterpriseSession);

print $IentrepriseSession;
main::com::crystaldecisions::sdk::framework::IEnterpriseSession=HASH(0xde9480)

$iStore = $IenterpriseSession->getService("", "InfoStore");

Can't call method "getService" on an undefined value 

-----Original Message-----
From: Patrick LeBoutillier [mailto:[EMAIL PROTECTED] 
Sent: Tuesday, July 08, 2008 8:04 PM
To: Vanole, Mike
Cc: Jason Stelzer; inline@perl.org
Subject: Re: Inline Java and the Business Objects SDK

Mike,

You're on the right track. The problem is that Inline::Java always
uses the base type and things can get a bit strange when an API is
constantly using interfaces as return types:

Try this:

my $sessionMgr =
com::crystaldecisions::sdk::framework::CrystalEnterprise->getSessionMgr();

my $enterpriseSession = $sessionMgr->logon(userid, "password",
'td334.us.company.net:6400', secEnterprise);

# Force Inline::Java to see $entrepriseSession as a
com.crystaldecisions.sdk.framework.IEnterpriseSession object, not it's
real "internal" type
$entrepriseSession =
cast('com.crystaldecisions.sdk.framework.IEnterpriseSession',
$enterpriseSession) ;

my $iStore = $enterpriseSession->getService("", "InfoStore");


Do this work better? If it does, you will probably need to keep on
casting the objects returned from methods to the type the API says it
returns.


Patrick


-- 
=====================
Patrick LeBoutillier
Laval, Québec, Canada

Reply via email to