1 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org)
2
3 package org.xbill.DNS;
4
5 import java.io.*;
6 import java.util.*;
7
8 /**
9 * Implements common functionality for the many record types whose format
10 * is a list of strings.
11 *
12 * @author Brian Wellington
13 */
14
15 abstract class TXTBase extends Record {
16
17 private static final long serialVersionUID = -4319510507246305931L;
18
19 protected List strings;
20
21 protected
TXTBase()22 TXTBase() {}
23
24 protected
TXTBase(Name name, int type, int dclass, long ttl)25 TXTBase(Name name, int type, int dclass, long ttl) {
26 super(name, type, dclass, ttl);
27 }
28
29 protected
TXTBase(Name name, int type, int dclass, long ttl, List strings)30 TXTBase(Name name, int type, int dclass, long ttl, List strings) {
31 super(name, type, dclass, ttl);
32 if (strings == null)
33 throw new IllegalArgumentException("strings must not be null");
34 this.strings = new ArrayList(strings.size());
35 Iterator it = strings.iterator();
36 try {
37 while (it.hasNext()) {
38 String s = (String) it.next();
39 this.strings.add(byteArrayFromString(s));
40 }
41 }
42 catch (TextParseException e) {
43 throw new IllegalArgumentException(e.getMessage());
44 }
45 }
46
47 protected
TXTBase(Name name, int type, int dclass, long ttl, String string)48 TXTBase(Name name, int type, int dclass, long ttl, String string) {
49 this(name, type, dclass, ttl, Collections.singletonList(string));
50 }
51
52 void
rrFromWire(DNSInput in)53 rrFromWire(DNSInput in) throws IOException {
54 strings = new ArrayList(2);
55 while (in.remaining() > 0) {
56 byte [] b = in.readCountedString();
57 strings.add(b);
58 }
59 }
60
61 void
rdataFromString(Tokenizer st, Name origin)62 rdataFromString(Tokenizer st, Name origin) throws IOException {
63 strings = new ArrayList(2);
64 while (true) {
65 Tokenizer.Token t = st.get();
66 if (!t.isString())
67 break;
68 try {
69 strings.add(byteArrayFromString(t.value));
70 }
71 catch (TextParseException e) {
72 throw st.exception(e.getMessage());
73 }
74
75 }
76 st.unget();
77 }
78
79 /** converts to a String */
80 String
rrToString()81 rrToString() {
82 StringBuffer sb = new StringBuffer();
83 Iterator it = strings.iterator();
84 while (it.hasNext()) {
85 byte [] array = (byte []) it.next();
86 sb.append(byteArrayToString(array, true));
87 if (it.hasNext())
88 sb.append(" ");
89 }
90 return sb.toString();
91 }
92
93 /**
94 * Returns the text strings
95 * @return A list of Strings corresponding to the text strings.
96 */
97 public List
getStrings()98 getStrings() {
99 List list = new ArrayList(strings.size());
100 for (int i = 0; i < strings.size(); i++)
101 list.add(byteArrayToString((byte []) strings.get(i), false));
102 return list;
103 }
104
105 /**
106 * Returns the text strings
107 * @return A list of byte arrays corresponding to the text strings.
108 */
109 public List
getStringsAsByteArrays()110 getStringsAsByteArrays() {
111 return strings;
112 }
113
114 void
rrToWire(DNSOutput out, Compression c, boolean canonical)115 rrToWire(DNSOutput out, Compression c, boolean canonical) {
116 Iterator it = strings.iterator();
117 while (it.hasNext()) {
118 byte [] b = (byte []) it.next();
119 out.writeCountedString(b);
120 }
121 }
122
123 }
124