package edu.mit.ll.wfs.util; import com.sun.xml.bind.marshaller.NamespacePrefixMapper; import java.util.HashMap; public class WFSNamespaceMapper extends NamespacePrefixMapper { HashMap _prefixMap; public WFSNamespaceMapper() { _prefixMap = new HashMap(); _prefixMap.put("http://www.opengis.net/fes/2.0", "fes" ); _prefixMap.put("http://www.opengis.net/wfs/2.0", "wfs" ); _prefixMap.put("http://www.opengis.net/gml/3.2", "gml" ); _prefixMap.put("http://www.opengis.net/gml", "gml31" ); _prefixMap.put("http://www.opengis.net/wcs/1.1", "wcs" ); _prefixMap.put("http://www.opengis.net/ows/1.1", "ows" ); _prefixMap.put("http://www.opengis.net/owsnt/1.1", "owsnt" ); _prefixMap.put("http://www.opengis.net/sensorML/1.0/gml32", "sml" ); _prefixMap.put("http://www.opengis.net/swe/1.0/gml32", "swe" ); _prefixMap.put("http://www.opengis.net/om/1.0/gml32", "om" ); _prefixMap.put("http://www.opengis.net/cv/0.2/gml32", "cv" ); _prefixMap.put("urn:us:gov:ic:ism:v2", "ism" ); _prefixMap.put("http://www.isotc211.org/2005/gmd", "gmd" ); _prefixMap.put("http://www.isotc211.org/2005/gco", "gco" ); _prefixMap.put("http://www.isotc211.org/2005/gts", "gts" ); _prefixMap.put("http://www.w3.org/2001/SMIL20/", "smil" ); _prefixMap.put("http://www.w3.org/2001/SMIL20/Language", "slang" ); _prefixMap.put("http://www.w3.org/1999/xlink", "xlink" ); _prefixMap.put("http://www.w3.org/2001/XMLSchema", "xs" ); _prefixMap.put("http://www.w3.org/2001/XMLSchema-instance", "xsi" ); _prefixMap.put("http://www.w3.org/2005/08/addressing", "wsa" ); _prefixMap.put("http://www.eurocontrol.int/wx/1.1", "wx" ); _prefixMap.put("http://www.eurocontrol.int/avwx/1.1", "avwx" ); _prefixMap.put("http://www.faa.gov/nawx/1.2", "nawx" ); _prefixMap.put("http://docs.oasis-open.org/wsn/t-1", "wsnt" ); _prefixMap.put("http://docs.oasis-open.org/wsn/b-2", "wsn" ); _prefixMap.put("http://docs.oasis-open.org/wsn/br-2", "wsnbr" ); _prefixMap.put("http://docs.oasis-open.org/wsrf/r-2", "wsrfr" ); _prefixMap.put("http://docs.oasis-open.org/wsrf/bf-2", "wsrfbf" ); } /** * Returns a preferred prefix for the given namespace URI. * * This method is intended to be overrided by a derived class. * * @param namespaceUri * The namespace URI for which the prefix needs to be found. * Never be null. "" is used to denote the default namespace. * @param suggestion * When the content tree has a suggestion for the prefix * to the given namespaceUri, that suggestion is passed as a * parameter. Typically this value comes from QName.getPrefix() * to show the preference of the content tree. This parameter * may be null, and this parameter may represent an already * occupied prefix. * @param requirePrefix * If this method is expected to return non-empty prefix. * When this flag is true, it means that the given namespace URI * cannot be set as the default namespace. * * @return * null if there's no preferred prefix for the namespace URI. * In this case, the system will generate a prefix for you. * * Otherwise the system will try to use the returned prefix, * but generally there's no guarantee if the prefix will be * actually used or not. * * return "" to map this namespace URI to the default namespace. * Again, there's no guarantee that this preference will be * honored. * * If this method returns "" when requirePrefix=true, the return * value will be ignored and the system will generate one. */ public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) { String prefix = _prefixMap.get( namespaceUri ); if( prefix == null && requirePrefix ) prefix = ""; return prefix; } /** * Returns a list of namespace URIs that should be declared * at the root element. *

* By default, the JAXB RI produces namespace declarations only when * they are necessary, only at where they are used. Because of this * lack of look-ahead, sometimes the marshaller produces a lot of * namespace declarations that look redundant to human eyes. For example, *


   * <?xml version="1.0"?>
   * <root>
   *   <ns1:child xmlns:ns1="urn:foo"> ... </ns1:child>
   *   <ns2:child xmlns:ns2="urn:foo"> ... </ns2:child>
   *   <ns3:child xmlns:ns3="urn:foo"> ... </ns3:child>
   *   ...
   * </root>
   * <xmp></pre>
   * <p>
   * If you know in advance that you are going to use a certain set of
   * namespace URIs, you can override this method and have the marshaller
   * declare those namespace URIs at the root element. 
   * <p>
   * For example, by returning <code>new String[]{"urn:foo"}</code>,
   * the marshaller will produce:
   * <pre><xmp>
   * <?xml version="1.0"?>
   * <root xmlns:ns1="urn:foo">
   *   <ns1:child> ... </ns1:child>
   *   <ns1:child> ... </ns1:child>
   *   <ns1:child> ... </ns1:child>
   *   ...
   * </root>
   * <xmp></pre>
   * <p>
   * To control prefixes assigned to those namespace URIs, use the
   * {@link #getPreferredPrefix} method. 
   * 
   * @return
   *      A list of namespace URIs as an array of {@link String}s.
   *      This method can return a length-zero array but not null.
   *      None of the array component can be null. To represent
   *      the empty namespace, use the empty string <code>""</code>.
   * 
   * @since
   *      JAXB RI 1.0.2 
   */
  public String[] getPreDeclaredNamespaceUris() 
  {
    return new String[] 
    {
      "http://www.w3.org/2001/XMLSchema",
      "http://www.w3.org/2001/XMLSchema-instance",
      "http://www.opengis.net/wfs/2.0",
      "http://www.opengis.net/fes/2.0",
      "http://www.opengis.net/ows/1.1",
      "http://www.opengis.net/gml/3.2",
      "http://www.opengis.net/om/1.0/gml32",
      "http://www.eurocontrol.int/wx/1.1",
      "http://www.eurocontrol.int/avwx/1.1",
      "http://www.faa.gov/nawx/1.2",
      "http://www.w3.org/1999/xlink"
    } ;
    
  }

  /**
   * Create list of namespaces that are assumed to be declared outside the context
   * of the JAXB-generated XML. 
   *
   * This allows one to suppress the appearance of namespaces that aren't actually
   * used in certain documents, thought that wasn't the original purpose of the 
   * method
   *
   * This example suppresses several of the RegRep namespaces as a test. Notionally
   * there could be several namespace mappers associated with the RegRep client library.
   * The mapper for the Query manager could excluded LifeCycle manager namespace, and
   * so on....
   *
   * Note: There is a request for a change in the JAXB issue tracker to automatically weed
   * out namespaces that aren't used (like XmlBeans) but the timeframe for a fix
   * is unclear.  (OJN)
   *
   */
  public String[] getContextualNamespaceDecls() 
  {
    return new String[] 
    {
      "wcs", "http://www.opengis.net/wcs/1.1",
      "gml31", "http://www.opengis.net/gml",
      "ism", "urn:us:gov:ic:ism:v2",

      "sml", "http://www.opengis.net/sensorML/1.0/gml32",
      "cv", "http://www.opengis.net/cv/0.2/gml32",

      "gco", "http://www.isotc211.org/2005/gco",
      "gts", "http://www.isotc211.org/2005/gts",

      "smil", "http://www.w3.org/2001/SMIL20/",
      "slang", "http://www.w3.org/2001/SMIL20/Language",

      "wsrfr", "http://docs.oasis-open.org/wsrf/r-2",
      "wsrfbf", "http://docs.oasis-open.org/wsrf/bf-2",
    } ;


  }

}