/*
 * 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.
 */

/**
 * @author Alexei Y. Zakharov
 */

package org.apache.harmony.jndi.provider.dns;

import javax.naming.InvalidNameException;

/**
 * Contains various constants that are used in the provider classes.
 *
 * @see RFC 1035
 */
public class ProviderConstants {

    // Constants that should be used as possible values for the header QR field 
    public static final boolean QR_QUERY = false;
    public static final boolean QR_RESPONSE = true;
    
    // Message header masks
    public static final int QR_MASK = 0x8000;
    public static final int OPCODE_MASK = 0x7800;
    public static final int AA_MASK = 0x400;
    public static final int TC_MASK = 0x200;
    public static final int RD_MASK = 0x100;
    public static final int RA_MASK = 0x80;
    public static final int Z_MASK = 0x70;
    public static final int RCODE_MASK = 0xf;

    // Message header fields shifts
    public static final int OPCODE_SHIFT = 11;
    public static final int RCODE_SHIFT = 0;
    
    // Constants that can be used as OPCODEs in the header
    public static final int QUERY = 0;
    public static final int IQUERY = 1;
    public static final int STATUS = 2;

    // Constants that can be used as RCODEs in the header
    public static final int NO_ERROR = 0;
    public static final int FORMAT_ERROR = 1;
    public static final int SERVER_FAILURE = 2;
    public static final int NAME_ERROR = 3;
    public static final int NOT_IMPLEMENTED = 4;
    public static final int REFUSED = 5;

    // Possible TYPE values
    public static final int A_TYPE = 1;
    public static final int NS_TYPE = 2;
    public static final int MD_TYPE = 3;
    public static final int MF_TYPE = 4;
    public static final int CNAME_TYPE = 5;
    public static final int SOA_TYPE = 6;
    public static final int MB_TYPE = 7;
    public static final int MG_TYPE = 8;
    public static final int MR_TYPE = 9;
    public static final int NULL_TYPE = 10;
    public static final int WKS_TYPE = 11;
    public static final int PTR_TYPE = 12;
    public static final int HINFO_TYPE = 13;
    public static final int MINFO_TYPE = 14;
    public static final int MX_TYPE = 15;
    public static final int TXT_TYPE = 16;
    public static final int AAAA_TYPE = 28;
    public static final int SRV_TYPE = 33;
    
    // Possible QTYPE values
    public static final int AXFR_QTYPE = 252;    
    public static final int MAILB_QTYPE = 253;    
    public static final int MAILA_QTYPE = 254;    
    public static final int ANY_QTYPE = 255;   
    
    public static String[] rrTypeNames;
    public static String[] rrClassNames;
    
    // Possible CLASS values
    public static final int IN_CLASS = 1;
    public static final int CS_CLASS = 2;
    public static final int CH_CLASS = 3;
    public static final int HS_CLASS = 4;

    // Possible QCLASS values
    public static final int ANY_QCLASS = 255;

    // Maximum lengths
    public static final int LABEL_MAX_CHARS = 63;
    public static final int NAME_MAX_CHARS = 255;

    // default DNS port
    public static final int DEFAULT_DNS_PORT = 53;

    // Resolver settings
    public static final int DEFAULT_INITIAL_TIMEOUT = 1000;
    public static final int DEFAULT_TIMEOUT_RETRIES = 4;
    public static final boolean DEFAULT_AUTHORITATIVE = false;
    public static final boolean DEFAULT_RECURSION = true;
    public static final int DEFAULT_LOOKUP_ATTR_TYPE = TXT_TYPE;
    public static final int DEFAULT_LOOKUP_ATTR_CLASS = IN_CLASS;
    public static final int DEFAULT_MAX_THREADS = 7;
    
    public static DNSName ROOT_ZONE_NAME_OBJ = null;
    
    // public static final String LOGGER_NAME =
    //        "org.apache.harmony.jndi.provider.dns";

    
    static {
        // Resource Record types
        // commented out types are not supported
        rrTypeNames = new String[256];
        for (int i = 0; i < 256; i++) {
            rrTypeNames[i] = String.valueOf(i);
        }
        rrTypeNames[A_TYPE] = "A"; //$NON-NLS-1$
        rrTypeNames[NS_TYPE] = "NS"; //$NON-NLS-1$
        //rrTypeNames[MD_TYPE] = "MD";
        //rrTypeNames[MF_TYPE] = "MF";
        rrTypeNames[CNAME_TYPE] = "CNAME"; //$NON-NLS-1$
        rrTypeNames[SOA_TYPE] = "SOA"; //$NON-NLS-1$
        //rrTypeNames[MB_TYPE] = "MB";
        //rrTypeNames[MG_TYPE] = "MG";
        //rrTypeNames[MR_TYPE] = "MR";
        //rrTypeNames[NULL_TYPE] = "NULL";
        //rrTypeNames[WKS_TYPE] = "WKS";
        rrTypeNames[PTR_TYPE] = "PTR"; //$NON-NLS-1$
        rrTypeNames[HINFO_TYPE] = "HINFO"; //$NON-NLS-1$
        //rrTypeNames[MINFO_TYPE] = "MINFO";
        rrTypeNames[MX_TYPE] = "MX"; //$NON-NLS-1$
        rrTypeNames[TXT_TYPE] = "TXT"; //$NON-NLS-1$
        rrTypeNames[AAAA_TYPE] = "AAAA"; //$NON-NLS-1$
        rrTypeNames[SRV_TYPE] = "SRV"; //$NON-NLS-1$
        //rrTypeNames[AXFR_QTYPE] = "AXFR";
        //rrTypeNames[MAILB_QTYPE] = "MAILB";
        //rrTypeNames[MAILA_QTYPE] = "MAILA";
        rrTypeNames[ANY_QTYPE] = "*"; //$NON-NLS-1$

        // Resource Record classes
        rrClassNames = new String[256];
        for (int i = 0; i < 256; i++) {
            rrClassNames[i] = String.valueOf(i);
        }
        rrClassNames[IN_CLASS] = "IN"; //$NON-NLS-1$
        rrClassNames[HS_CLASS] = "HS"; //$NON-NLS-1$
        rrClassNames[ANY_QCLASS] = "*"; //$NON-NLS-1$

        // Root zone name
        try {
            ROOT_ZONE_NAME_OBJ = (DNSName) ((new DNSNameParser()).parse(".")); //$NON-NLS-1$
        } catch (InvalidNameException e) {
            // ignore
        }
    }
}

@@ -4343,16 +4343,22 @@
  static 
+final 
 DNSName 
@@ -4379,15 +4379,8 @@
 _OBJ
- = null
 ;%0A  
@@ -6140,44 +6140,59 @@
     
-try %7B%0A            ROOT_ZONE_NAME_OBJ
+DNSName root = null;%0A        try %7B%0A            root
  = (
@@ -6321,20 +6321,55 @@
 e%0A        %7D%0A
+        ROOT_ZONE_NAME_OBJ = root;%0A
     %7D%0A%7D%0A

Mark the DNS root name as final so it cannot be subsequently modified.