/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * 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.
 */

package org.apache.axis2.wsdl.databinding;

import org.apache.axiom.om.OMElement;

import javax.xml.namespace.QName;
import java.util.Map;

public interface TypeMapper {

   

    /**
     * Returns whether the mapping is the object type or the normal class name type
     * @return Returns boolean.
     */
    public boolean isObjectMappingPresent();

    /**
     * Gets the type mapping class name.
     *
     * @param qname name of the XML element to be mapped
     * @return Returns a string that represents the particular type.
     */
    public String getTypeMappingName(QName qname);

    /**
     * Gets the type mapping Object.
     *
     * @param qname name of the XML element to be mapped
     * @return Returns an Object that represents the particular class in a pre specified form.
     *         It can be a specific format to the databinding framework used.
     *         This allows tight integrations with the databinding framework, allowing the emitter
     *         to write the databinding classes in its own way.
     */
    public Object getTypeMappingObject(QName qname);

    /**
     * Gets the parameter name.
     *
     * @param qname name of the XML element to get a parameter
     * @return Returns a unique parameter name.
     */
    public String getParameterName(QName qname);

    /**
     * Adds a type mapping name to the type mapper.
     *
     * @param qname
     * @param value
     * @see #getTypeMappingName(javax.xml.namespace.QName)
     */
    public void addTypeMappingName(QName qname, String value);

    /**
     * Adds a type mapping object to the type mapper.
     *
     * @param qname the xml Qname that this type refers to
     * @param value the type mapping object
     * @see #getTypeMappingObject(javax.xml.namespace.QName)
     */
    public void addTypeMappingObject(QName qname, Object value);

    /**
     * @return Returns a map containing all type mapping names
     * i.e. Qname to  classname
     */
    public Map getAllMappedNames();

    /**
     * @return Returns a map containing all type mapping model objects
     * i.e. Qname to model objects
     */
    public Map getAllMappedObjects();

    /**
     *
     * @return the default mapping name for this type mapper
     */
    public String getDefaultMappingName();

    /**
     * Sets the default type mapping - the databinders may
     * change the default mapping to suit their default
     * mapping
     * @param defaultMapping
     */
    public void setDefaultMappingName(String defaultMapping);


    /**
     * Allows the storage of a status object with a mapping to
     * the qname. This may be used to store certain status information
     * that will be used by different type mappers. A given type mapper
     * may choose not to implement this!
     * @param qname
     * @param status
     */
    public void addTypeMappingStatus(QName qName,Object status);

    /**
     * Returns the relevant status object given the qName of the xml element
     * @see #addTypeMappingStatus(javax.xml.namespace.QName, Object)
     * @param qName
     * @return the status object
     */
    public Object getTypeMappingStatus(QName qName);
}
