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<String, Object> _idReferences = new Hashtable<String, Object>(); /** * 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 isValidating * 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(final IDResolver idResolver) { _idResolver = idResolver; } }