Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support Assisted Injection via Factory Codegen #467

Merged
merged 40 commits into from
Jan 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
8f25680
start
SentryMan Dec 2, 2023
b760026
fields
SentryMan Dec 2, 2023
b72e2f7
methods
SentryMan Dec 3, 2023
f6f9fcb
fix doc
SentryMan Dec 3, 2023
975dbb1
will fix docs later
SentryMan Dec 3, 2023
05a4383
test annotation
SentryMan Dec 3, 2023
1b7ba99
Create Paint.java
SentryMan Dec 3, 2023
540fdcb
Update Car.java
SentryMan Dec 3, 2023
ad655ab
rename
SentryMan Dec 3, 2023
50a6038
generate factories only
SentryMan Dec 3, 2023
f1e0074
Merge branch 'master' into assist
SentryMan Dec 4, 2023
aeaf594
Merge branch 'master' into assist
SentryMan Dec 29, 2023
23f7fb1
Merge branch 'master' into assist
SentryMan Jan 9, 2024
1ee441d
add enhancements
SentryMan Jan 10, 2024
11c2dd3
Update SimpleAssistWriter.java
SentryMan Jan 10, 2024
da1b79f
Merge branch 'master' into assist
SentryMan Jan 11, 2024
0372ba3
Merge branch 'master' into assist
rbygrave Jan 22, 2024
80540b5
Add test with factory, adjust AssistBeanReader to use the factory method
rbygrave Jan 22, 2024
53d74dd
When using target factory component should not be public
rbygrave Jan 22, 2024
5f4f7a5
Add test for when AssistedFactory has no target factory
rbygrave Jan 22, 2024
3bc75b6
Add test for Named and Qualifier for AssistedFactory
rbygrave Jan 22, 2024
7f2f702
support generated code
SentryMan Jan 23, 2024
f208ed1
imports
SentryMan Jan 23, 2024
f211b4d
Push failing tests for @AssistFactory field inject
rbygrave Jan 24, 2024
f183e31
Temporarily disable DroidField field inject AssistFactory test
rbygrave Jan 24, 2024
206768f
Get DroidField field inject AssistFactory test passing
rbygrave Jan 24, 2024
820e24a
Tide SimpleAssistWriter writeFactoryMethod()
rbygrave Jan 24, 2024
953cacd
Simplify SimpleAssistWriter writeConstructor()
rbygrave Jan 24, 2024
5aa583a
Format tidy of SimpleAssistWriter only
rbygrave Jan 24, 2024
72dec60
Remove unused code and format
rbygrave Jan 24, 2024
020c473
Update javadoc of AssistFactory to reflect that parameter names need …
rbygrave Jan 24, 2024
7d8402f
Update javadoc of AssistFactory to reflect that parameter names need …
rbygrave Jan 24, 2024
0b7b772
Remove unused imports on BeanScope
rbygrave Jan 24, 2024
c832d3f
Format and remove unused public modifier only
rbygrave Jan 24, 2024
a9d840b
Generated code format for assisted method injection
rbygrave Jan 24, 2024
ad09670
Fix for assistedFactory method injection, missing annotation
rbygrave Jan 24, 2024
c4625af
AssistedFactory method injection can be package protected
rbygrave Jan 24, 2024
52a2403
Update tests to assert on assisted parameters
rbygrave Jan 24, 2024
c7a76e1
fix generated code formatting with try catch method injection
rbygrave Jan 24, 2024
ce9a85a
With @Named("red") qualifiers as an example for field, method, ctor i…
rbygrave Jan 24, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.example.myapp.assist;

