[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] call method from advice
|
I am not sure, if that helps you any further to assist me in myproblem, but
here is the important part of my aspect:
--------------------- Aspect-Code -----------------------------
pointcut sendMessage(sms.library.send.MessageSender sender, byte[]
messageData) : call(
* sms.library.send.MessageSender.send(byte[])) && args(messageData) &&
target(sender);
pointcut receiveMessage(sms.SMSReceive receiver, byte[]
receivedMessageData, boolean newMessage) :
call(* sms.SMSReceive.handleReceivedMessage(byte[], boolean)) &&
args(receivedMessageData, newMessage)
&& target(receiver);
private boolean calledFromReceive = false;
void around(sms.library.send.MessageSender sender, byte[] messageData) :
sendMessage(sender, messageData)
{
if(!calledFromReceive)
{
// do things.... I made comments around the code in that part and the
error still occurs
}
calledFromReceive=false;
proceed(sender, messageData);
}
void around(sms.SMSReceive receiver, byte[] receivedMessageData, boolean
newMessage) : receiveMessage(receiver,
receivedMessageData, newMessage)
{
long sessionID = receiver.getSessionID();
receiver.getMessageSender().setSessionID(sessionID);
receiver.getMessageSender().send(receivedMessageData);
proceed(receiver, receivedMessageData, newMessage);
}
------------- End of Aspect-Code --------------------------
------------ SMSReceive ---------------------------------- (I deleted things
which are not important)
public class SMSReceive extends AbstractScreen
{
// MessageReceiver, über den die letzte Nachricht empfangen wurde
private MessageReceiver lastMessageReceiver = null;
public void handleReceivedMessage(byte[] receivedMessageData, boolean
newMessage)
{
if(newMessage)
{
smsScreen.setTitle("From: " + lastMessageReceiver.getSenderAddress());
smsText.setText(new String(receivedMessageData));
display.setCurrent(smsScreen);
}
}
public MessageSender getMessageSender()
{
System.out.println("MessageSender.getMessageSender");
return ConnectionFactory.getInstance().getSender("50000");
}
public long getSessionID()
{
return
sms.library.NumberConverter.toLong(lastMessageReceiver.getSenderAddress());
}
}
------------ End: SMSReceive ----------------------------------
------------- MessageSender ------------------------------------(I deleted
things which are not important)
public class MessageSender implements Runnable
{
private MessageConnection senderConnection;
private String strPort;
private String strPhoneNumber;
private byte[] messageData;
/**
* Über diese Methode wird der Thread gestartet, der das eigentliche Senden
übernimmt.
*/
public void send(byte[] messageData)
{
System.out.println("MessageSender.send");
this.messageData = messageData;
System.out.println("Gesendete Message-Daten: " + new
String(Hex.encode(messageData)));
// starte neuen Thread zum Senden
new Thread(this).start();
}
public void run()
{
System.out.println("MessageSender.run");
try
{
// neue Nachricht erzeugen
BinaryMessage binMessage =
(BinaryMessage)senderConnection.newMessage(MessageConnection.BINARY_MESSAGE);
// Vorbereiten des Sendens der Daten in "messageData"
String strAddress = "sms://" + strPhoneNumber + ":" + strPort;
System.out.println("Senden einer Nachricht über Addresse: " +
strAddress);
binMessage.setAddress(strAddress);
binMessage.setPayloadData(messageData);
// ... und senden der Nachricht
senderConnection.send(binMessage);
}
catch (Throwable t) // Fehler fangen
{
System.out.println("Exception beim Senden: ");
t.printStackTrace();
}
}
/**
* @param strPhoneNumber The strPhoneNumber to set.
*/
public void setPhoneNumber(String strPhoneNumber)
{
System.out.println("MessageSender.setPhoneNumber");
this.strPhoneNumber = strPhoneNumber;
}
public long getSessionID()
{
return sms.library.NumberConverter.toLong(this.strPhoneNumber);
}
public void setSessionID(long sessionID)
{
this.strPhoneNumber = Long.toString(sessionID);
}
}
------------ End: MessageSender ----------------------------------
The result of my application, when I start it in the emulator is then a
crash with the following output:
[exec] Error verifying method org/aspectj/runtime/internal/Conversions
intV
alue(Ljava/lang/Object;)I
[exec] Approximate bytecode offset 1: Inconsistent or missing stackmap
at t
arget
[exec] static Method............: e676f8 'af.a (virtual)'
[exec] Stack Chunk.......: df4cb0
[exec] Frame Pointer.....: df4d3c
[exec] Current IP........: e67464 = e67430 + offset 52
[exec] Previous Frame....: df4d08
[exec] ALERT: java/lang/VerifyError:
org/aspectj/runtime/internal/Conversio
ns.
[exec] Previous IP.......: e672cd (offset 45)
[exec] Frame size........: 7 (3 arguments, 4 local variables)
[exec] Argument[0].......: df45cc
[exec] Argument[1].......: df5878
[exec] Argument[2].......: df4630
[exec] Local[3]..........: 0
[exec] Local[4]..........: df4630
[exec] Local[5]..........: df45cc
[exec] Local[6]..........: df7304
[exec] Operand[1]........: df7324
[exec] Operand[2]........: df45cc
[exec] Operand[3]........: df4630
[exec] Operand[4]........: 1
[exec] Operand[5]........: df7304
[exec] Operand[6]........: 3
[exec] Operand[7]........: 1
[exec] Method............: e67300 'h.a (virtual)'
[exec] Stack Chunk.......: df4cb0
[exec] Frame Pointer.....: df4d08
[exec] Current IP........: e672cd = e672a0 + offset 45
[exec] Previous Frame....: df4ce4
[exec] Previous IP.......: e66428 (offset 28)
[exec] Frame size........: 3 (3 arguments, 0 local variables)
[exec] Argument[0].......: df50ec
[exec] Argument[1].......: 2
[exec] Argument[2].......: df5878
[exec] Method............: e664bc 'y.notifyIncomingMessage (virtual)'
[exec] Stack Chunk.......: df4cb0
[exec] Frame Pointer.....: df4ce4
[exec] Current IP........: e66428 = e6640c + offset 28
[exec] Previous Frame....: df4cc4
[exec] Previous IP.......: 10140a93 (offset 74)
[exec] Frame size........: 2 (2 arguments, 0 local variables)
[exec] Argument[0].......: df5878
[exec] Argument[1].......: df57b0
[exec] Method............: 100e27d0
'com/sun/midp/io/j2me/sms/DatagramImpl$
DatagramNotifier.run (virtual)'
[exec] Stack Chunk.......: df4cb0
[exec] Frame Pointer.....: df4cc4
[exec] Current IP........: 10140a93 = 10140a49 + offset 74
[exec] Previous Frame....: 0
[exec] Previous IP.......: 1
[exec] Frame size........: 3 (1 arguments, 2 local variables)
[exec] Argument[0].......: df4f7c
[exec] Local[1]..........: 1
[exec] Local[2]..........: 0
----------------------- and so on and so
on ----------------------------------
When I add the following method in SMSReceiver:
public void sendData(byte[] messageData)
{
getMessageSender().send(messageData);
}
and I change the code in the around-advice connected with the receiveMessage
pointcut to the following:
receiver.getMessageSender().setSessionID(sessionID);
receiver.sendData(receivedMessageData);
then the emulator doesn't crash? So this would be a fix, also very dirty, in
my opinion, cause the SMSReceive doesn't need such a method.
What have I done wrong?
Thanks in advance, and sorry for that long email!