Skip to main content

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



Back to the top