IDResolverImpl.java :  » Database-ORM » castor » org » exolab » castor » xml » Java Open Source

Java Open Source » Database ORM » castor 
castor » org » exolab » castor » xml » IDResolverImpl.java
package org.exolab.castor.xml;

import java.util.Hashtable;
import java.util.Map;

/**
 * Default {@link IDResolver} for Castor XML during (un)marshaling.
 * @see org.exolab.castor.xml.IDResolver
 */
class IDResolverImpl implements IDResolver {

    /**
     * A collection of IDREF --> target object mappings
     */
    private Map _idReferences = new Hashtable();

    /**
     * A custom (user-injected) IDResolver instance to be used 
     * for IDREF resolution.
     */
    private IDResolver _idResolver = null;

    /**
     * Binds a mapping from an ID to the referenced target object.
     * @param id
     *            Object identifier
     * @param object
     *            Object being identified by ID
     * @param _validate True if validation is enabled.
     * @throws ValidationException
     *             If an ID is used more than once.
     */
    void bind(final String id, final Object object, final boolean isValidating) 
        throws ValidationException {
        
        if (isValidating && id == null) {
            throw new ValidationException ("Invalid ID value 'null' encountered");
        }
        
        if (isValidating && id.equals("")) {
            throw new ValidationException ("Empty ID value encountered");
        }

        if (isValidating && _idReferences.containsKey(id)) {
            if (!(id.equals("org.exolab.castor.mapping.MapItem") ||
                    id.equals("HIGH-LOW"))) {
                throw new ValidationException("Duplicate ID " + id + " encountered");
            }
        } else {
            _idReferences.put(id, object);
        }

    }

    /**
     * Returns the Object whose id matches the given IDREF, or 'null' if no
     * object was found.
     * 
     * @param idref
     *            the IDREF to resolve.
     * @return the Object whose id matches the given IDREF.
     */
    public Object resolve(final String idref) {

        Object object = _idReferences.get(idref);
        if (object != null) {
            return object;
        }

        if (_idResolver != null) {
            return _idResolver.resolve(idref);
        }
        
        return null;
    }

    /**
     * Sets a custom IDResolver instance to be used for IDRef resolution.
     * @param idResolver a custom IDResolver instance to be used.
     */
    void setResolver(IDResolver idResolver) {
        _idResolver = idResolver;
    }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.