1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.jsieve.parser.address;
21
22 import java.io.Reader;
23 import java.io.StringReader;
24 import java.util.ArrayList;
25 import java.util.Collection;
26 import java.util.Collections;
27
28 import org.apache.jsieve.mail.MailAdapter;
29 import org.apache.jsieve.mail.MailAdapter.Address;
30 import org.apache.jsieve.parser.generated.address.ASTaddr_spec;
31 import org.apache.jsieve.parser.generated.address.ASTaddress_list;
32 import org.apache.jsieve.parser.generated.address.ASTdomain;
33 import org.apache.jsieve.parser.generated.address.ASTlocal_part;
34 import org.apache.jsieve.parser.generated.address.AddressListParser;
35 import org.apache.jsieve.parser.generated.address.ParseException;
36 import org.apache.jsieve.parser.generated.address.Token;
37
38
39
40
41
42
43
44
45 public class SieveAddressBuilder {
46
47 private static final Address[] EMPTY_ADDRESSES = {};
48
49 private final Collection<Address> addresses;
50
51 private final Worker worker;
52
53 public SieveAddressBuilder() {
54 addresses = Collections.synchronizedCollection(new ArrayList<Address>());
55 worker = new Worker();
56 }
57
58
59
60
61 public void reset() {
62 addresses.clear();
63 }
64
65
66
67
68
69
70
71
72 public void addAddresses(String addressList) throws ParseException {
73 final StringReader reader = new StringReader(addressList);
74 worker.addAddressses(reader, addresses);
75 }
76
77
78
79
80
81
82
83 public Address[] getAddresses() {
84 final Address[] results = (Address[]) addresses.toArray(EMPTY_ADDRESSES);
85 return results;
86 }
87
88
89
90
91
92 private final class Worker extends BaseAddressListVisitor {
93
94 public void addAddressses(final Reader reader, final Collection results)
95 throws ParseException {
96 AddressListParser parser = new AddressListParser(reader);
97 ASTaddress_list root = parser.parse();
98 root.childrenAccept(this, results);
99 }
100
101 @SuppressWarnings("unchecked")
102 public Object visit(ASTaddr_spec node, Object data) {
103 final AddressBean address = new AddressBean();
104 node.childrenAccept(this, address);
105 if (data instanceof Collection) {
106 final Collection collection = (Collection) data;
107 collection.add(address);
108 }
109 return data;
110 }
111
112 public Object visit(final ASTdomain node, final Object data) {
113 if (data instanceof AddressBean) {
114 final AddressBean address = (AddressBean) data;
115 final String domain = contents(node);
116 address.setDomain(domain);
117 }
118 return data;
119 }
120
121 public Object visit(ASTlocal_part node, Object data) {
122 if (data instanceof AddressBean) {
123 final AddressBean address = (AddressBean) data;
124 final String localPart = contents(node);
125 address.setLocalPart(localPart);
126 }
127 return data;
128 }
129
130 private String contents(AddressNode node) {
131 StringBuffer buffer = new StringBuffer(32);
132 Token last = node.lastToken;
133 Token next = node.firstToken;
134 while (next != last) {
135 buffer.append(next.image);
136 next = next.next;
137 }
138 buffer.append(last.image);
139 return buffer.toString();
140 }
141 }
142
143
144
145
146 private final class AddressBean implements Address {
147 private String localPart;
148
149 private String domain;
150
151 public AddressBean() {
152 localPart = "";
153 domain = "";
154 }
155
156 public String getDomain() {
157 return domain;
158 }
159
160 public void setDomain(String domain) {
161 this.domain = domain;
162 }
163
164 public String getLocalPart() {
165 return localPart;
166 }
167
168 public void setLocalPart(String localPart) {
169 this.localPart = localPart;
170 }
171 }
172 }