All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.datanucleus.validation.PersistenceTraversalResolver Maven / Gradle / Ivy

Go to download

DataNucleus Core provides the primary components of a heterogenous Java persistence solution. It supports persistence API's being layered on top of the core functionality.

There is a newer version: 6.0.7
Show newest version
/**********************************************************************
Copyright (c) 2009 Erik Bengtson and others. All rights reserved. 
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Contributors:
    ...
 **********************************************************************/
package org.datanucleus.validation;

import java.lang.annotation.ElementType;

import javax.validation.Path;
import javax.validation.TraversableResolver;

import org.datanucleus.ExecutionContext;
import org.datanucleus.metadata.AbstractClassMetaData;
import org.datanucleus.metadata.AbstractMemberMetaData;
import org.datanucleus.metadata.FieldPersistenceModifier;
import org.datanucleus.state.ObjectProvider;

/**
 * Resolver for traversal of validation.
 */
class PersistenceTraversalResolver implements TraversableResolver
{
    ExecutionContext ec;

    PersistenceTraversalResolver(ExecutionContext ec)
    {
        this.ec = ec;
    }

    /**
     * Determine if the Bean Validation provider is allowed to cascade validation on the bean instance returned by the
     * property value marked as @Valid. Note that this method is called only if isReachable
     * returns true for the same set of arguments and if the property is marked as @Valid
     * @param traversableObject object hosting traversableProperty or null if validateValue is
     * called
     * @param traversableProperty the traversable property.
     * @param rootBeanType type of the root object passed to the Validator.
     * @param pathToTraversableObject path from the root object to traversableObject (using the path
     * specification defined by Bean Validator).
     * @param elementType either FIELD or METHOD.
     * @return true if the Bean Validation provider is allowed to cascade validation, false
     * otherwise.
     */
    public boolean isCascadable(Object traversableObject, Path.Node traversableProperty, Class rootBeanType,
            Path pathToTraversableObject, ElementType elementType)
    {
        // we do not cascade
        return false;
    }

    /**
     * Determine if the Bean Validation provider is allowed to reach the property state
     * @param traversableObject object hosting traversableProperty or null if validateValue is
     * called
     * @param traversableProperty the traversable property.
     * @param rootBeanType type of the root object passed to the Validator.
     * @param pathToTraversableObject path from the root object to traversableObject (using the path
     * specification defined by Bean Validator).
     * @param elementType either FIELD or METHOD.
     * @return true if the Bean Validation provider is allowed to reach the property state,
     * false otherwise.
     */
    public boolean isReachable(Object traversableObject, Path.Node traversableProperty, Class rootBeanType,
            Path pathToTraversableObject, ElementType elementType)
    {
        AbstractClassMetaData acmd = ec.getMetaDataManager().getMetaDataForClass(traversableObject.getClass(), 
            ec.getClassLoaderResolver());
        if (acmd == null)
        {
            return false;
        }

        AbstractMemberMetaData mmd = acmd.getMetaDataForMember(traversableProperty.getName());
        if (mmd.getPersistenceModifier() == FieldPersistenceModifier.NONE)
        {
            // Just pass through for non-persistent fields
            return true;
        }

        // Return whether the field is loaded (and don't cause its loading)
        ObjectProvider op = ec.findObjectProvider(traversableObject);
        return op.isFieldLoaded(mmd.getAbsoluteFieldNumber());
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy