Problem with select and filter

357 views
Skip to first unread message

m.ugues

unread,
Sep 6, 2011, 6:18:47 AM9/6/11
to lambdaj
Hallo all.
I have this use case:

...

List<ServizioAggiuntivoCanale> serviziNonMercati =
filter(having(on(TipologiaServizio.class).isServizioMercatoAzionario(),
equalTo(false)), serviziAggiuntiviCanale);

Where ServizioAggiuntivoCanale is

public interface ServizioAggiuntivoCanale extends
IdentificativoContratto{
public TipologiaServizio getTipologiaServizio();
public void setTipologiaServizio(TipologiaServizio codiceProdotto);

and TipologiaServizio is

public enum TipologiaServizio {
QBIT("QBIT", "MERC1", 1), QBPA("QBPA", "MERC3", 3), QBXE("QBXE",
"MERC5", 5), QUSA("QUSA", "MERC9", 9), TOLB("TOLB", 15), TOLA("TOLA",
16), AFIR("AFIR", 17), AUPD("AUPD", 18);

private final String tipologiaServizio;
private final String codiceProfilo;
private final Integer codiceProdotto;
...
public Boolean isServizioMercatoAzionario() {
return this.tipologiaServizio.startsWith("Q");
}


This is the stack trace

ch.lambdaj.function.argument.ArgumentConversionException: Unable to
convert the placeholder true in a valid argument
at
ch.lambdaj.function.argument.ArgumentsFactory.actualArgument(ArgumentsFactory.java:
77)
at
ch.lambdaj.function.matcher.HasArgumentWithValue.havingValue(HasArgumentWithValue.java:
70)
at ch.lambdaj.Lambda.having(Lambda.java:1070)
at
it.alten.intesasanpaolo.contratto.parsers.online.TestInserimentoCanaleParser.testInserimentoCanaleParser(TestInserimentoCanaleParser.java:
119)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod
$1.runReflectiveCall(FrameworkMethod.java:44)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:
15)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:
41)
at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:
20)
at
org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:
74)
at
org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:
82)
at
org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:
72)
at
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:
240)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:
49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at
org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:
61)
at
org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:
70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:
180)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:
49)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:
38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:
467)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:
683)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:
390)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:
197)


Wrong use?

Kind regards
Massimo

Mario Fusco

unread,
Sep 6, 2011, 6:32:43 AM9/6/11
to lam...@googlegroups.com
Hi Massimo,

actually you made 2 mistakes here.

The first one is that since serviziAggiuntiviCanale is a List of ServizioAggiuntivoCanale, the condition expressed with having should start from that class like in:

List<ServizioAggiuntivoCanale> serviziNonMercati =
filter(having(on(ServizioAggiuntivoCanale.class).getTipologiaServizio().isServizioMercatoAzionario(),equalTo(false)), serviziAggiuntiviCanale);

Moreover, even after that, this statement (and also the one you wrote) cannot work in lambdaj because TipologiaServizio is an enum and then final, so non proxable by lambdaj.

To work around this last issue my suggestion is to add a method like that in ServizioAggiuntivoCanale:

public Boolean isServizioMercatoAzionario() {
     return getTipologiaServizio().isServizioMercatoAzionario();
}

and then use it in a lambdaj statement as it follows:

List<ServizioAggiuntivoCanale> serviziNonMercati =
filter(having(on(ServizioAggiuntivoCanale.class).isServizioMercatoAzionario(),equalTo(false)), serviziAggiuntiviCanale);

I hope this helps. Let me know if this is a good solution for you and of course if it works.

Cheers,
Mario

m.ugues

unread,
Sep 6, 2011, 11:07:58 AM9/6/11
to lambdaj
Ok it works like a charm.
Thank you Mario ;)

Kind regards

Massimo
Reply all
Reply to author
Forward
0 new messages