[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] Saving information from several pointcuts to an ObjectOutputStream
|
Ron is right,
moreover, aspects are singletons by default, and can freely declare any
field (like private ObjectOutputStream stream = null) and then create
the stream only if it hasn't already been created.
Obviously, care should be taken to avoid threading issues (like more
threads creating the stream, writing to it etc..), but this is no way
different that how you would do it in plain java : using synchronized if
you don't have performance problems, using classes from the concurrent
package if you have strict performance requirements.
As in plain java, you'll not have any place to close the stream ..
finalizers are not reliable in java and we all have to live with that.
For a normal stream on a decent OS, flushing it should anyway be enough.
Something like this should work :
public aspect TraceToFile {
private ObjectOutputStream stream = null;
private ObjectOutputStream setupStream() {
if (stream != null) return stream;
stream = new ... // initialize stream
return stream;
}
after() : apointuct() || anoptherpointuct() {
ObjectOutputStream stream = setupStream();
stream.write(.... // write here info to the stream
stream.flush(); // Always flush it, you have no option to close it.
}
}
Hope this helps clarify,
Simone
Ron DiFrango wrote:
This sounds like a Singleton pattern me. You could create a different class
that is a Singleton that holds the static reference to the
ObjectOutputStream. Then just have your pointcut get the object Singleton
instance and have it write the data to the file.
On 2/19/09 6:07 PM, "baumar" <mbjava@xxxxxxxxx> wrote:
Hi,
I'm trying to save information from several pointcut. More precise: I try to
catch method call that eventually will match some conditions, write it to a
class called DetailedSignature implements Serializable and save that
information in one place.
As far as I - as aspectJ-newbie - understood, I cannot open a file for the
whole life of an aspect, as there is no constructor. Therefore I tried to
use an ObjectOutputStream like this:
pointcut methodWithReturnValue() : (execution(!void
*.*(..))&&(!within(org.test.serversimulation.DetailedSignature))
&&(!within(org.test.serversimulation.SignatureCracker))
&&(!within(junit.*)));
after() returning(Object o) : methodWithReturnValue() {
try {
File testDataFile = new File("serializedTest.data");
FileOutputStream fout = new FileOutputStream(testDataFile,
true);
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(detailedSignature);
oos.flush();
oos.close();
System.out.println("wrote detailedSignature
"+detailedSignature.toString());
}
catch (Exception e) { e.printStackTrace(); }
}
The program runs fine and I actually can see the data I want in the file.
But when I try to read it, I get the exception:
java.io.StreamCorruptedException: invalid type code: AC
Now I searched and found that this always seems to happen when trying to
append to an ObjectOutputStream multiple times
(http://forums.sun.com/thread.jspa?threadID=5177084)
Now I'm a bit at a loss. I was thinking of trying to write kind of
bruteforce the information to a text file and based on that read and
recreate the object manually, but that is certainly not very flexible.
Does anyone know a way how to keep the outputstream open and pass it to
several matches of the pointcut?
Or would you know a more elegant strategy of saving objects from within
several matches of a pointcut?
Thanks for help
Mark
(start of the file with captured method
¬í sr +org.test.serversimulation.DetailedSignature˜Ë±W„çÅ
Z isLiteralValueL allmodifierst Ljava/lang/String;L
callingobjectClassnameq ~ L callingobjectMethodNameq ~ L
callingobjectPackageq ~ L callingobjectPackageAndClassq ~ L
callingobjectParametersq ~ L modifierst Ljava/util/ArrayList;L
parametersq ~ L returnValueClassq ~ L returnValuePackageq ~ L
returnValuePackageAndClassq ~ L signatureLongStringq ~
... all methods catched appear in the file.
Ron DiFrango
Manager and Architect | CapTech Ventures
(804) 855-9196-6308 | rdifrango@xxxxxxxxxxxxxxxxxxx
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users
--
Simone Gianni CEO Semeru s.r.l. Apache Committer
http://www.simonegianni.it/