public interface CssFactory {

Scanner scanner(String path);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.example.myapp.assist;

import io.avaje.inject.Component;

@Component
public class CssThing {

private final CssFactory factory;

CssThing(CssFactory factory) {
this.factory = factory;
}

public String scan(String file) {
Scanner scanner = factory.scanner(file);
return scanner.scan();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.example.myapp.assist;

public interface JsFactory {

Scanner scanner(String path);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.example.myapp.assist;

import io.avaje.inject.Component;
import jakarta.inject.Named;

@Component
public class JsThing {

final JsFactory nameFactory;
final JsFactory qualFactory;

public JsThing(@Named("withName") JsFactory nameFactory, @MyJsName JsFactory qualFactory) {
this.nameFactory = nameFactory;
this.qualFactory = qualFactory;
}

public String nameScan(String input) {
var scanner = nameFactory.scanner(input);
return scanner.scan();
}

public String qualScan(String input) {
var scanner = qualFactory.scanner(input);
return scanner.scan();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.example.myapp.assist;

import jakarta.inject.Qualifier;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface MyJsName {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.example.myapp.assist;

public interface Scanner {

String scan();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.example.myapp.assist;

import io.avaje.inject.Component;

@Component
public class Somthin {
public String hi() {
return "hi";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.example.myapp.assist.css;

import io.avaje.inject.AssistFactory;
import io.avaje.inject.Assisted;
import org.example.myapp.assist.CssFactory;
import org.example.myapp.assist.Scanner;
import org.example.myapp.assist.Somthin;

@AssistFactory(CssFactory.class)
class CssScanner implements Scanner {

private final String path;
private final Somthin somthin;

CssScanner(@Assisted String path, Somthin somthin) {
this.path = path;
this.somthin = somthin;
}

@Override
public String scan() {
return "scanWith|path=" + path + " | somethin=" + somthin.hi();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.example.myapp.assist.css;

import io.avaje.inject.AssistFactory;
import io.avaje.inject.Assisted;
import jakarta.inject.Named;
import org.example.myapp.assist.*;

@Named("withName")
@AssistFactory(JsFactory.class)
class JsWithNameScanner implements Scanner {

private final String path;
private final Somthin somthin;

JsWithNameScanner(@Assisted String path, Somthin somthin) {
this.path = path;
this.somthin = somthin;
}

@Override
public String scan() {
return "jsScanNamed|path=" + path + " | somethin=" + somthin.hi();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.example.myapp.assist.css;

import io.avaje.inject.AssistFactory;
import io.avaje.inject.Assisted;
import jakarta.inject.Named;
import org.example.myapp.assist.JsFactory;
import org.example.myapp.assist.MyJsName;
import org.example.myapp.assist.Scanner;
import org.example.myapp.assist.Somthin;

@MyJsName
@AssistFactory(JsFactory.class)
class JsWithQualScanner implements Scanner {

private final String path;
private final Somthin somthin;

JsWithQualScanner(@Assisted String path, Somthin somthin) {
this.path = path;
this.somthin = somthin;
}

@Override
public String scan() {
return "jsScanQual|path=" + path + " | somethin=" + somthin.hi();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.example.myapp.assist.droid;

import java.util.List;

import io.avaje.inject.AssistFactory;
import io.avaje.inject.Assisted;
import io.avaje.lang.Nullable;
import jakarta.inject.Named;

@Named("tomato")
@AssistFactory(CarFactory.class)
public class Car {
public Car(@Assisted Paint paint, @Assisted List<String> type, @Nullable Engine engine) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.example.myapp.assist.droid;

import java.util.List;

public interface CarFactory {

Car create(Paint paint, List<String> type);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.example.myapp.assist.droid;

import io.avaje.inject.Assisted;
import io.avaje.inject.AssistFactory;
import jakarta.inject.Named;

@Named("android")
@AssistFactory(DroidFactory.class)
public class DroidConstructor implements DroidFactory.Droid {

private final int personality;
private final Model model;
private final Engine wiring;
private final Radio radio;

public DroidConstructor(@Assisted int personality, @Assisted Model model, Engine wiring, @Named("red") Radio radio) {
this.personality = personality;
this.model = model;
this.wiring = wiring;
this.radio = radio;
}

public int personality() {
return personality;
}

public Model model() {
return model;
}

@Override
public boolean dependenciesAreWired() {
return wiring != null && radio != null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.example.myapp.assist.droid;

public interface DroidFactory {

Droid createDroid(int personality, Model model);

interface Droid {

int personality();

Model model();

boolean dependenciesAreWired();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.example.myapp.assist.droid;

import io.avaje.inject.Assisted;
import io.avaje.inject.AssistFactory;
import jakarta.inject.Inject;
import jakarta.inject.Named;

@Named("androidfield")
@AssistFactory(DroidFactory.class)
public class DroidField implements DroidFactory.Droid {
@Assisted int personality;
@Assisted Model model;
@Inject Engine wiring;

@Named("red") @Inject Radio radio;

public int personality() {
return personality;
}

public Model model() {
return model;
}

@Override
public boolean dependenciesAreWired() {
return wiring != null && radio != null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.example.myapp.assist.droid;

import io.avaje.inject.Assisted;
import io.avaje.inject.AssistFactory;
import jakarta.inject.Inject;
import jakarta.inject.Named;

@Named("androidmethod")
@AssistFactory(DroidFactory.class)
public class DroidMethod implements DroidFactory.Droid {

private int personality;
private Model model;
private Engine wiring;

private Radio radio;
@Inject
public void inject(@Assisted int personality, @Assisted Model model, Engine wiring, @Named("red") Radio radio) {
this.personality = personality;
this.model = model;
this.wiring = wiring;
this.radio = radio;
}

@Override
public int personality() {
return personality;
}

@Override
public Model model() {
return model;
}

@Override
public boolean dependenciesAreWired() {
return wiring != null && radio != null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.example.myapp.assist.droid;

import io.avaje.inject.Component;
import jakarta.inject.Named;

@Component
public class DroidThing {


final DroidFactory factoryViaField;

final DroidFactory factoryViaMethod;


final DroidFactory factoryViaConstructor;

public DroidThing(@Named("androidfield") DroidFactory factoryViaField,
@Named("androidmethod") DroidFactory factoryViaMethod,
@Named("android") DroidFactory factoryViaConstructor) {
this.factoryViaField = factoryViaField;
this.factoryViaMethod = factoryViaMethod;
this.factoryViaConstructor = factoryViaConstructor;
}

public DroidFactory.Droid viaField(int p, Model m) {
return factoryViaField.createDroid(p, m);
}

public DroidFactory.Droid viaMethod(int p, Model m) {
return factoryViaMethod.createDroid(p, m);
}
public DroidFactory.Droid viaCtor(int p, Model m) {
return factoryViaConstructor.createDroid(p, m);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.example.myapp.assist.droid;

import jakarta.inject.Singleton;

@Singleton
public class Engine {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.example.myapp.assist.droid;
public enum Model {
SCANNER,
BATTLE,
EXECUTION,
OPERATOR
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package org.example.myapp.assist.droid;

public interface Paint {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.example.myapp.assist.droid;

import jakarta.inject.Singleton;

@Singleton
public class Radio {}
Loading