DOMConfigurationImpl.java

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you 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.axiom.dom;

import java.util.HashMap;
import java.util.Map;

import org.w3c.dom.DOMConfiguration;
import org.w3c.dom.DOMException;
import org.w3c.dom.DOMStringList;

// TODO: should eventually have package access
public final class DOMConfigurationImpl implements DOMConfiguration {
    private static final String CANONICAL_FORM_PARAM = "canonical-form";
    private static final String CDATA_SECTIONS_PARAM ="cdata-sections";
    private static final String CHECK_CHAR_NORMALIZATION_PARAM  = "check-character-normalization";
    private static final String COMMENTS_PARAM = "comments";
    private static final String DATATYPE_NORMALIZATION_PARAM = "datatype-normalization"; 
    private static final String ELEMENT_CONTENT_WHITESPACE_PARAM = "element-content-whitespace";
    private static final String ENTITIES_PARAM = "entities";
    private static final String ERROR_HANDLER_PARAM = "error-handler";
    private static final String INFOSET_PARAM = "infoset";
    private static final String NAMESPACES_PARAM = "namespaces";
    private static final String NAMESPACE_DECLARATIONS_PARAM = "namespace-declarations";
    private static final String NORMALIZE_CHARACTERS_PARAM = "normalize-characters";
    private static final String SCHEMA_LOCATION_PARAM = "schema-location";
    private static final String SCHEMA_TYPE_PARAM = "schema-type";
    private static final String SPLIT_CDATA_SECTIONS_PARAM = "split-cdata-sections";
    private static final String VALIDATE_PARAM = "validate";
    private static final String VALIDATE_IF_SCHEMA_PARAM = "validate-if-schema";
    private static final String WELLFORMED_PARAM = "well-formed";

    public static final int CANONICAL_FORM             = 1<<0;
    public static final int CDATA_SECTIONS             = 1<<1;
    public static final int CHECK_CHAR_NORMALIZATION   = 1<<2;
    public static final int COMMENTS                   = 1<<3;
    public static final int DATATYPE_NORMALIZATION     = 1<<4;
    public static final int ELEMENT_CONTENT_WHITESPACE = 1<<5;
    public static final int ENTITIES                   = 1<<6;
    public static final int NAMESPACES                 = 1<<7;
    public static final int NAMESPACE_DECLARATIONS     = 1<<8;
    public static final int NORMALIZE_CHARACTERS       = 1<<9;
    public static final int SPLIT_CDATA_SECTIONS       = 1<<10;
    public static final int VALIDATE                   = 1<<11;
    public static final int VALIDATE_IF_SCHEMA         = 1<<12;
    public static final int WELLFORMED                 = 1<<13;

    private static final int INFOSET_TRUE_PARAMS = NAMESPACES | COMMENTS | WELLFORMED | NAMESPACE_DECLARATIONS;
    private static final int INFOSET_FALSE_PARAMS = ENTITIES | DATATYPE_NORMALIZATION | CDATA_SECTIONS;
    private static final int INFOSET_MASK = INFOSET_TRUE_PARAMS | INFOSET_FALSE_PARAMS;
    
    /**
     * Defines parameters that can't be changed (because the non default values are not supported).
     */
    private static final int FIXED_MASK = CANONICAL_FORM | CDATA_SECTIONS | CHECK_CHAR_NORMALIZATION | COMMENTS
            | DATATYPE_NORMALIZATION | ELEMENT_CONTENT_WHITESPACE | ENTITIES | NAMESPACE_DECLARATIONS
            | NORMALIZE_CHARACTERS | VALIDATE | VALIDATE_IF_SCHEMA;
    
    private static final Map/*<String,Integer>*/ paramMap = new HashMap();
    
    static {
        paramMap.put(CANONICAL_FORM_PARAM, Integer.valueOf(CANONICAL_FORM));
        paramMap.put(CDATA_SECTIONS_PARAM, Integer.valueOf(CDATA_SECTIONS));
        paramMap.put(CHECK_CHAR_NORMALIZATION_PARAM, Integer.valueOf(CHECK_CHAR_NORMALIZATION));
        paramMap.put(COMMENTS_PARAM, Integer.valueOf(COMMENTS));
        paramMap.put(DATATYPE_NORMALIZATION_PARAM, Integer.valueOf(DATATYPE_NORMALIZATION));
        paramMap.put(ELEMENT_CONTENT_WHITESPACE_PARAM, Integer.valueOf(ELEMENT_CONTENT_WHITESPACE));
        paramMap.put(ENTITIES_PARAM, Integer.valueOf(ENTITIES));
        paramMap.put(NAMESPACES_PARAM, Integer.valueOf(NAMESPACES));
        paramMap.put(NAMESPACE_DECLARATIONS_PARAM, Integer.valueOf(NAMESPACE_DECLARATIONS));
        paramMap.put(NORMALIZE_CHARACTERS_PARAM, Integer.valueOf(NORMALIZE_CHARACTERS));
        paramMap.put(SPLIT_CDATA_SECTIONS_PARAM, Integer.valueOf(SPLIT_CDATA_SECTIONS));
        paramMap.put(VALIDATE_PARAM, Integer.valueOf(VALIDATE));
        paramMap.put(VALIDATE_IF_SCHEMA_PARAM, Integer.valueOf(VALIDATE_IF_SCHEMA));
        paramMap.put(WELLFORMED_PARAM, Integer.valueOf(WELLFORMED));
    }
    
    private int params = CDATA_SECTIONS | COMMENTS | ELEMENT_CONTENT_WHITESPACE | ENTITIES
            | NAMESPACES | NAMESPACE_DECLARATIONS | SPLIT_CDATA_SECTIONS | WELLFORMED;
    
    public void setParameter(String name, Object value) throws DOMException {
        Integer mask = (Integer)paramMap.get(name);
        if (mask != null) {
            if (value instanceof Boolean) {
                if ((mask.intValue() & FIXED_MASK) == 0) {
                    if (((Boolean)value).booleanValue()) {
                        params |= mask.intValue();
                    } else {
                        params &= ~mask.intValue();
                    }
                } else {
                    // TODO
                }
            } else {
                // TODO
            }
        } else {
            // TODO
        }
    }
    
    public boolean isEnabled(int param) {
        return (params & param) != 0;
    }
    
    public Object getParameter(String name) throws DOMException {
        Integer mask = (Integer)paramMap.get(name);
        if (mask != null) {
            return Boolean.valueOf((params & mask.intValue()) != 0);
        } else {
            // TODO
            return null;
        }
    }

    public boolean canSetParameter(String name, Object value) {
        // TODO Auto-generated method stub
        return false;
    }

    public DOMStringList getParameterNames() {
        // TODO Auto-generated method stub
        return null;
    }
}