001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.pop;
016    
017    import com.liferay.portal.kernel.log.Log;
018    import com.liferay.portal.kernel.log.LogFactoryUtil;
019    import com.liferay.portal.kernel.pop.MessageListener;
020    import com.liferay.portal.kernel.scheduler.SchedulerEngineUtil;
021    import com.liferay.portal.kernel.scheduler.SchedulerEntry;
022    import com.liferay.portal.kernel.scheduler.SchedulerEntryImpl;
023    import com.liferay.portal.kernel.scheduler.StorageType;
024    import com.liferay.portal.kernel.scheduler.TimeUnit;
025    import com.liferay.portal.kernel.scheduler.TriggerType;
026    import com.liferay.portal.kernel.util.PortalClassLoaderUtil;
027    import com.liferay.portal.kernel.util.UnmodifiableList;
028    import com.liferay.portal.pop.messaging.POPNotificationsMessageListener;
029    import com.liferay.portal.util.PropsValues;
030    
031    import java.util.ArrayList;
032    import java.util.Iterator;
033    import java.util.List;
034    
035    /**
036     * @author Brian Wing Shun Chan
037     */
038    public class POPServerUtil {
039    
040            public static void addListener(MessageListener listener)
041                    throws Exception {
042    
043                    _instance._addListener(listener);
044            }
045    
046            public static void deleteListener(MessageListener listener)
047                    throws Exception {
048    
049                    _instance._deleteListener(listener);
050            }
051    
052            public static List<MessageListener> getListeners() throws Exception {
053                    return _instance._getListeners();
054            }
055    
056            public static void start() {
057                    _instance._start();
058            }
059    
060            private POPServerUtil() {
061            }
062    
063            private void _addListener(MessageListener listener) {
064                    if (listener == null) {
065                            if (_log.isDebugEnabled()) {
066                                    _log.debug("Do not add null listener");
067                            }
068    
069                            return;
070                    }
071    
072                    if (_log.isDebugEnabled()) {
073                            _log.debug("Add listener " + listener.getClass().getName());
074                    }
075    
076                    MessageListenerWrapper messageListenerWrapper =
077                            new MessageListenerWrapper(listener);
078    
079                    _deleteListener(messageListenerWrapper);
080    
081                    _listeners.add(messageListenerWrapper);
082    
083                    if (_log.isDebugEnabled()) {
084                            _log.debug("Listeners size " + _listeners.size());
085                    }
086            }
087    
088            private void _deleteListener(MessageListener listener) {
089                    if (listener == null) {
090                            if (_log.isDebugEnabled()) {
091                                    _log.debug("Do not delete null listener");
092                            }
093    
094                            return;
095                    }
096    
097                    if (_log.isDebugEnabled()) {
098                            _log.debug("Delete listener " + listener.getClass().getName());
099                    }
100    
101                    MessageListenerWrapper messageListenerWrapper =
102                            new MessageListenerWrapper(listener);
103    
104                    _deleteListener(messageListenerWrapper);
105    
106                    if (_log.isDebugEnabled()) {
107                            _log.debug("Listeners size " + _listeners.size());
108                    }
109            }
110    
111            private void _deleteListener(MessageListenerWrapper listener) {
112                    Iterator<MessageListener> itr = _listeners.iterator();
113    
114                    while (itr.hasNext()) {
115                            MessageListenerWrapper curListener =
116                                    (MessageListenerWrapper)itr.next();
117    
118                            if (curListener.equals(listener)) {
119                                    itr.remove();
120                            }
121                    }
122            }
123    
124            private List<MessageListener> _getListeners() {
125                    if (_log.isDebugEnabled()) {
126                            _log.debug("Listeners size " + _listeners.size());
127                    }
128    
129                    return new UnmodifiableList<MessageListener>(_listeners);
130            }
131    
132            private void _start() {
133                    if (_log.isDebugEnabled()) {
134                            _log.debug("Start");
135                    }
136    
137                    try {
138                            SchedulerEntry schedulerEntry = new SchedulerEntryImpl();
139    
140                            schedulerEntry.setEventListenerClass(
141                                    POPNotificationsMessageListener.class.getName());
142                            schedulerEntry.setTimeUnit(TimeUnit.MINUTE);
143                            schedulerEntry.setTriggerType(TriggerType.SIMPLE);
144                            schedulerEntry.setTriggerValue(
145                                    PropsValues.POP_SERVER_NOTIFICATIONS_INTERVAL);
146    
147                            SchedulerEngineUtil.schedule(
148                                    schedulerEntry, StorageType.MEMORY_CLUSTERED,
149                                    PortalClassLoaderUtil.getClassLoader(), 0);
150                    }
151                    catch (Exception e) {
152                            _log.error(e, e);
153                    }
154            }
155    
156            private static Log _log = LogFactoryUtil.getLog(POPServerUtil.class);
157    
158            private static POPServerUtil _instance = new POPServerUtil();
159    
160            private List<MessageListener> _listeners = new ArrayList<MessageListener>();
161    
162    }