// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org)

package org.xbill.DNS;

import java.io.*;
import java.util.*;

/**
 * Implements common functionality for the many record types whose format
 * is a list of strings.
 *
 * @author Brian Wellington
 */

abstract class TXTBase extends Record {

    private static final long serialVersionUID = -4319510507246305931L;

    protected List strings;

    protected TXTBase() {
    }

    protected TXTBase(Name name, int type, int dclass, long ttl) {
        super(name, type, dclass, ttl);
    }

    protected TXTBase(Name name, int type, int dclass, long ttl, List strings) {
        super(name, type, dclass, ttl);
        if (strings == null)
            throw new IllegalArgumentException("strings must not be null");
        this.strings = new ArrayList(strings.size());
        Iterator it = strings.iterator();
        try {
            while (it.hasNext()) {
                String s = (String) it.next();
                this.strings.add(byteArrayFromString(s));
            }
        } catch (TextParseException e) {
            throw new IllegalArgumentException(e.getMessage());
        }
    }

    protected TXTBase(Name name, int type, int dclass, long ttl, String string) {
        this(name, type, dclass, ttl, Collections.singletonList(string));
    }

    void
    rrFromWire(DNSInput in) throws IOException {
        strings = new ArrayList(2);
        while (in.remaining() > 0) {
            byte[] b = in.readCountedString();
            strings.add(b);
        }
    }

    void
    rdataFromString(Tokenizer st, Name origin) throws IOException {
        strings = new ArrayList(2);
        while (true) {
            Tokenizer.Token t = st.get();
            if (!t.isString())
                break;
            try {
                strings.add(byteArrayFromString(t.value));
            } catch (TextParseException e) {
                throw st.exception(e.getMessage());
            }

        }
        st.unget();
    }

    /**
     * converts to a String
     */
    String
    rrToString() {
        StringBuffer sb = new StringBuffer();
        Iterator it = strings.iterator();
        while (it.hasNext()) {
            byte[] array = (byte[]) it.next();
            sb.append(byteArrayToString(array, true));
            if (it.hasNext())
                sb.append(" ");
        }
        return sb.toString();
    }

    /**
     * Returns the text strings
     *
     * @return A list of Strings corresponding to the text strings.
     */
    public List
    getStrings() {
        List list = new ArrayList(strings.size());
        for (int i = 0; i < strings.size(); i++)
            list.add(byteArrayToString((byte[]) strings.get(i), false));
        return list;
    }

    /**
     * Returns the text strings
     *
     * @return A list of byte arrays corresponding to the text strings.
     */
    public List
    getStringsAsByteArrays() {
        return strings;
    }

    void
    rrToWire(DNSOutput out, Compression c, boolean canonical) {
        Iterator it = strings.iterator();
        while (it.hasNext()) {
            byte[] b = (byte[]) it.next();
            out.writeCountedString(b);
        }
    }

}
