[
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!