Quantcast
Channel: SmartClient Forums
Viewing all articles
Browse latest Browse all 4756

Problem with internal Java representation of SimpleCriterion

$
0
0
Hi Isomorphic,

I have a use case where I gather Criterion-Objects in a ArrayList<Criterion>.

Until now, I fed only SetCriterion to it and converted with:
Code:

return new AdvancedCriteria(DefaultOperators.Or, additionalOrCrit.toArray(new SetCriterion[additionalOrCrit.size()])).asCriterion();
No I realized that I don't need a SetCriterion if the Set consists only of 1 item. So I switched to SimpleCriterion for this.
This does not work, and I assume this is because of the internal representation of the SimpleCriterion.
While the SetCriterion is a JavaObject, the SimpleCriterion is a String, see screenshot of Eclipse debug mode.

This leads to this exception for the return statement:
Code:

=== 2014-07-04 15:38:47,876 [ec-5] WARN  RequestContext - dsRequest.execute() failed:
java.lang.ArrayStoreException
        at java.lang.System.arraycopy(Native Method)
        at java.util.ArrayList.toArray(Unknown Source)
        at com.lmscompany.lms.server.util.Criteria.getCreatedByLegalEntityCriterion(Criteria.java:128)
        at com.lmscompany.lms.server.worker.T_CAMPAIGN.fetchOwnAndOtherLECampaigns(T_CAMPAIGN.java:25)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.isomorphic.base.Reflection.adaptArgsAndInvoke(Reflection.java:975)
        at com.isomorphic.datasource.DataSourceDMI.execute(DataSourceDMI.java:416)
        at com.isomorphic.datasource.DataSourceDMI.execute(DataSourceDMI.java:64)
        at com.isomorphic.datasource.DSRequest.execute(DSRequest.java:2549)
        at com.isomorphic.servlet.IDACall.handleDSRequest(IDACall.java:215)
        at com.isomorphic.servlet.IDACall.processRPCTransaction(IDACall.java:172)

The whole method is:
Code:

public static Criterion getCreatedByLegalEntityCriterion(DSRequest dsRequest, TreeDirection treeDirection) throws Exception {
        HashMap<String, HashSet<Long>> legalEntityStructure = User.getLegalEntityStructure(dsRequest, treeDirection);
        if (legalEntityStructure == null)
                return null;
        ArrayList<Criterion> additionalOrCrit = new ArrayList<Criterion>();

        for (LegalEntityType legalEntityType : LegalEntityType.values()) {
                if (getEqualsOrSetCriterion(legalEntityStructure, legalEntityType) != null)
                        additionalOrCrit.add(getEqualsOrSetCriterion(legalEntityStructure, legalEntityType));
        }
        if (additionalOrCrit.size() >= 2)
                return new AdvancedCriteria(DefaultOperators.Or, additionalOrCrit.toArray(new SetCriterion[additionalOrCrit.size()])).asCriterion();
        if (additionalOrCrit.size() == 1)
                return additionalOrCrit.get(0);
        else
                return null;
}

As this takes basically takes a some HashSet<Long> as only inputs, it is easy to reproduce, even without the the called methods.

I'm using v9.1p_2014-06-29.

Best regards,
Blama


Viewing all articles
Browse latest Browse all 4756

Latest Images

Trending Articles



Latest Images