Package org.qi4j.api.query.grammar

Source Code of org.qi4j.api.query.grammar.ManyAssociationFunction

package org.qi4j.api.query.grammar;

import org.qi4j.api.composite.Composite;
import org.qi4j.api.composite.CompositeInstance;
import org.qi4j.api.association.AssociationStateHolder;
import org.qi4j.api.association.ManyAssociation;
import org.qi4j.functional.Function;

import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Member;
import java.lang.reflect.Proxy;

/**
* TODO
*/
public class ManyAssociationFunction<T>
        implements Function<Composite, ManyAssociation<T>>
{
    private AssociationFunction<?> traversedAssociation;
    private ManyAssociationFunction<?> traversedManyAssociation;
    private final AccessibleObject accessor;

    public ManyAssociationFunction( AssociationFunction<?> traversedAssociation, ManyAssociationFunction<?> traversedManyAssociation, AccessibleObject accessor )
    {
        this.traversedAssociation = traversedAssociation;
        this.traversedManyAssociation = traversedManyAssociation;
        this.accessor = accessor;
    }

    public AssociationFunction<?> getTraversedAssociation()
    {
        return traversedAssociation;
    }

    public ManyAssociationFunction<?> getTraversedManyAssociation()
    {
        return traversedManyAssociation;
    }

    public AccessibleObject getAccessor()
    {
        return accessor;
    }

    @Override
    public ManyAssociation<T> map( Composite entity )
    {
        try
        {
            Object target = entity;
            if (traversedAssociation != null)
                target = traversedAssociation.map( entity ).get();
            if (traversedManyAssociation != null)
                throw new IllegalArgumentException( "Cannot traverse ManyAssociations" );

            CompositeInstance handler = (CompositeInstance) Proxy.getInvocationHandler( target );
            return ((AssociationStateHolder)handler.state()).manyAssociationFor( accessor );
        } catch( IllegalArgumentException e )
        {
            throw e;
        } catch( Throwable e )
        {
            throw new IllegalArgumentException( e );
        }
    }

    @Override
    public String toString()
    {
        if (traversedAssociation != null)
            return traversedAssociation.toString()+"."+ ((Member)accessor).getName();
        else
            return ((Member)accessor).getName();
    }
}
TOP

Related Classes of org.qi4j.api.query.grammar.ManyAssociationFunction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.