13742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman/**
23742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman *
33742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */
43742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanpackage javax.jmdns.impl.constants;
53742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
63742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.logging.Level;
73742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.logging.Logger;
83742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
93742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman/**
103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * DNS Record Class
113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman *
123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @author Arthur van Hoff, Jeff Sonstein, Werner Randelshofer, Pierre Frisch, Rick Blair
133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */
143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanpublic enum DNSRecordClass {
153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    CLASS_UNKNOWN("?", 0),
193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * static final Internet
213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    CLASS_IN("in", 1),
233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * CSNET
253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    CLASS_CS("cs", 2),
273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * CHAOS
293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    CLASS_CH("ch", 3),
313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Hesiod
333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    CLASS_HS("hs", 4),
353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Used in DNS UPDATE [RFC 2136]
373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    CLASS_NONE("none", 254),
393742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Not a DNS class, but a DNS query class, meaning "all classes"
413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    CLASS_ANY("any", 255);
433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
443742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    private static Logger       logger       = Logger.getLogger(DNSRecordClass.class.getName());
453742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
463742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
473742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Multicast DNS uses the bottom 15 bits to identify the record class...<br/>
483742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Except for pseudo records like OPT.
493742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
503742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public static final int     CLASS_MASK   = 0x7FFF;
513742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
523742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
533742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * For answers the top bit indicates that all other cached records are now invalid.<br/>
543742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * For questions it indicates that we should send a unicast response.
553742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
563742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public static final int     CLASS_UNIQUE = 0x8000;
573742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
583742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
593742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
603742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
613742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public static final boolean UNIQUE       = true;
623742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
633742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
643742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
653742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
663742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public static final boolean NOT_UNIQUE   = false;
673742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
683742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    private final String        _externalName;
693742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
703742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    private final int           _index;
713742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
723742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    DNSRecordClass(String name, int index) {
733742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        _externalName = name;
743742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        _index = index;
753742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
763742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
773742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
783742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Return the string representation of this type
793742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
803742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @return String
813742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
823742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public String externalName() {
833742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return _externalName;
843742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
853742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
863742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
873742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Return the numeric value of this type
883742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
893742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @return String
903742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
913742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public int indexValue() {
923742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return _index;
933742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
943742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
953742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
963742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * Checks if the class is unique
973742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
983742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param index
993742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @return <code>true</code> is the class is unique, <code>false</code> otherwise.
1003742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
1013742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public boolean isUnique(int index) {
1023742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return (this != CLASS_UNKNOWN) && ((index & CLASS_UNIQUE) != 0);
1033742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1043742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1053742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
1063742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param name
1073742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @return class for name
1083742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
1093742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public static DNSRecordClass classForName(String name) {
1103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        if (name != null) {
1113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            String aName = name.toLowerCase();
1123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            for (DNSRecordClass aClass : DNSRecordClass.values()) {
1133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                if (aClass._externalName.equals(aName)) return aClass;
1143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            }
1153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        }
1163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        logger.log(Level.WARNING, "Could not find record class for name: " + name);
1173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return CLASS_UNKNOWN;
1183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
1213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param index
1223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @return class for name
1233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
1243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public static DNSRecordClass classForIndex(int index) {
1253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        int maskedIndex = index & CLASS_MASK;
1263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        for (DNSRecordClass aClass : DNSRecordClass.values()) {
1273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            if (aClass._index == maskedIndex) return aClass;
1283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        }
1293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        logger.log(Level.WARNING, "Could not find record class for index: " + index);
1303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return CLASS_UNKNOWN;
1313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
1343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public String toString() {
1353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return this.name() + " index " + this.indexValue();
1363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
1373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
1383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman}
139