comparison src/nabble/model/ModelHome.java @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children cc5b7d515580
comparison
equal deleted inserted replaced
-1:000000000000 0:7ecd1a4ef557
1 /*
2
3 Copyright (C) 2003 Franklin Schmidt <frank@gustos.com>
4
5 */
6
7 package nabble.model;
8
9 import fschmidt.db.DbDatabase;
10 import fschmidt.db.Listener;
11 import fschmidt.util.mail.Mail;
12 import fschmidt.util.mail.MailException;
13 import fschmidt.util.mail.MailHome;
14 import nabble.modules.ModuleManager;
15 import nabble.naml.compiler.Template;
16 import nabble.naml.compiler.TemplatePrintWriter;
17 import nabble.naml.namespaces.BasicNamespace;
18 import nabble.view.web.template.NabbleNamespace;
19 import nabble.view.web.template.NodePageNamespace;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
22
23 import java.io.File;
24 import java.io.Serializable;
25 import java.lang.reflect.Constructor;
26 import java.lang.reflect.InvocationTargetException;
27 import java.sql.ResultSet;
28 import java.sql.SQLException;
29 import java.util.ArrayList;
30 import java.util.Collections;
31 import java.util.HashSet;
32 import java.util.List;
33 import java.util.Map;
34 import java.util.Set;
35
36
37 public final class ModelHome {
38 private ModelHome() {} // never
39
40 private static final Logger logger = LoggerFactory.getLogger(ModelHome.class);
41
42 public static final String AVATAR_SMALL = "avatar24.png";
43 public static final String AVATAR_BIG = "avatar100.png";
44
45 public static volatile long lastDigestRun = System.currentTimeMillis();
46
47 public static Site newSite(String type,String subject,String message,Message.Format msgFmt,String email,String username)
48 throws ModelException
49 {
50 return DbSiteCreator.newSite(type,subject,message,msgFmt,email,username);
51 }
52
53 public static Site restoreSiteToOldId(String filename) {
54 return DbSiteCreator.restoreSiteToOldId(new File(filename));
55 }
56
57 public static Site restoreSiteToNewId(String filename) {
58 return DbSiteCreator.restoreSiteToNewId(new File(filename));
59 }
60
61 public static void validateEmail(String email) throws ModelException {
62 UserImpl.validateEmail(email);
63 }
64
65 public static String hideEmail(String emailTo) {
66 return "[hidden email]";
67 }
68
69 public static String hideAllEmails(String txt) {
70 return MessageUtils.hideAllEmails(txt);
71 }
72
73 public static Site getSite(long id) {
74 SiteKey siteKey = SiteKey.getInstance(id);
75 if( siteKey.siteGlobal() == null )
76 return null;
77 return siteKey.siteGlobal().site();
78 }
79 /*
80 // unfiltered, Site.getUser() is preferred
81 public static User getUserFromId(long id) {
82 return UserImpl.getUser(id);
83 }
84 */
85 public static String getNodeReplyAddress(Node node, User user) {
86 return PostByEmail.getMailAddress(user, node);
87 }
88
89 public static String getUserBouncesAddress(User user) {
90 return PostByEmail.getBouncesAddress(user);
91 }
92
93 public static void setNodeHeaders(Mail mail, Node node) {
94 MailSubsystem.setHeaders(mail, (NodeImpl) node);
95 }
96
97 public static void setRemoteAddr(Site site, String removeAddr) {
98 ((SiteImpl) site).siteGlobal().setRemoteAddr(removeAddr);
99 }
100
101 // force these classes to add their listeners first
102 static {
103 Init.modelHomeStarted = true;
104 NodeImpl.nop();
105 Lucene.nop();
106 DailyNumber.nop();
107 FileUpload.nop();
108 nabble.view.lib.MyJtpServlet.nop();
109 SubscriptionImpl.nop();
110 ModuleManager.nop();
111 }
112
113 private static Set<Node> doneSet(Map<String,Object> transMap) {
114 if( transMap==null )
115 return new HashSet<Node>();
116 @SuppressWarnings("unchecked")
117 Set<Node> done = (Set<Node>)transMap.get("doneNodes");
118 if( done == null ) {
119 done = new HashSet<Node>();
120 transMap.put("doneNodes",done);
121 }
122 return done;
123 }
124
125 public static void addDescendantChangeListener(final Listener<Node> listener) {
126 Listener<Node> myListener = new Listener<Node>() {
127 public void event(final Node node) {
128 if( ModelHome.insideImportProcedure.get() )
129 return;
130 DbDatabase db = node.getSite().getDb();
131 final Map<String,Object> transMap = db.transactionMap();
132 db.runAfterCommit(new Runnable(){public void run(){
133 Set<Node> done = doneSet(transMap);
134 for( Node n : node.getAncestors() ) {
135 if( done.add(n) )
136 listener.event(n);
137 }
138 }});
139 }
140 };
141 NodeImpl.childChangeListeners.add(myListener);
142 NodeImpl.addPostUpdateListener(myListener);
143 NodeImpl.addPostDeleteListener(myListener);
144 NodeImpl.addPostInsertListener(new Listener<Node>() {
145 public void event(final Node node) {
146 DbDatabase db = node.getSite().getDb();
147 final Map<String,Object> transMap = db.transactionMap();
148 db.runAfterCommit(new Runnable(){public void run(){
149 Set<Node> done = doneSet(transMap);
150 NodeIterator<? extends Node> ancestors = node.getAncestors();
151 done.add(ancestors.next()); // skip self
152 for( Node n : ancestors ) {
153 if( done.add(n) )
154 listener.event(n);
155 }
156 }});
157 }
158 });
159 }
160
161 public static void addSiteChangeListener(Listener<Site> listener) {
162 SiteImpl.addChangeListener(listener);
163 }
164
165 public static void addSitePreChangeListener(Listener<Site> listener) {
166 SiteImpl.addPreChangeListener(listener);
167 }
168
169 public static void addNodeChangeListener(final Listener<Node> listener) {
170 NodeImpl.addChangeListener(listener);
171 }
172
173 public static void addNodeInsertListener(final Listener<Node> listener) {
174 NodeImpl.addPostInsertListener(listener);
175 }
176
177 public static void addNodeDeleteListener(final Listener<Node> nodeDeleteListener) {
178 NodeImpl.addPostDeleteListener(nodeDeleteListener);
179 }
180
181 public static void addNodePreUpdatedListener(final Listener<Node> listener) {
182 NodeImpl.preUpdateListeners.add(listener);
183 }
184
185 public static void addGotParentListener(Listener<Node> listener) {
186 NodeImpl.gotParentListeners.add(listener);
187 }
188
189 public static void addUserInsertListener(final Listener<User> listener) {
190 UserImpl.addPostInsertListener(listener);
191 }
192
193 public static void addUserPreUpdatedListener(final Listener<User> listener) {
194 UserImpl.preUpdateListeners.add(listener);
195 }
196
197 static ThreadLocal<Boolean> insideImportProcedure = new ThreadLocal<Boolean>() {
198 protected Boolean initialValue() {
199 return Boolean.FALSE;
200 }
201 };
202
203 public static void beginImport() {
204 insideImportProcedure.set(true);
205 }
206
207 public static void endImport() {
208 insideImportProcedure.set(false);
209 }
210 /*
211 static {
212 NodeImpl.addPostInsertListener(new Listener<NodeImpl>() {
213 public void event(final NodeImpl post) {
214 if (insideImportProcedure.get())
215 return;
216 Node.MailToList mailToList = post.getMailToList();
217 if( mailToList==null )
218 return;
219 MailingList mailingList = post.getAssociatedMailingListImpl();
220 if( mailingList == null )
221 return;
222 Template template = post.getSite().getTemplate( "mail to list",
223 BasicNamespace.class, NabbleNamespace.class, NodePageNamespace.class
224 );
225 template.run( TemplatePrintWriter.NULL, Collections.<String,Object>emptyMap(),
226 new BasicNamespace(template),
227 new NabbleNamespace(post.getSite()),
228 new NodePageNamespace(post)
229 );
230 }
231 });
232 }
233 */
234
235 public static void preloadMessages(List<Node> nodes) {
236 NodeImpl.preloadMessages(nodes);
237 }
238
239 public static String assignmentCondition(User user,Integer priority) {
240 if( user==null && priority==null )
241 return null;
242 StringBuilder buf = new StringBuilder();
243 if( user != null ) {
244 buf.append( "assigned_user=" ).append( user.getId() );
245 }
246 if( priority != null ) {
247 if( buf.length() > 0 )
248 buf.append( " and " );
249 buf.append( "assigned_priority=" ).append( priority );
250 }
251 return buf.toString();
252 }
253
254
255
256 public static Long getSiteIdFromDomain(String customDomain) {
257 return SiteGlobal.getSiteIdFromDomain(customDomain);
258 }
259
260
261 public static final String noReply = "no-reply@nabble.com";
262 static final String bounces = "bounces@n2.nabble.com";
263
264 public static void send(Mail mail) throws MailException {
265 if( mail.getFrom().getAddrSpec().equals(noReply) ) {
266 MailHome.getDefaultSmtpServer().sendFrom(mail, bounces);
267 } else {
268 MailHome.getDefaultSmtpServer().send(mail);
269 }
270 }
271
272 public static void send(Mail mail, String smtpFrom) throws MailException {
273 if( mail.getFrom().getAddrSpec().equals(noReply) ) {
274 MailHome.getDefaultSmtpServer().sendFrom(mail, bounces);
275 } else {
276 MailHome.getDefaultSmtpServer().sendFrom(mail, smtpFrom);
277 }
278 }
279
280
281 public static <S,T> ExtensionFactory<S,T> standardExtensionFactory(final String name,final Class<S> sourceClass,final Class<T> extensionClass) {
282 return new ExtensionFactory<S,T>() {
283
284 public String getName() {
285 return name;
286 }
287
288 public Class<T> extensionClass() {
289 return extensionClass;
290 }
291
292 public T construct(S source) {
293 try {
294 Constructor<T> constructor = extensionClass.getConstructor(sourceClass);
295 constructor.setAccessible(true);
296 return constructor.newInstance(source);
297 } catch(NoSuchMethodException e) {
298 throw new RuntimeException(e);
299 } catch(InstantiationException e) {
300 throw new RuntimeException(e);
301 } catch(IllegalAccessException e) {
302 throw new RuntimeException(e);
303 } catch(InvocationTargetException e) {
304 Throwable cause = e.getCause();
305 if( cause instanceof Error )
306 throw (Error)cause;
307 if( cause instanceof RuntimeException )
308 throw (RuntimeException)cause;
309 throw new RuntimeException(e);
310 }
311 }
312
313 public T construct(S source,ResultSet rs) {
314 return construct(source);
315 }
316
317 public Serializable getExportData(S source) {
318 return null;
319 }
320
321 public void saveExportData(S source,Serializable data) {
322 throw new RuntimeException();
323 }
324 };
325 }
326
327 public static <T> void addSiteExtensionFactory(ExtensionFactory<Site,T> factory) {
328 SiteImpl.addExtensionFactory(factory);
329 }
330
331 public static <T> void addNodeExtensionFactory(ExtensionFactory<Node,T> factory) {
332 NodeImpl.addExtensionFactory(factory);
333 }
334
335 public static <T> void addUserExtensionFactory(ExtensionFactory<User,T> factory) {
336 UserImpl.addExtensionFactory(factory);
337 }
338
339
340 public static List<Site> getSitesForTask(String task) throws SQLException {
341 List<Site> sites = new ArrayList<Site>();
342 for( SiteKey siteKey : SiteKey.getSiteKeys(task) ) {
343 try {
344 sites.add( siteKey.site() );
345 } catch(UpdatingException e) {} // skip it
346 }
347 return sites;
348 }
349
350 }