package org.exolab.castor.xml.descriptors;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.exolab.castor.xml.UnmarshalState;
import org.exolab.castor.xml.ValidationException;
import org.exolab.castor.xml.XMLClassDescriptor;
import org.exolab.castor.xml.XMLFieldDescriptor;

public abstract class BaseDescriptor implements XMLClassDescriptor {

  /**
   * Map holding the properties set and read by Natures.
   */
  private final Map<String, Object> _properties = new HashMap<>();

  /**
   * Map holding the available natures.
   */
  private final Set<String> _natures = new HashSet<>();

  /**
   * Returns true if the given object represented by this XMLClassDescriptor can accept a member
   * whose name is given. An XMLClassDescriptor can accept a field if it contains a descriptor that
   * matches the given name and if the given object can hold this field (i.e a value is not already
   * set for this field).
   * <p>
   * This is mainly used for container object (that can contain other objects), in this particular
   * case the implementation returns false.
   *
   * @param name the name of the field to check
   * @param namespace the namespace of the element. This may be null. Note: A null namespace is not
   *        the same as the default namespace unless the default namespace is also null.
   * @param object the object represented by this XMLCLassDescriptor
   * @return true if the given object represented by this XMLClassDescriptor can accept a member
   *         whose name is given.
   */
  public boolean canAccept(String name, String namespace, Object object) {
    return false;
  }

  /**
   * {@inheritDoc}
   * 
   * @see org.exolab.castor.xml.XMLClassDescriptor#
   *      checkDescriptorForCorrectOrderWithinSequence(org.exolab.castor.xml.XMLFieldDescriptor,
   *      org.exolab.castor.xml.UnmarshalState, java.lang.String)
   */
  public void checkDescriptorForCorrectOrderWithinSequence(XMLFieldDescriptor elementDescriptor,
      UnmarshalState parentState, String xmlName) throws ValidationException {
    // no implementation
  }

  /**
   * {@inheritDoc}
   * 
   * @see org.exolab.castor.xml.XMLClassDescriptor#isChoice()
   */
  public boolean isChoice() {
    return false;
  }

  /**
   * @see org.exolab.castor.builder.info.nature.PropertyHolder# getProperty(java.lang.String)
   * @param name of the property
   * @return value of the property
   */
  public Object getProperty(final String name) {
    return _properties.get(name);
  }

  /**
   * @see org.exolab.castor.builder.info.nature.PropertyHolder# setProperty(java.lang.String,
   *      java.lang.Object)
   * @param name of the property
   * @param value of the property
   */
  public void setProperty(final String name, final Object value) {
    _properties.put(name, value);
  }

  /**
   * @see org.exolab.castor.builder.info.nature.NatureExtendable# addNature(java.lang.String)
   * @param nature ID of the Nature
   */
  public void addNature(final String nature) {
    _natures.add(nature);
  }

  /**
   * @see org.exolab.castor.builder.info.nature.NatureExtendable# hasNature(java.lang.String)
   * @param nature ID of the Nature
   * @return true if the Nature ID was added.
   */
  public boolean hasNature(final String nature) {
    return _natures.contains(nature);
  }


}
