You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Clement Escoffier (JIRA)" <ji...@apache.org> on 2015/01/04 13:49:34 UTC
[jira] [Commented] (FELIX-4745) Support for aspectj advice static
method
[ https://issues.apache.org/jira/browse/FELIX-4745?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14263847#comment-14263847 ]
Clement Escoffier commented on FELIX-4745:
------------------------------------------
iPOJO does not manipulate static method as static method do not have a 'reference' on the instance manager. In your case you inject a reference on the object into a static method. We could track this pattern. It's obviously only valid for field accesses (as method are replaced by _proxies_).
To sum up that would mean:
* analyzing static method
* check access for non static field belonging to the component class (owner is the component class)
* replacing these accesses by the `__get` or `__set` calls.
> Support for aspectj advice static method
> ----------------------------------------
>
> Key: FELIX-4745
> URL: https://issues.apache.org/jira/browse/FELIX-4745
> Project: Felix
> Issue Type: Bug
> Components: iPOJO
> Affects Versions: ipojo-manipulator-1.12.0
> Reporter: Olivier NOUGUIER
> Priority: Minor
> Attachments: 0001-FELIX-4745-naive-fix.patch
>
> Original Estimate: 1h
> Remaining Estimate: 1h
>
> When using aspectj to weave classes prior to iPojo packaging, injected advice are ignore by iPojo bytecode manipulation.
> Then NPE are thrown in the advice because of the lazy initialization mechanism of @Requires services.
> In my usecase, I want to weave @Transactional springframework aspect in iPojo component.
> Code generated:
> static final String updateName_aroundBody0(SignupTestDao ajc$this, String name) {
> LOGGER.info(*ajc$this.testDao*);
> for (Test test : *ajc$this.testDao*.findAll()) {
> test.setName(name);
> *ajc$this.testDao*.update(test);
> if (name.equals("boom")) {
> throw new RuntimeException("boom");
> }
> }
> return "done";
> }
> Code expected:
> static final String updateName_aroundBody0(SignupTestDao ajc$this, String name)
> {
> LOGGER.info(*ajc$this.__gettestDao()*);
> for (Test test : *ajc$this.__gettestDao()*.findAll()) {
> test.setName(name);
> *ajc$this.__gettestDao()*.update(test);
> if (name.equals("boom")) {
> throw new RuntimeException("boom");
> }
> }
> return "done";
> }
> A naive fix is to apply iPojo bytecode manipulation to static methods... see the patch provided.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)