/*
 * Fichero:     DocumentoCXML.java
 * Fecha:       20/10/06
 * Autor:       Alvaro Sarmiento Losada
 * Asignatura:  Proyecto Fin de Carrera
 * Descripción: Contiene la clase DocumentoCXML, que representa un documento
 *              de contenido cXML de propósito general.
 *
 * Este fichero pertenece al proyecto fin de carrera del autor,
 * consistente en el estudio de JXTA y su aplicación al comercio 
 * electrónico b2b.
 */

package com.pfc.lib.xml.cxml;

import java.io.File;
import java.io.IOException;

import org.jdom.Element;
import com.pfc.lib.xml.DocumentoXML;

/**
 * Representa a un documento XML con contenido cXML (commerce XML).
 * El tipo de documentos cXML representados pueden ser: <br>
 * 1.- cXML     : peticiones y respuestas de órdenes de compra, transacciones
 *                punchout, facturas, etc. <br>
 * 2.- Supplier : para almacenar información acerca de un proveedor. <br>
 * 3.- Index    : para almacenar información acerca de un catálogo. <br>
 * Todos los documentos cXML deben ser validados respecto del DTD 
 * proporcionado por <a href="www.cxml.org">cXML.org</a>. <br><br>
 * <b>Nota:</b> <br>
 * <i>Esta implementación usa un DTD local a la máquina, de forma que la
 * validación del documento sea más rápida. Si se usara el DTD externo, el
 * parser XML debe acceder a ese recurso con el incremento de tiempo de 
 * proceso que ello requiere, y con el peligro de no estar disponible en
 * ese momento el recurso, bien sea por falta de conexión, o por 
 * imposibilidad de encontrar el recurso. Se debe asegurar que el DTD usado
 * por cXML, "cXML.dtd", se encuentre disponible en los directorios 
 * de trabajo. <i>
 * 
 * @author  Alvaro Sarmiento Losada
 */
public class DocumentoCXML extends DocumentoXML {
    
    /**
     * Constante que define la localización relativa en la propia máquina
     * del DTD usado para validar los documentos CXML.
     */
    protected final static String CXML_DTD = "cXML.dtd";
    
    /**
     * Constante que define la localización URL del DTD usado para validar
     * los documentos CXML.
     */
    protected final static String CXML_DTD_URL = 
                           "http://xml.cXML.org/schemas/cXML/1.2.009/cXML.dtd";
    
    /**
     * Constante que define el tipo "cXML" para la declaración de tipo de
     * documento XML, usado para la mayoría de documentos CXML que deben 
     * cumplir con el DTD de cXML.
     */
    public final static String TIPO_CXML = "cXML";

    /**
     * Constante que define el tipo "Index" para la declaración de tipo de
     * documento XML, usado para los documentos de catálogo cXML.
     */
    public final static String TIPO_CATALOGO = "Index";

    /**
     * Constante que define el tipo "Supplier" para la declaración de tipo de
     * documento XML, usado para los documentos de datos de proveedores cXML.
     */
    public final static String TIPO_DATOS = "Supplier";
    
    /**
     * Constructor básico de la clase. Crea un nuevo objeto 
     * <code>DocumentoCXML</code> vacío.
     */
    public DocumentoCXML() {
        super();
    }
    
    /**
     * Crea una nueva instancia de esta clase a partir del XML contenido
     * en el archivo especificado. Este constructor debe ser usado con
     * precaución, puesto que no comprueba que el documento XML sea 
     * realmente de contenido cXML, por lo que se debe asegurar que el
     * XML sea de tipo cXML. El documento cXML será validado frente al
     * DTD que tenga en la declaración de tipo de documento XML.
     *
     * @param  archivo el archivo que contiene el texto cXML a partir del
     *                 cual se generará este objeto.
     * @throws IOException si ocurre un error de I/O que impida que el
     *                     documento contenido en el archivo sea leido
     *                     completamente.
     */
    public DocumentoCXML(File archivo) throws IOException {
        super(archivo);
    }
    
    /**
     * Crea una nueva instancia de esta clase, creando una nueva estructura
     * XML mediante la el establecimiento de la declaración de tipo de 
     * documento XML y del elemento raíz.
     *
     * @param tipo valor del tipo de documento XML y del elemento raiz de
     *             este documento cXML.
     */
    public DocumentoCXML(String tipo) {
        super(tipo, CXML_DTD);
        Element raiz = new Element(tipo);
        setElementoRaiz(raiz);
    }
    
    /**
     * Crea un objeto de esta clase idéntico a este objeto.
     * 
     * @return un objeto idéntico a este.
     */
    public Object clone() {
        DocumentoCXML doc = new DocumentoCXML();
        doc.setDocumento(documento);
        return doc;
    }
        
}