View Javadoc

1   /****************************************************************
2    * Licensed to the Apache Software Foundation (ASF) under one   *
3    * or more contributor license agreements.  See the NOTICE file *
4    * distributed with this work for additional information        *
5    * regarding copyright ownership.  The ASF licenses this file   *
6    * to you under the Apache License, Version 2.0 (the            *
7    * "License"); you may not use this file except in compliance   *
8    * with the License.  You may obtain a copy of the License at   *
9    *                                                              *
10   *   http://www.apache.org/licenses/LICENSE-2.0                 *
11   *                                                              *
12   * Unless required by applicable law or agreed to in writing,   *
13   * software distributed under the License is distributed on an  *
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
15   * KIND, either express or implied.  See the License for the    *
16   * specific language governing permissions and limitations      *
17   * under the License.                                           *
18   ****************************************************************/
19  
20  
21  
22  package org.apache.james.transport.mailets;
23  
24  import org.apache.avalon.framework.service.ServiceException;
25  import org.apache.avalon.framework.service.ServiceManager;
26  import org.apache.james.Constants;
27  import org.apache.james.api.user.UsersRepository;
28  import org.apache.james.api.user.UsersStore;
29  import org.apache.mailet.MailAddress;
30  
31  import javax.mail.internet.ParseException;
32  import java.util.Collection;
33  import java.util.Iterator;
34  import java.util.ArrayList;
35  
36  /**
37   * MailingListServer capability.
38   * 
39   * <p>Requires a configuration element in the config.xml file of the form:
40   * <br>  &lt;mailet match="RecipientIs=LIST-ADDRESS" class="AvalonListserv"&gt;
41   * <br>    &lt;repositoryName&gt;LIST-NAME&lt;/repositoryName&gt;
42   * <br>    &lt;membersonly&gt;[true|false]&lt;/membersonly&gt;
43   * <br>    &lt;attachmentsallowed&gt;[true|false]&lt;/attachmentsallowed&gt;
44   * <br>    &lt;replytolist&gt;[true|false]&lt;/replytolist&gt;
45   * <br>    &lt;autobracket&gt;[true|false]&lt;/autobracket&gt;
46   * <br>    &lt;subjectprefix [xml:space="preserve"]&gt;SUBJECT-PREFIX&lt;/subjectprefix&gt;
47   * <br>  &lt;/mailet&gt;
48   * <p>repositoryName - the name of a user repository configured in the
49   * UsersStore block, e.g.,
50   * <br>  &lt;repository name="list-name" class="org.apache.james.userrepository.ListUsersJdbcRepository" destinationURL="db://maildb/lists/list-name"&gt;
51   * <br>    &lt;sqlFile&gt;file://conf/sqlResources.xml&lt;/sqlFile&gt;
52   * <br>  &lt;/repository&gt;
53   * <p>or
54   * <br>  &lt;repository name="list-name" class="org.apache.james.userrepository.UsersFileRepository"&gt;
55   * <br>    &lt;destination URL="file://var/lists/list-name/"/&gt;
56   * <br>  &lt;/repository&gt;
57   * <p>membersonly - if true only members can post to the list
58   * <p>attachmentsallowed - if false attachments are not allowed
59   * <p>replytolist - if true, replies go back to the list address; if
60   * false they go to the sender.
61   * <p>subjectprefix - a prefix that will be inserted at the front of
62   * the subject.  If autobracketing is disabled (see below), the
63   * xml:space="preserve" attribute can be used to precisely control the
64   * prefix.
65   * <p>autobracket - if true the subject prefix will be rendered as
66   * "[PREFIX] ", if false, the prefix will be used literally.
67   *
68   * @version This is $Revision: 684466 $
69   */
70  public class AvalonListserv extends GenericListserv {
71  
72      /**
73       * Whether only members can post to the list
74       */
75      protected boolean membersOnly = false;
76  
77      /**
78       * Whether attachments can be sent to the list
79       */
80      protected boolean attachmentsAllowed = true;
81  
82      /**
83       * Whether the reply-to header should be set to the list address
84       */
85      protected boolean replyToList = true;
86  
87      /**
88       * A String to prepend to the subject of the message when it
89       * is sent to the list
90       */
91      protected String subjectPrefix = null;
92  
93      /**
94       * Whether the subject prefix should be bracketed with '[' and ']'
95       */
96      protected boolean autoBracket = true;
97  
98      /**
99       * The repository containing the users on this list
100      */
101     private UsersRepository members;
102 
103     /**
104      * Initialize the mailet
105      */
106     public void init() {
107         try {
108             membersOnly = new Boolean(getInitParameter("membersonly")).booleanValue();
109         } catch (Exception e) {
110             // Ignore any exceptions, default to false
111         }
112         try {
113             attachmentsAllowed = new Boolean(getInitParameter("attachmentsallowed")).booleanValue();
114         } catch (Exception e) {
115             // Ignore any exceptions, default to true
116         }
117         try {
118             replyToList = new Boolean(getInitParameter("replytolist")).booleanValue();
119         } catch (Exception e) {
120             // Ignore any exceptions, default to true
121         }
122         subjectPrefix = getInitParameter("subjectprefix");
123 
124         try {
125             autoBracket = new Boolean(getInitParameter("autobracket")).booleanValue();
126         } catch (Exception e) {
127             // Ignore any exceptions, default to true
128         }
129 
130         ServiceManager compMgr = (ServiceManager)getMailetContext().getAttribute(Constants.AVALON_COMPONENT_MANAGER);
131         try {
132             UsersStore usersStore = (UsersStore)compMgr.lookup(UsersStore.ROLE);
133             String repName = getInitParameter("repositoryName");
134 
135             members = (UsersRepository)usersStore.getRepository( repName );
136         } catch (ServiceException cnfe) {
137             log("Failed to retrieve Store component:" + cnfe.getMessage());
138         } catch (Exception e) {
139             log("Failed to retrieve Store component:" + e.getMessage());
140         }
141     }
142 
143     public Collection getMembers() throws ParseException {
144         Collection reply = new ArrayList();
145         for (Iterator it = members.list(); it.hasNext(); ) {
146             String member = it.next().toString();
147             try {
148                 reply.add(new MailAddress(member));
149             }
150             catch(Exception e) {
151                 // Handle an invalid subscriber address by logging it and
152                 // proceeding to the next member.
153                 StringBuffer logBuffer =
154                     new StringBuffer(1024)
155                             .append("Invalid subscriber address: ")
156                             .append(member)
157                             .append(" caused: ")
158                             .append(e.getMessage());
159                 log(logBuffer.toString());
160             }
161         }
162         return reply;
163     }
164 
165     /**
166      * Get whether posting to this list is restricted to list members
167      *
168      * @return whether posting to this list is restricted to list members
169      */
170     public boolean isMembersOnly() {
171         return membersOnly;
172     }
173 
174     /**
175      * Get whether attachments can be sent to this list
176      *
177      * @return whether attachments can be sent to this list
178      */
179     public boolean isAttachmentsAllowed() {
180         return attachmentsAllowed;
181     }
182 
183     /**
184      * Get whether the reply-to header for messages sent to this list
185      * will be replaced with the list address
186      *
187      * @return whether replies to messages posted to this list will go to the entire list
188      */
189     public boolean isReplyToList() {
190         return replyToList;
191     }
192 
193     /**
194      * Get the prefix prepended to the subject line
195      *
196      * @return whether the prefix for subjects on this list will be bracketed.
197      */
198     public String getSubjectPrefix() {
199         return subjectPrefix;
200     }
201 
202     /**
203      * Return whether the prefix for subjects on this list will be bracketed.
204      *
205      * @return whether the prefix for subjects on this list will be bracketed.
206      */
207     public boolean isPrefixAutoBracketed() {
208         return autoBracket;
209     }
210 
211     /**
212      * Return a string describing this mailet.
213      *
214      * @return a string describing this mailet
215      */
216     public String getMailetInfo() {
217         return "AvalonListserv Mailet";
218     }
219 }