Wrapper methods
I need some clarification for something i just came across:
I would understand that the native keyword signals to the Java compiler that the function is a native language function.
Is it possible to call method which does not exits in the native dll but in turn this method calls for certain native methods in the wrapper dll?
for example lets say I declare a method:
native int dummymethod();
...and there isn't a method which maps to this in the native DLL,
but could I in the wrapper file call a native method inside this:
JNIEXPORT jint JNICALL Java_myClass_dummymethod
(JNIEnv *env, jobject obj)
jint myimgHeight;
myimgHeight=Height();// height is the native method of the DLL
myimgHeight=myimgHeight*2;
//perform other actions here
return myimgHeight;
.....is this possible?!
I have also seen these statements for some example file:
JNIEXPORT jint JNICALL Java_exampleJNI_get_1MaxTime(JNIEnv *jenv, jclass jcls)
I wonder what the "1MaxTime" stands for as it does not map any native method with a "1" perfix.
thanks
bschauwe, let me explain my situation a little better, I am here debugging a code written by someone else, where I came across:
native byte[] ImageData();
Now expecting to see a ImageData() function defined in the .h of the third party DLL, I ran into a dead end! There was no such declaration for this method in the header. So i was left wondering if a different method was called under ImageData() in the native method implementation.
Take a look at this thread, maybe this is how it works as well,
http://forum.java.sun.com/thread.jsp?forum=52&thread=416532
davidnjclarke, calls
public native void MyDLLfunction();
but goes on to say,
JNIEXPORT void JNICALL
Java_MyDLL_myDLLfunction(JNIEnv *env, jobject obj)
MyRealFunction();
return;
there is a discrepancy between the method names called(MyDLLfunction and MyRealFunction)....is this valid?
Similar Messages
-
What exactly is the difference between wrapper method and normal method?
I need to write a wrapper method for a private method but i don't what exactly the wrapper method does?Normal Method:
private boolean remove(Node < E > head, Node < E > pred, E outData) {
if (head == null) // Base case ? empty list.
return false;
else if (head.data.equals(outData)) { // 2nd base case.
pred.next = head.next; // Remove head.
return true;
else
return remove(head.next, head, outData);
}Wrapper Method:
public boolean remove(E outData) {
if (head == null)
return false;
else if (head.data.equals(outData)) {
head = head.next;
return true;
else
return remove(head.next, head, outData);
}Above is example of a normal method and of its wrapper method. I need to write a same kind of normal method and wrapper method. -
Calling a document style web service using a pl/sql wrapper method
Just wanted to find out if anybody has a working example of invoking a document style web service from Oracle 10g database on a Unix environment.
We have java test class that invokes the web service, and we are trying to use a pl/sql wrapper to invoke a Java Web Service client. So far, we are encountering an End of File Communication error from Oracle which essentially terminates the session with the database.
On the Oracle application server side we are able to see a successful HTTP request made to the application server via server log, which is hosting the web service, since we are registering HTTP 200 success codes. However, we do not see any other errors from the application in the server logs. Most likely since the client side fails, before actually getting a chance to invoke the web service. This has been verified by commenting the client code leaving the print statements. The first call to the Service Factory method (XFire) to look up the service is where the PL/SQL procedure fails with an End of File communication error.Remove the when others section and see the actual error and post that.
http://tkyte.blogspot.com/2008/06/when-others-then-null-redux.html
http://tkyte.blogspot.com/2007/03/dreaded-others-then-null-strikes-again.html -
Using a static wrapper method to access session
Hello,
I'm attempting to develop a utility class comprised of static convenience methods that will access the different scopes. Given the fact that the methods are static, will this pose any risk in a multi-threaded environment? See example below. Thanks.
public static void setSessionObject(HttpServletRequest req, String attrName,
Object object) {
HttpSession session = req.getSession(false);
if (session != null) {
session.setAttribute(attrName, object);
}What happens if two instances call this method simultaneously? Would it be possible to set the wrong attribute in the wrong session?
-
No Method Signature - initQuery error after VO Substitution
Hi All,
I have done a VO Substitution for "NewBankAccountVOImpl". Below is the exact Requirement,
iReceivables -> Query for a given Customer -> Go to accounts Tab -> Try to Pay off an invoice -> You get an option choose Payment Method as "New Bank Account" ->
Now there are three field Routing Number, Account Number and Account Holder
I need to restrict Account Number to minimum three characters. In 11.5.10 Oracle do not have this validation.
So I checked out the place where the Routing Number and Account Number Validation happen i.e "NewBankAccountVOImpl" and extended the same to custom VOImpl and copied all the standard code to my custom code as below,
package mercury.oracle.apps.ar.irec.accountDetails.pay.server;
import oracle.apps.ar.irec.accountDetails.pay.server.NewBankAccountVOImpl;
import oracle.apps.ar.irec.accountDetails.pay.server.NewBankAccountVORowImpl;
import java.sql.Types;
import java.lang.String;
import oracle.apps.ar.irec.accountDetails.pay.utilities.PaymentUtilities;
import oracle.apps.ar.irec.framework.IROAViewObjectImpl;
import oracle.apps.fnd.common.VersionInfo;
import oracle.apps.fnd.framework.OAException;
import oracle.apps.fnd.framework.server.*;
import oracle.apps.fnd.framework.webui.OAWebBeanConstants;
import oracle.jbo.RowIterator;
import oracle.jbo.RowSetIterator;
import oracle.jbo.domain.Number;
import oracle.jbo.server.DBTransaction;
import oracle.jdbc.driver.OracleCallableStatement;
import oracle.jdbc.driver.OraclePreparedStatement;
// --- File generated by Oracle Business Components for Java.
// --------------- Modification History --------------------------
// Date Created By Description
// 04/01/2011 Veerendra K Account Number Validation to raise
// error if Account Number entered is
// less than 3 Digits
public class MMARNewBankAccountVOImpl extends NewBankAccountVOImpl
* This is the default constructor (do not remove)
public MMARNewBankAccountVOImpl()
public void initQuery()
if(!isExecuted())
executeQuery();
reset();
// Wrapper Method to validate Routing Number and Account Number
public void validateNewBankAccount()
OAApplicationModuleImpl oaapplicationmoduleimpl = (OAApplicationModuleImpl)getApplicationModule();
RowSetIterator rowsetiterator = createRowSetIterator("iter");
rowsetiterator.reset();
NewBankAccountVORowImpl newbankaccountvorowimpl = (NewBankAccountVORowImpl)rowsetiterator.next();
rowsetiterator.closeRowSetIterator();
OAException oaexception = null;
//object obj = null;
int i = validateRoutingNumber(newbankaccountvorowimpl.getStrippedRoutingNumber());
if(i == 0)
OAException oaexception1 = new OAException("AR", "ARI_INVALID_ROUTING_NUMBER");
if(oaexception == null)
oaexception = oaexception1;
else
oaexception.setNextException(oaexception1);
} else
if(i == 2)
OAException oaexception2 = new OAException("AR", "ARI_CREATE_BANK_ACCOUNT");
if(oaexception == null)
oaexception = oaexception2;
else
oaexception.setNextException(oaexception2);
// Added by VEERENDRA KODALLI to limit addition of New Bank Account with Minimum 3 Digits
if(validateBankAccountNumber(newbankaccountvorowimpl.getStrippedBankAccountNumber()))
// Define Exception with FND Message MMARI_INVALID_BA_NUMBER
OAException oaexception4 = new OAException("AR", "MMARI_INVALID_BA_NUMBER");
if(oaexception == null)
oaexception = oaexception4;
else
oaexception.setNextException(oaexception4);
// Method to Validate if Entered Account Number and Routing Number Combination already exist
if(validateDuplicateBankAccountNumber(newbankaccountvorowimpl.getStrippedBankAccountNumber(), newbankaccountvorowimpl.getStrippedRoutingNumber(), newbankaccountvorowimpl.getAccountHolderName()))
OAException oaexception3 = new OAException("AR", "ARI_DUPLICATE_BA_NUMBER");
if(oaexception == null)
oaexception = oaexception3;
else
oaexception.setNextException(oaexception3);
if(oaexception != null)
oaexception.setApplicationModule(oaapplicationmoduleimpl);
throw oaexception;
} else
return;
// Method to Validate Routing Number
public int validateRoutingNumber(String s)
boolean flag = PaymentUtilities.checkDigits(s);
if(!flag)
return 0;
OAApplicationModuleImpl oaapplicationmoduleimpl = (OAApplicationModuleImpl)getApplicationModule();
OADBTransaction oadbtransaction = (OADBTransaction)oaapplicationmoduleimpl.getDBTransaction();
if(oadbtransaction.isLoggingEnabled(2))
oadbtransaction.writeDiagnostics(this, "Start validateRoutingNumber", 2);
String s1 = "BEGIN :1 := ARP_BANK_DIRECTORY.is_routing_number_valid(:2,:3); END;";
OracleCallableStatement oraclecallablestatement = (OracleCallableStatement)oadbtransaction.createCallableStatement(s1, 1);
int i = 0;
try
oraclecallablestatement.registerOutParameter(1, -5, 38, 38);
oraclecallablestatement.setString(2, s);
oraclecallablestatement.setString(3, "ABA");
oraclecallablestatement.execute();
i = oraclecallablestatement.getInt(1);
catch(Exception exception1)
exception1.printStackTrace();
throw OAException.wrapperException(exception1);
finally
try
oraclecallablestatement.close();
catch(Exception exception2)
throw OAException.wrapperException(exception2);
// Debug Message
if(oadbtransaction.isLoggingEnabled(2))
oadbtransaction.writeDiagnostics(this, "End validateRoutingNumber", 2);
return i;
// Method to Validate Duplicate Account Number
public boolean validateDuplicateBankAccountNumber(String s, String s1, String s2)
OAApplicationModuleImpl oaapplicationmoduleimpl = (OAApplicationModuleImpl)getApplicationModule();
OADBTransaction oadbtransaction = (OADBTransaction)oaapplicationmoduleimpl.getDBTransaction();
if(oadbtransaction.isLoggingEnabled(2))
// Debug Message
oadbtransaction.writeDiagnostics(this, "Start validateDuplicateBankAccountNumber", 2);
String s3 = "BEGIN :1 := AR_IREC_PAYMENTS.is_bank_account_duplicate(:2,:3,:4); END;";
OracleCallableStatement oraclecallablestatement = (OracleCallableStatement)oadbtransaction.createCallableStatement(s3, 1);
boolean flag = true;
try
oraclecallablestatement.registerOutParameter(1, -5, 38, 38);
oraclecallablestatement.setString(2, s);
oraclecallablestatement.setString(3, s1);
oraclecallablestatement.setString(4, s2);
oraclecallablestatement.execute();
Number number = new Number(oraclecallablestatement.getLong(1));
if(number.equals(new Number("0")))
flag = false;
else
flag = true;
catch(Exception exception1)
exception1.printStackTrace();
throw OAException.wrapperException(exception1);
finally
try
oraclecallablestatement.close();
catch(Exception exception2)
throw OAException.wrapperException(exception2);
// Debug Message
if(oadbtransaction.isLoggingEnabled(2))
oadbtransaction.writeDiagnostics(this, "End validateDuplicateBankAccountNumber", 2);
return flag;
public boolean validateBankAccountNumber(String s)
OAApplicationModuleImpl oaapplicationmoduleimpl = (OAApplicationModuleImpl)getApplicationModule();
OADBTransaction oadbtransaction = (OADBTransaction)oaapplicationmoduleimpl.getDBTransaction();
// Debug Message
if(oadbtransaction.isLoggingEnabled(2))
oadbtransaction.writeDiagnostics(this, "Start validateBankAccountNumber", 2);
boolean flag = true;
try
// Check if the Account Number Length is less than 3 Digits
if(s.length() < 3)
flag = true;
// Debug Message
if(oadbtransaction.isLoggingEnabled(2))
oadbtransaction.writeDiagnostics(this, "Account Number Less than 3 Digits!", 2);
else
// Debug Message
if(oadbtransaction.isLoggingEnabled(2))
oadbtransaction.writeDiagnostics(this, "Account Number greater than 3 Digits!", 2);
flag = false;
//return PaymentUtilities.checkDigits(s);
catch (Exception exception4)
//if(oadbtransaction.isLoggingEnabled(2))
//oadbtransaction.writeDiagnostics(this, "Entered Catch", 2);
throw OAException.wrapperException(exception4);
if(oadbtransaction.isLoggingEnabled(2))
// Debug Message
oadbtransaction.writeDiagnostics(this, "End validateBankAccountNumber", 2);
return flag;
public static final String RCS_ID = "$Header: NewBankAccountVOImpl.java 115.8 2008/07/21 13:49:37 nkanchan noship $";
public static final boolean RCS_ID_RECORDED = VersionInfo.recordClassVersion("$Header: NewBankAccountVOImpl.java 115.8 2008/07/21 13:49:37 nkanchan noship $", "oracle.apps.ar.irec.accountDetails.pay.server");
I did compile the Java File and also the JPX import. It was all successful. I tested the code and it worked as expected. Now I see an exception on the page when I click the Pay button stating "No Method Signature No Method Signature - initQuery".
The error do not come when I take out my substitution. Any one know what might be the reason for above issue. I have no idea why all of a sudden it stopped working and checked all standard filles but none got changed.
Any pointers towards to resolve the same would be appreciable.
Thanks in Advance,
VeerendraUma,
try to delete all class files, recompile and run! Also, check if any CO is not extended other than from OAControllerImpl, although it would not be generally.
--Mukul -
Best practice for method calling on objects within a collection.
Hi guys
As you may be aware, based on my other thread here. I'm designing a card game in Java. I was hoping for some advice on the best practise on how methods should be called on a custom Object contained within a custom Collection.
I have an instance variable for the Deck class as follows: List<Card> deckWhen creating an instance of the class I use deck = new ArrayList<Card>();So I have a Deck which only holds Card objects. My question is, for the Card methods, should I call them on the Card objects after 'getting' the Cards from the Deck or should I write methods within the Deck class which handles this method calling. Code explanation is as follows:
Deck standardDeck = new Deck();I want to retrieve the suit value of a card within the deck. Is this the best way to do it this way:
standardDeck.getCardAt(50).getSuit();
//getCardAt is a method within the Deck class, getSuit() is a method within the Card classor this way:
standardDeck.getSuitForCardAt(50);
//getSuitForCardAt() is a method within the Deck class. This method calls the getSuit() method within its method body.Cheers for any help guys.
Edited by: Faz_86 on Jul 10, 2010 9:53 AMHey Saish
Thanks for the response.
My Card class does indeed override hashCode(), equals() and toString().
The reason I am asking a card from the deck for its Suit is simply because of the rules of the game being played. The game I made is a 'Card Shredding' game where a player attempts to remove as many cards from their hand during each turn. The first to remove all their cards is the winner.
When the game starts, two decks are created. A standard 52 card deck and an empty deck. Then 8 cards are dealt to each player and one card is dealt into the empty deck. The suit and value of the card on the empty deck called the 'shredding deck' dictates which moves are valid during each turn; The played card must match the Suit or the Value of the current card on the 'shredding deck'
For example:
Card on the empty deck = 8 of Spades
The only card from a players hand which can be removed are any Spade or an Eight of any suit.
Going back to the Deck.getSuitOfCardAtIndex(int index) , this method is needed because both the AI player and human player need to have the ability to take a look at the cards which have been added to the 'shredding deck'. Again this is because of the rules of the game. Therefore I need a method to take a look at the Suit and Value for any card in the 'shredding deck'.
Taking all this into account, so far I have the following in my Deck class. Please comment on my design so far. As you can see I've tried to follow the Law Of Demter by creating many little wrapper methods. I understand totally wh getters and setters are bad but I cannot come up with a design solution to achieve what I need to based on the rules of the game without users getters. - Any tips on this would be great.
public Card dealCard()
Card cardToDeal = deck.remove(0);
return cardToDeal;
public void addCard(Card usedCard) //This method is used to add 'used' cards to the deck.
deck.add(usedCard);
public Card getFaceCard() //Returns the current face up playing card
Card faceCard = deck.get(deck.size()-1);
return faceCard;
public int getFaceCardValue()
int faceCardValue = deck.get(deck.size()-1).getValue();
return faceCardValue;
public int getFaceCardSuit()
int faceCardSuit = deck.get(deck.size()-1).getSuit();
return faceCardSuit;
public String getFaceCardName()
String faceCardName = deck.get(deck.size()-1).toString();
return faceCardName;
public Card getCardAt(int position) //Returns the current face up playing card
Card card = deck.get(position);
return card;
public int getFaceCardValueAt(int position)
int cardValue = deck.get(position).getValue();
return cardValue;
public int getFaceCardSuitAt(int position)
int cardSuit = deck.get(position).getSuit();
return cardSuit;
public String getFaceCardNameAt(int position)
String cardName = deck.get(position).toString();
return cardName;
public int getDeckSize() //When recycling cards, the size of the deck is needed to determine the best time to add more cards.
return deck.size();
} -
A way to set a flag in java layer when native method has been called?
Hi,
I'm calling a native method from the java layer through to a native c function. Is there a way I can set a flag in the java layer when this native method has been called?
Thanks!1. Create a wrapper method. The wrapper method is the only exposed method. It calls the native method. It sets the flag.
2. Set the flag in the native method itself.
3. You might be able to use the debugging API to do this however it is going to require quite a bit of work. And it injects itself at runtime.
Is there a reason for this request? There might be other solutions if a general problem was posed. -
How can we call methods of one web dynpro component in another one
Hello Team,
How do I call one Web Dynpro component methods in another Web Dynpro component.
How do we use public parts.
thanksHi,
You want to use Comp2's getData() method in Comp1
If both the WebDynpro components are in the same DC:
1. Create a wrapper method (with the same signature) in the Comp2's Interface controller. And invoke the Component contorller's getData() method in this method using the below code.
wdThis.wdGetComp2Controller.getData()
2. Now Go to the Comp1 and right click on UsedWebDynproComps and add this Comp2 as a UsedWebDypro component.
3. Now go to the Component Controller of Comp1 and in properties tab add the usage declaration of Interface controller of Comp2.
4. Now using this below code you can access the method of InterfaceController of Comp2.
wdThis.wdGetComp2Interface().getData();
If both the WebDynpro components are in different DCs:
1. Right click on Comp2 and select Add to public part on Comp2 in DC2.
2. Now Add this public part in DC1 UsedDCs.
Now repeat the above stpes 1...to..4. of "If both the WebDynpro components are in the same DC" same.
Regards,
Charan -
Exposing ViewImp methods to AppModule
Hi
I am using JDeveloper Studio Edition Version 11.1.2.2.0 and ADF.
Just simple question.
I created custom method inside EmployeesImpl class. In order to call it from my AppModule, do I need to expose it through Object Client Interface, or is there other way to enable this?
ThxIs this EmployeesImpl a VO? If yes then exposing it to the client interface is the way to go.
Only other thing you can do e.g. if you don't want the VO to be exposed in the data model, is to write a wrapper method in the application module (where you can access the ViewImpl) and expose this method in the application module client interface. This way external users can only see your wrapper method but not the whole VO.
Timo -
Problem with ClassCastException in web application
Hello,
I'm trying to deploy a web application in WLS 5.1 and I'm getting the
"dreaded" ClassCastException every time when JSP tries to read a bean
from the request or session. Under my architecture (actually it's just
the regular "model 2" ) bean is populated by a servlet, set on the
request and then retrieved by JSP (servlet forwards to JSP). Everything
work fine when I register servlets in weblogic.properties, but
ClassCastException is thrown on any attempt to read from the request if
the same JSPs and servlets are deployed as web application.
Has anybody come across the same problem?
Thanks in advance for help.
Alexander
Hello,
This is all well and good as a temporary bug, but it's totally unrealistic for
the future. Two points:
* The ClassLoader doesn't need to be discarded, it just needs to be cleared.
* Other servlet engines seem to be able to handle this.
Hope it's on its way to resolution!
TDoan wrote:
> Alexander:
>
> I had some problem with ClassCastException, and recently I found out what it
> was that causing it. I'm sure if this is the same problem you are having,
> but please read the following paragraph.
>
> I cutted this from http://www.weblogic.com/docs51/classdocs/API_servlet.html
> ClassCastException and HTTP Sessions
>
> You might encounter a ClassCastException while developing servlets that use
> HTTP sessions. This could happen as a result of the following set of events:
>
> a.. You store a reference to a custom class, myFoo, in an HTTP session.
>
> b.. While in mid-session, you change your servlet (or JSP or JHTML),
> causing it to be reloaded. In fact, it is necessary for it to be reloaded by
> a completely new class loader, and the old class loader that had previously
> loaded it must be discarded.
>
> c.. Because your custom class myFoo is also located under the servlet
> classpath, it too is reloaded by the new class loader.
>
> d.. Now, when you retrieve myFoo from the HTTP session, you cast it to the
> expected type, but you recieve a ClassCastException. The exception is thrown
> even if class myFoo has not changed. Because it has been loaded by a
> different class loader, it is regarded by the JVM as incompatible.
> Note: If you are using session persistence, the class contents must be
> serialized, and you will not encounter this exception.
>
> Here are some suggested work-arounds to this problem:
>
> a.. Do not place your class myFoo in the servlet classpath. Instead, place
> it in the system classpath or the weblogic.class.path, which are accessible
> by WebLogic Server. The class will not be reloaded when the servlet is
> modified. This drawback to this solution is that you cannot prototype the
> myFoo class, because you must restart the server in order to reload the
> class after it is modified.
>
> b.. If you need to prototype the class, you can write a wrapper method
> within it to store and retrieve its contents to and from the session. You do
> not access the class directly from the session, but instead call it is
> wrapper methods to store or populate it is contents from the session. As
> long as you use standard Java class types to store the class contents, they
> will not be reloaded when the servlet is reloaded. This approach has
> performance drawbacks because your wrapper methods would need to set or get
> multiple name=value pairs for each class's attributes.
>
> c.. Another work-around is to catch the ClassCastException, and replace
> the old class that is stored in the session with a newly instantiated class,
> or remove it from the session. Unfortunately, you lose the session data that
> was previously stored in the class, so you must write your application to
> handle this scenario. This is the easiest solution to the problem-remember
> that you should not be storing critical information in an HTTP session, but
> rather storing it in a database.
> Note: The ClassCastException generally occurs while you are developing
> your servlets, and should not be an issue in a stable production system. If
> you are upgrading your system online, you might wish to warn your customer
> base.
>
> Hope it helps,
> Tin
>
> "Alexander Ananiev" <[email protected]> wrote in message
> news:[email protected]...
> > Hello,
> >
> > I'm trying to deploy a web application in WLS 5.1 and I'm getting the
> > "dreaded" ClassCastException every time when JSP tries to read a bean
> > from the request or session. Under my architecture (actually it's just
> > the regular "model 2" ) bean is populated by a servlet, set on the
> > request and then retrieved by JSP (servlet forwards to JSP). Everything
> > work fine when I register servlets in weblogic.properties, but
> > ClassCastException is thrown on any attempt to read from the request if
> > the same JSPs and servlets are deployed as web application.
> > Has anybody come across the same problem?
> >
> > Thanks in advance for help.
> > Alexander
> >
-
See, here's the thing with dates in java, the way i see it. We used to have Date, but Date wasn't international so we got Calendar. But some things, like SimpleDateFormat, still expect java.util.Date. java.sql.Date is out there somewhere, too. None of them have direct support for date differences (i.e. dateA - dateB = 8 days, or whatever). Now you're probably reading this thinking "Java supports all of this" and you're right. Calendar has a getTime method that returns a Date, and i can just pass THAT to SimpleDateFormat. With a little math, getTimeInMillis can be used to find the difference in two Calendars. But i got to thinking, "There should only be one Date object i need to think about," and since i don't ever have enough to do at work i put one together. I don't know if any of you are going to care enough to use it, mostly i'm just looking for advice on features i should add to it, inefficiencies in the design, stuff that's hard to understand, or whatever.
This is it:
*This catastrophe brought to you by SrA Meyerin.
*Proximo Satis pro administatio.
package awesomedate;
//The following are imported for the toFormattedString(), toUtilDate(), toSQLDate, and toCalendar() methods, respectively.
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.sql.*;
import java.util.TimeZone;
*This class is designed to be the ultimate date object. It stores dates accurate to the millisecond, has the ability to do date
*arithmetic (adding/subtracting days/months/whatever), date comparison, and date formatting. Also it can, at will, be used as any
*of the other date objects in the standard java API.
public class AwesomeDate
*Milliseconds from the epoch. This field is where everything starts.
private long millis;
* The current year. This is the only aspect of the current date that is stored in addition to the milliseconds. Everything else
* is calculated as needed.
private int year;
//The following six variables are fairly self explanatory. I'll explain them anyway.
*Milliseconds in one non-leap year. This can be passed to the "adjustDate()" method
* but mostly it is used to make my code more readable.
public final static long MILLIS_IN_YEAR = 31536000000L;
*Milliseconds in one leap year. This can be passed to the "adjustDate()" method
* but mostly it is used to make my code more readable.
public static final long MILLIS_IN_LEAP_YEAR = 31622400000L;
*Milliseconds in one day. This can be passed to the "adjustDate()" method
* but mostly it is used to make my code more readable.
public static final long MILLIS_IN_DAY = 86400000;
*Milliseconds in one hour. This can be passed to the "adjustDate()" method
* but mostly it is used to make my code more readable.
public static final long MILLIS_IN_HOUR = 3600000;
*Milliseconds in one minute. This can be passed to the "adjustDate()" method
* but mostly it is used to make my code more readable.
public static final long MILLIS_IN_MINUTE = 60000;
*Milliseconds in one second. This can be passed to the "adjustDate()" method
* but mostly it is used to make my code more readable.
public static final long MILLIS_IN_SECOND = 1000;
*The number of days in each month.
private int[] daysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
*The timezone offset. GMT is 0, and the default, however, CST (where i live), is -6.
private int timeZoneOffset = -6;
*As the name would indicate, this is the number of milliseconds beyond 00:00 of jan 1 of the current year.
private long millisAfterYear;
*Basic constructor. Defaults to the current date and time. Works on Greenwich Mean Time, so it may seem off. To avoid this, multiply
*add your time zone offset * MILLIS_IN_HOUR to the time in milliseconds.
public AwesomeDate()
setTimeInMillis(System.currentTimeMillis());
*Fairly simple constructor. Sets time to the the number of milliseconds passed past the epoch.
public AwesomeDate(long millis)
setTimeInMillis(millis);
*This constructor sets the date to the year/month/day passed.
public AwesomeDate(int year, int month, int day)
setDate(year, month, day);
*This constructor sets the date time to the year/month/day/minute/hour/second passed.
public AwesomeDate(int year, int month, int day, int hour, int minute, int second)
setDate(year, month, day, hour, minute, second);
*When you have the number of milliseconds, the first thing you must calculate is year. Because the number of milliseconds in a
*year may vary, this is also the most difficult to calculate. This is the method that does it, though.
private void setYearAfter1970()
//I don't want to alter the actual number of milliseconds, so i make this variable and perform calculations on it.
long theseMillis = this.millis;
//Start at 1970 (the epoch) and work from there.
year = 1970;
long nextYear = MILLIS_IN_YEAR;
//In this loop i subtract the number of millis in whatever year. The condition is if i have enough millis to make it through
//another year.
while (theseMillis >= nextYear)
if (isLeapYear(year))
theseMillis = theseMillis - MILLIS_IN_LEAP_YEAR;
nextYear = MILLIS_IN_YEAR;
else
theseMillis = theseMillis - MILLIS_IN_YEAR;
if (isLeapYear(year + 1))
nextYear = MILLIS_IN_LEAP_YEAR;
year++;
millisAfterYear = theseMillis;
this.year = year;
*Calculating the year from before 1970 must be done differently. It's pretty much just inverted.
private void setYearBefore1970()
long theseMillis = this.millis;
year = 1970;
long nextYear = MILLIS_IN_YEAR;
while (theseMillis <= 0)
if (isLeapYear(year))
theseMillis = theseMillis + MILLIS_IN_LEAP_YEAR;
nextYear = MILLIS_IN_YEAR;
else
theseMillis = theseMillis + MILLIS_IN_YEAR;
if (isLeapYear(year - 1))
nextYear = MILLIS_IN_LEAP_YEAR;
year--;
millisAfterYear = theseMillis * -1;
this.year = year;
*Just what it sounds like. Pass it the number of milliseconds past the epoch and it will calculate the date based on that.
public void setTimeInMillis(long millis)
this.millis = millis;
if (millis >= 0)
setYearAfter1970();
else
setYearBefore1970();
*Returns the number of milliseconds from the epoch.
public long getTimeInMillis()
return this.millis;
*Returns the current year.
public int getYear()
return this.year;
*Sets the date to 00:00 of Jan 1 of the passed year.
public void setYear(int year)
this.year = year;
long theseMillis = 0;
if (year > 1970)
//Kind of like setYearAfter1970 method, except it's adding instead of subtracting. So actually it's the opposite.
for (int cntr = 1970; cntr < this.year; cntr++)
if (isLeapYear(cntr))
theseMillis = theseMillis + MILLIS_IN_LEAP_YEAR;
else
theseMillis = theseMillis + MILLIS_IN_YEAR;
else
for (int cntr = 1970; cntr > this.year; cntr--)
if (isLeapYear(cntr))
theseMillis = theseMillis - MILLIS_IN_LEAP_YEAR;
else
theseMillis = theseMillis - MILLIS_IN_YEAR;
//On a leap year there are 29 days in February. If not, there's 28.
if (isLeapYear(year))
daysInMonth[1] = 29;
else
daysInMonth[1] = 28;
//This variable helps me calculate denominations of time that are below year.
millisAfterYear = 0;
setTimeInMillis(theseMillis);
*Sets the month to the one that you passed, 0 being January and 11 being December.
public void setMonth(int month)
if (month < 0 || month > 11)
throw new ArrayIndexOutOfBoundsException(month);
long theseMillis = getTimeInMillis();
int days = 0;
setYear(this.year);
if (getTimeInMillis() > 0)
theseMillis = theseMillis - getTimeInMillis();
else
theseMillis = theseMillis + getTimeInMillis();
for (int cntr = 0; cntr < month; cntr++)
days = days + daysInMonth[cntr];
millisAfterYear = days * MILLIS_IN_DAY + 1;
setTimeInMillis(getTimeInMillis() + millisAfterYear);
*Returns the month stored in this object. With this object 0 represents January and 11 represents December.
public int getMonth()
long theseMillis = millisAfterYear;
int cntr = 0;
while (theseMillis > (MILLIS_IN_DAY * daysInMonth[cntr]))
theseMillis = theseMillis - MILLIS_IN_DAY * daysInMonth[cntr];
cntr++;
return cntr;
*Set the day of month to the one passed.
public void setDayOfMonth(int day)
if (day < 1 || day > daysInMonth[getMonth()])
throw new ArrayIndexOutOfBoundsException(day);
setMonth(getMonth());
//Internally, this actually works starting at zero, however to anyone using this class it appears to start at 1. Therefore
//i must subtract one here.
long addMillis = MILLIS_IN_DAY * (day - 1);
millisAfterYear = millisAfterYear + addMillis;
setTimeInMillis(getTimeInMillis() + addMillis + 1);
*Returns the day of month.
public int getDayOfMonth()
int days = (int)(millisAfterYear / MILLIS_IN_DAY);
int cntr = 0;
while (days >= daysInMonth[cntr])
days = days - daysInMonth[cntr];
cntr++;
//Internally this class stores dates starting at zero, but i want it to look like it starts at 1.
return days + 1;
*Sets the time to the currently selected day at the passed hour on the hour. uses 24 hour clock.
public void setHour(int hour)
if (hour < 0 || hour > 23)
throw new ArrayIndexOutOfBoundsException(hour);
setDayOfMonth(getDayOfMonth());
long addMillis = MILLIS_IN_HOUR * hour;
millisAfterYear = millisAfterYear + addMillis;
setTimeInMillis(getTimeInMillis() + addMillis);
*Returns the hour (but not how many minutes past the hour).
public int getHour()
long millisAfterDay = millisAfterYear % MILLIS_IN_DAY;
return (int)(millisAfterDay / MILLIS_IN_HOUR);
*Set the minutes past the hour. Works 0-59.
public void setMinute(int minute)
if (minute < 0 || minute > 59)
throw new ArrayIndexOutOfBoundsException(minute);
setHour(getHour());
long addMillis = MILLIS_IN_MINUTE * minute;
millisAfterYear = millisAfterYear + addMillis;
setTimeInMillis(getTimeInMillis() + addMillis);
*Returns the minutes past the hour, 0-59.
public int getMinute()
long millisAfterHour = millisAfterYear % MILLIS_IN_HOUR;
return (int)(millisAfterHour / MILLIS_IN_MINUTE);
*Sets the seconds past the minute, 0-59.
public void setSecond(int second)
if (second < 0 || second > 59)
throw new ArrayIndexOutOfBoundsException(second);
setMinute(getMinute());
long addMillis = MILLIS_IN_SECOND * second;
millisAfterYear = millisAfterYear + addMillis;
setTimeInMillis(getTimeInMillis() + addMillis);
*Returns the seconds past the minute, 0-59.
public int getSecond()
long millisAfterMinute = millisAfterYear % MILLIS_IN_MINUTE;
return (int)(millisAfterMinute / MILLIS_IN_SECOND);
*The more commonly seen set method of other date objects. Sets the date/time to 00:00 of the year/month/day passed. Convenience method
*for setDate(int year, int month, int day, int hour, int minute, int second).
public void setDate(int year, int month, int day)
setDate(year, month, day, 0 , 0 , 0);
*Sets every date/time field.
public void setDate(int year, int month, int day, int hour, int minute, int second)
setYear(year);
setMonth(month);
setDayOfMonth(day);
setHour(hour);
setMinute(minute);
setSecond(second);
*Returns yes if the stored date is a leap year. A leap year is every year that is divisible by four unless it is divisible by 100
*unless it is also divisible by 400.
public boolean isLeapYear()
return isLeapYear(this.year);
*For internal use. Returns if the passed year meets the criteria for a leap year.
private boolean isLeapYear(int year)
boolean leapYear = false;
if (year % 4 == 0)
if (year % 100 != 0)
leapYear = true;
else if (year % 400 == 0)
leapYear = true;
return leapYear;
*Returns the difference in milliseconds between the time stored in this object and the millis passed to this method.
public long getDifferenceInMillis(long millis)
return getTimeInMillis() - millis;
*Returns the difference in milliseconds between this date and the date passed to this method.
public long getDifferenceInMillis(AwesomeDate otherDate)
return getDifferenceInMillis(otherDate.getTimeInMillis());
*Designed to be a wrapper method for the getDifferenceInMillis method. This method changes millis into years/days/whatever. Pass
*the number of milliseconds you have to convert in the first parameter. The second parameter should be the type of denomination you
*want (year, day, whatever). Use the MILLIS_IN_* fields associated with this object. Also bear in mind when workin with years that
*some years are leap years, so in extreme cases of differences of 365+ years you may gain/lose a year.
public static int toGreaterDenom(long millis, long denom)
return (int)(millis / denom);
* The first argument is how many of whatever (days, months, years, etc.) to add (use negative numbers to subtract). For the second
* argument pass one of the MILLIS_IN_* fields. Thus, to add two hours would be
* <code>
* AwesomeDate.adjustDate(2, AwesomeDate.MILLIS_IN_HOUR);
* </code>
public void adjustDate(int amount, long typeMillis)
setTimeInMillis(this.millis + amount * typeMillis);
*Returns an object of type java.util.Date set to the date/time stored here.
public java.util.Date toUtilDate()
long offset = TimeZone.getDefault().getRawOffset();
return new java.util.Date(getTimeInMillis() + -1 * offset);
// return new java.util.Date(getTimeInMillis());
*Returns an object of type GregorianCalendar set to the date/time stored here.
public GregorianCalendar toGregorianCalendar()
long offset = TimeZone.getDefault().getRawOffset();
GregorianCalendar cal = new GregorianCalendar();
cal.setTimeInMillis(getTimeInMillis() - offset);
return cal;
*Returns an object of type java.sql.Date set to the date/time stored here.
public java.sql.Date toSQLDate()
long offset = TimeZone.getDefault().getRawOffset();
return new java.sql.Date(getTimeInMillis() - offset);
/** Format the date using the string that you pass. Works just like the SimpleDateFormat object. Infact, it uses one! Heres
*how it works:
*Letter Date or Time Component Presentation Examples <br>
*G Era designator Text AD <br>
*y Year Year 1996; 96 <br>
*M Month in year Month July; Jul; 07<br>
*w Week in year Number 27 <br>
*W Week in month Number 2 <br>
*D Day in year Number 189 <br>
*d Day in month Number 10 <br>
*F Day of week in month Number 2<br>
*E Day in week Text Tuesday; Tue <br>
*a Am/pm marker Text PM <br>
*H Hour in day (0-23) Number 0<br>
*k Hour in day (1-24) Number 24 <br>
*K Hour in am/pm (0-11) Number 0 <br>
*h Hour in am/pm (1-12) Number 12 <br>
*m Minute in hour Number 30 <br>
*s Second in minute Number 55 <br>
*S Millisecond Number 978 <br>
*z Time zone General time zone Pacific Standard Time; PST; GMT-08:00<br>
*Z Time zone RFC 822 time zone -0800 <br>
public String toFormattedString(String format)
SimpleDateFormat formattage = new SimpleDateFormat(format);
return formattage.format(toUtilDate());
*I overrode the toString method. Now it tells everyone how awesome my AwesomeDate is.
public String toString()
String output = "John's Awesome Date!";
output = output + " Millis: " + getTimeInMillis();
output = output + " Year: " + getYear();
output = output + " Month: " + getMonth();
output = output + " Date: " + getDayOfMonth();
output = output + " Time: ";
if (getHour() < 10)
output = output + "0" + getHour();
else
output = output + getHour();
if (getMinute() < 10)
output = output + "0" + getMinute();
else
output = output + getMinute();
output = output + " Seconds: " + getSecond();
return output;
public static void main(String[] psvm)
AwesomeDate blah = new AwesomeDate();
GregorianCalendar blah1 = new GregorianCalendar();
GregorianCalendar blah2 = new GregorianCalendar();
}The reason Callendar is so complicated is that it is trying to solve a very complicated problem.
You don't appear to support leap seconds (of which there can be upto 2 in any time interval)
http://www.timeanddate.com/time/leapseconds.html
Some of your code will not work for large dates very well (seems to iterate over the years). Try using your date class for astronomical or geological calculations. them big numbers will make your code slow at the moment.
You don't seem to support timezones or transitory offsets (BST vs GMT). You most definately don't handle changes to timezone offsets that have occured in the past or historical daylight savings time offsets (they have not always been the same)
The difference between two calendars is a "duration" a duration means nothing unless it is applied to a caledar/date (although you may be able to get away with it if the duration is always stored in millis) -
Re: Sorting in ArrayField widget.
Hi,
If you need a little sample about sorting Arrays or Listviews you can find
one on http://perso.club-internet.fr/dnguyen/
It shows how to use a QuickSort generic class (the source code of that class
is not delivered, but you can find a quicksort sample class at forte.com) :
- Sub-class the class
- Overwrite DoSortExpLow and DoSortExpSup
- In your user class, call QuickSort(Self.SortArray, 1,
Self.SortArray.Items, pcol, Self.SortListMode) where SortArray is the Array
to sort, pCol is a parameter that defines the column and SortListMode
defines if you want an ascending or descending sort.
Hope this helps,
Daniel Nguyen
Freelance Forte Consultant
Url : http://perso.club-internet.fr/dnguyen/
David Foote a écrit:
There is a more flexible solution with less code duplication that has
worked well for us.
Create a class SortService with a method with the following signature:
Sort(list:Array of Object, stategy:ComparisonStrategy):Array of Object
create a class called ComparisonStrategy with a method with the
following signature:
Compare(a:Object,b:Object):integer
For each class that needs to be sorted, define a new
ComparisonStrategy sub-class that overrides the Compare()
method. Inside the overridden Compare() method, cast a and b to the
correct class and compare them by whatever criteria is appropriate.
If a>b return 1, if a=b return zero, if a<b return -1. Inside the
SortService.Sort() method, call strategy.Compare(a=object1,b=object2)
each time you need to compare two objects.
This is quite similar to the C-library's implementation of the qsort
function:
void qsort( void *base, size_t num, size_t width, int (__cdecl
compare )(const void elem1, const void *elem2 ) );
compare( (void *) elem1, (void *) elem2 );
It is also a good use of the Strategy design pattern. The one method,
Sort(), will now sort any list of objects for which you pass in an
appropriate ComparisonStrategy sub-class. The objects to be sorted do
not have to implement any extra interface or inherit from any
particular class. If you are interested and need more help I can
probably lay my hands on some source.
P.S. This sort should be applied to the data array not the
arrayfield.
David N. Foote
----Original Message Follows----
What you need is a set of sort methods, one for each basic data type
and a wrapper method which discovers the data type of the column to be
sorted and calls the appropriate Sort method.
Create a group of sort methods depending on the data type
e.g..
sortInt( p_Arr : Array of Object, Col : integer ),
SortString( p_Arr : Array of Object, Col : integer ) ,
SortYour4GLObject( p_Arr : Array of Object, Col : integer ) etc.
Then create a wrapper method called Sort( p_Arr : Array of Object,
Col :
integer ).
In this method, look at p_Arr[Col].ClassName to find out the datatype
and appropriately call the method which sorts that data type
i.e..,
SortInt() if ClassName is qqsp_integer,
SortString() if ClassName is qqsp_string
SortYour4GLObject() if ClassName is Your4GLClass etc.
In each of the sort method, implement the sort algorithm on the
p_Arr[ Col ] values.
Good luck,
Ajith Kallambella. M
Forté Systems Engineer,
International Business Corporation.
-----Original Message-----
From: Savory, Mark [mailto:[email protected]]
Sent: Thursday, March 11, 1999 9:54 AM
To: 'Kapil Tyagi'; '[email protected]'
Subject: RE: Sorting in ArrayField widget.
Kapil,
Since you can't inherit from Array, you can create a helper for
sorting
arrays in general. Some helper class would have a method called:
SomeHelperClass.Sort(list: Array of SomeInterface, column : int):Array
of
SomeInterface. The SomeInterface interface would have a virtual
method
called:
SomeInterface.GetColumn(col:int):DataValue. All your classes that
would be
in an array to sort would have to implement the SomeInterface
interface.
Implementing the GetColumn method would require that your class
attributes
inherit from DataValue(TextData, DoubleData, IntegerData, etc.) or the
GetColumn method could do a conversion. The SomeHelperClass.Sort
method
could then sort the appropriate column of the array.
Mark Savory
GTE Gov. Sys.
-----Original Message-----
From: Kapil Tyagi [mailto:[email protected]]
Sent: Thursday, March 11, 1999 4:02 AM
To: '[email protected]'
Subject: Sorting in ArrayField widget.
Hi,
We are using ArrayField widget. Forte does not provide any in-built
sorting
facility
in ArrayField as it does in ListView.
Is there an easy way to do that?
If we implement our own sorting algorithm then how do we make it
generic
method
for different arrays.
We can use GetChildInCell to fetch the values generically, but it
works only
for
visible rows.
Any pointers in this direction are appreciated.
Kapil Tyagi
To unsubscribe, email '[email protected]' with
'unsubscribe forte-users' as the body of the message.
Searchable thread archive
<URL:http://pinehurst.sageit.com/listarchive/>
To unsubscribe, email '[email protected]' with
'unsubscribe forte-users' as the body of the message.
Searchable thread archive
<URL:http://pinehurst.sageit.com/listarchive/>
To unsubscribe, email '[email protected]' with
'unsubscribe forte-users' as the body of the message.
Searchable thread archive
<URL:http://pinehurst.sageit.com/listarchive/>
Get Free Email and Do More On The Web. Visit http://www.msn.com
To unsubscribe, email '[email protected]' with
'unsubscribe forte-users' as the body of the message.
Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>-
To unsubscribe, email '[email protected]' with
'unsubscribe forte-users' as the body of the message.
Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>Hi,
If you need a little sample about sorting Arrays or Listviews you can find
one on http://perso.club-internet.fr/dnguyen/
It shows how to use a QuickSort generic class (the source code of that class
is not delivered, but you can find a quicksort sample class at forte.com) :
- Sub-class the class
- Overwrite DoSortExpLow and DoSortExpSup
- In your user class, call QuickSort(Self.SortArray, 1,
Self.SortArray.Items, pcol, Self.SortListMode) where SortArray is the Array
to sort, pCol is a parameter that defines the column and SortListMode
defines if you want an ascending or descending sort.
Hope this helps,
Daniel Nguyen
Freelance Forte Consultant
Url : http://perso.club-internet.fr/dnguyen/
David Foote a écrit:
There is a more flexible solution with less code duplication that has
worked well for us.
Create a class SortService with a method with the following signature:
Sort(list:Array of Object, stategy:ComparisonStrategy):Array of Object
create a class called ComparisonStrategy with a method with the
following signature:
Compare(a:Object,b:Object):integer
For each class that needs to be sorted, define a new
ComparisonStrategy sub-class that overrides the Compare()
method. Inside the overridden Compare() method, cast a and b to the
correct class and compare them by whatever criteria is appropriate.
If a>b return 1, if a=b return zero, if a<b return -1. Inside the
SortService.Sort() method, call strategy.Compare(a=object1,b=object2)
each time you need to compare two objects.
This is quite similar to the C-library's implementation of the qsort
function:
void qsort( void *base, size_t num, size_t width, int (__cdecl
compare )(const void elem1, const void *elem2 ) );
compare( (void *) elem1, (void *) elem2 );
It is also a good use of the Strategy design pattern. The one method,
Sort(), will now sort any list of objects for which you pass in an
appropriate ComparisonStrategy sub-class. The objects to be sorted do
not have to implement any extra interface or inherit from any
particular class. If you are interested and need more help I can
probably lay my hands on some source.
P.S. This sort should be applied to the data array not the
arrayfield.
David N. Foote
----Original Message Follows----
What you need is a set of sort methods, one for each basic data type
and a wrapper method which discovers the data type of the column to be
sorted and calls the appropriate Sort method.
Create a group of sort methods depending on the data type
e.g..
sortInt( p_Arr : Array of Object, Col : integer ),
SortString( p_Arr : Array of Object, Col : integer ) ,
SortYour4GLObject( p_Arr : Array of Object, Col : integer ) etc.
Then create a wrapper method called Sort( p_Arr : Array of Object,
Col :
integer ).
In this method, look at p_Arr[Col].ClassName to find out the datatype
and appropriately call the method which sorts that data type
i.e..,
SortInt() if ClassName is qqsp_integer,
SortString() if ClassName is qqsp_string
SortYour4GLObject() if ClassName is Your4GLClass etc.
In each of the sort method, implement the sort algorithm on the
p_Arr[ Col ] values.
Good luck,
Ajith Kallambella. M
Forté Systems Engineer,
International Business Corporation.
-----Original Message-----
From: Savory, Mark [mailto:[email protected]]
Sent: Thursday, March 11, 1999 9:54 AM
To: 'Kapil Tyagi'; '[email protected]'
Subject: RE: Sorting in ArrayField widget.
Kapil,
Since you can't inherit from Array, you can create a helper for
sorting
arrays in general. Some helper class would have a method called:
SomeHelperClass.Sort(list: Array of SomeInterface, column : int):Array
of
SomeInterface. The SomeInterface interface would have a virtual
method
called:
SomeInterface.GetColumn(col:int):DataValue. All your classes that
would be
in an array to sort would have to implement the SomeInterface
interface.
Implementing the GetColumn method would require that your class
attributes
inherit from DataValue(TextData, DoubleData, IntegerData, etc.) or the
GetColumn method could do a conversion. The SomeHelperClass.Sort
method
could then sort the appropriate column of the array.
Mark Savory
GTE Gov. Sys.
-----Original Message-----
From: Kapil Tyagi [mailto:[email protected]]
Sent: Thursday, March 11, 1999 4:02 AM
To: '[email protected]'
Subject: Sorting in ArrayField widget.
Hi,
We are using ArrayField widget. Forte does not provide any in-built
sorting
facility
in ArrayField as it does in ListView.
Is there an easy way to do that?
If we implement our own sorting algorithm then how do we make it
generic
method
for different arrays.
We can use GetChildInCell to fetch the values generically, but it
works only
for
visible rows.
Any pointers in this direction are appreciated.
Kapil Tyagi
To unsubscribe, email '[email protected]' with
'unsubscribe forte-users' as the body of the message.
Searchable thread archive
<URL:http://pinehurst.sageit.com/listarchive/>
To unsubscribe, email '[email protected]' with
'unsubscribe forte-users' as the body of the message.
Searchable thread archive
<URL:http://pinehurst.sageit.com/listarchive/>
To unsubscribe, email '[email protected]' with
'unsubscribe forte-users' as the body of the message.
Searchable thread archive
<URL:http://pinehurst.sageit.com/listarchive/>
Get Free Email and Do More On The Web. Visit http://www.msn.com
To unsubscribe, email '[email protected]' with
'unsubscribe forte-users' as the body of the message.
Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>-
To unsubscribe, email '[email protected]' with
'unsubscribe forte-users' as the body of the message.
Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/> -
Invalid column type error while calling db function.
We are getting an exception while calling the database function which returns a Varray of objects. We are using jpub to generate the wrapper method, ran sqlj to generate the JDBC code. The environment is weblogic 5.1 EJB container with ORacle 8.1.6.0.0 database. The JDBC driver is 8.1.7 thin, sqlj version is 8.1.7. I am giving below the exception.
When the sqlj option profile=false is not set, the error is Classcast exception. Appraently the weblogic connection object can not be used to do oracle specific calls. If somebody has done similar things(creating a bean which calls the stored function with weblogic which returns the oracle object types) or know what the issue is, please let me know.
Thanks,
Vijay.
stackTrace:
java.sql.SQLException: Invalid column type
at java.lang.Throwable.fillInStackTrace(Native Method)
at java.lang.Throwable.fillInStackTrace(Compiled Code)
at java.lang.Throwable.<init>(Compiled Code)
at java.lang.Exception.<init>(Compiled Code)
at java.sql.SQLException.<init>(SQLException.java:43)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:210)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:273)
at oracle.jdbc.driver.OracleStatement.get_internal_type(OracleStatement.java:4560)
at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:225)
at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:350)
at weblogic.jdbcbase.pool.Statement.registerOutParameter(Statement.java:438)
at sqlj.runtime.profile.ref.RTStatementJDBCCallable.registerOutParameter(RTStatementJDBCCallable.java:135)
at sqlj.runtime.profile.ref.ParamRegProfile$ParamRegCachedStatement.registerParameters(Compiled Code)
at sqlj.runtime.profile.ref.ParamRegProfile$ParamRegCachedStatement.getStatement(ParamRegProfile.java:101)
at sqlj.runtime.profile.ref.CachedStatementProfileWrapper.getStatement(CachedStatementProfileWrapper.java:134)
at sqlj.runtime.ExecutionContext$StatementStack.setStatement(ExecutionContext.java:995)
at sqlj.runtime.ExecutionContext.registerStatement(ExecutionContext.java:523)
at com.xpede.calculator.processor.jdbc.NewPrdGroupPkg.maincalculator(NewPrdGroupPkg.java:341)
----------------------Weblogic essentially wrappers the Oracle JDBC driver - as you can see from the stack trace, it does not just wrapper the connection object, but also the statement object.
The SQLJ runtime does not recognize the JDBC layer anymore as an Oracle JDBC driver.
What is happening at runtime may be the following:
(1) The invalid column type likely results from SQLJ attempting to register the type as Types.OTHER (code 1111). This typecode is not supported by Oracle JDBC.
(2) The class cast exception when using Oracle objects may result from a getObject() call which returns the value in default format (such as oracle.sql.ARRAY) rather than the JPublisher-generated wrapper object.
Are you using JDK 1.2 / runtime12.zip?
In that case you can try the standard (java.sql.)SQLData interface (in JPub: -usertypes=jdbc). However, this interface will not support wrappers for VARRAYs. -
How to find out the name of a table?
Hi
How can I find out the name of a table which doesn't have a record history?
Regards
RahmanNo direct way to know the tables. What you will find on the ABout this page link are the View Object (similar to record sets), Entity objects, controller and Application module. Generally EO is based on a table or the VO can be based on the query which you can find the corresponding xml file. But a button action might be calling a method in AM or CO which in turn call some wrapper method to interact with database. So nothing straight forward. You will have to analyze the all page related code objects.
They are specific to OA framework and if you are not aware about them, better go through the initial chapters of OAF dev guide.
--Shiv -
Locking issue in workflow with conseutive database update
Dear Workflowers,
We are in ECC 5.0 and release 6.40. We went live for SAP in February and we are currently using workflow in PLM module for DMS and ECM.
We have been facing this locking issue randomly happened in our production and quality system. The error from workflow log is "Document XXXX is locked by WF-BATCH". I have two steps in workflow one is to update the document user( from originator to editor with custom BO "zdraw" new method "setuser") and the next step is to update the document status( BO "zdraw" "setstatus" method which inherited form standard BO "draw").
I have tried to use "wait" (1st try) , statements "BAPI_DOCUMENT_ENQUEUE", "BAPI_DOCUMENT_DEQUEUE" (2nd try) and "Commit work and wait" (3rd try) to add one step in between, however the issue remains.
The other question I had was we need to write "commit work" when we use BAPI to perform database update in the ABAP program. But I don't see "commit work" in the method of BO(for example "setstatus" in "draw" object) which performs database update. How does workflow perform DB update properly without "commit work" by referencing standard method?
Could anyone please share your expertise with the issue I am facing?
Thank you in advance,
MertaHi Merta,
Regarding COMMITs: theoretically you should never use COMMIT statements because the Workflow runtime handles that - the transaction of executing the task is the LUW, not your method. By adding COMMIT WORK you are also committing the workflow task execution.
In practice however there are the occasional exceptions where something just won't work without an explicit commit - but the theory remains that you should always try it without.
Regarding your problem, the one way to be certain that a DB update is complete is to use a terminating event - either through change documents or status management.
Failing that, you can write a wrapper method for SETSTATUS that does something like:
do 10 times.
try to lock it.
if success.
unlock.
swc_call_method self 'SetStatus' container.
set success flag.
else.
wait up to 3 seconds.
endif.
enddo.
if no success, raise exception.
Cheers,
Mike
Maybe you are looking for
-
Switching devices and Downgradin​g from Z10 OS10 to 9800 OS6
i recently upgraded my Blackberry Touch 9800 running OS6 to a Blackberry Z10 Running OS10 i am not to impressed with the battery life and features of the Z10. Now i need to downgrade i.e. switch devices back from Z10 to 9800. The Z10 using Desktop
-
Ok so.. My brother put music on mom's phone, but it just erased all of her contacts and left her phone with his contacts and music. How do I get her contacts back if possible?
-
Is it possible to get video IN on my macbook?
I was wondering if it would be possible to somehow connect the cable (as in TV cable service) in my dorm room to my macbook so I can use it like a TV. I was looking at the cables sold in the apple store and I saw some that use video-out to connect yo
-
Best way to return more than 1 value in a function?
Hi all, What's the best way to return more than 1 value from a function? returning a cursor? varray? objects? etc? I thought of a cursor first, but i was hesitant since i am not sure if the cursor will be automatically closed when you return a cursor
-
SMARTFORMS output in XLS format
Hi, We are in ECC 5.0, and have a client requirement to show the smartforms output in XLS format. Could you please advice or suggest various options to do this? Appreciate the response,. thanks much in advance, Anil Edited by: Rob Burbank on Sep 10,