001    /**
002     * Copyright (c) 2000-2010 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.TimeUnit;
024    import com.liferay.portal.kernel.scheduler.TriggerType;
025    import com.liferay.portal.kernel.util.PortalClassLoaderUtil;
026    import com.liferay.portal.kernel.util.UnmodifiableList;
027    import com.liferay.portal.pop.messaging.POPNotificationsMessageListener;
028    import com.liferay.portal.util.PropsValues;
029    
030    import java.util.ArrayList;
031    import java.util.Iterator;
032    import java.util.List;
033    
034    /**
035     * @author Brian Wing Shun Chan
036     */
037    public class POPServerUtil {
038    
039            public static void addListener(MessageListener listener)
040                    throws Exception {
041    
042                    _instance._addListener(listener);
043            }
044    
045            public static void deleteListener(MessageListener listener)
046                    throws Exception {
047    
048                    _instance._deleteListener(listener);
049            }
050    
051            public static List<MessageListener> getListeners() throws Exception {
052                    return _instance._getListeners();
053            }
054    
055            public static void start() {
056                    _instance._start();
057            }
058    
059            public static void stop() {
060                    _instance._stop();
061            }
062    
063            private POPServerUtil() {
064            }
065    
066            private void _addListener(MessageListener listener) {
067                    if (listener == null) {
068                            if (_log.isDebugEnabled()) {
069                                    _log.debug("Do not add null listener");
070                            }
071    
072                            return;
073                    }
074    
075                    if (_log.isDebugEnabled()) {
076                            _log.debug("Add listener " + listener.getClass().getName());
077                    }
078    
079                    MessageListenerWrapper messageListenerWrapper =
080                            new MessageListenerWrapper(listener);
081    
082                    _deleteListener(messageListenerWrapper);
083    
084                    _listeners.add(messageListenerWrapper);
085    
086                    if (_log.isDebugEnabled()) {
087                            _log.debug("Listeners size " + _listeners.size());
088                    }
089            }
090    
091            private void _deleteListener(MessageListenerWrapper listener) {
092                    Iterator<MessageListener> itr = _listeners.iterator();
093    
094                    while (itr.hasNext()) {
095                            MessageListenerWrapper curListener =
096                                    (MessageListenerWrapper)itr.next();
097    
098                            if (curListener.equals(listener)) {
099                                    itr.remove();
100                            }
101                    }
102            }
103    
104            private void _deleteListener(MessageListener listener) {
105                    if (listener == null) {
106                            if (_log.isDebugEnabled()) {
107                                    _log.debug("Do not delete null listener");
108                            }
109    
110                            return;
111                    }
112    
113                    if (_log.isDebugEnabled()) {
114                            _log.debug("Delete listener " + listener.getClass().getName());
115                    }
116    
117                    MessageListenerWrapper messageListenerWrapper =
118                            new MessageListenerWrapper(listener);
119    
120                    _deleteListener(messageListenerWrapper);
121    
122                    if (_log.isDebugEnabled()) {
123                            _log.debug("Listeners size " + _listeners.size());
124                    }
125            }
126    
127            private List<MessageListener> _getListeners() {
128                    if (_log.isDebugEnabled()) {
129                            _log.debug("Listeners size " + _listeners.size());
130                    }
131    
132                    return new UnmodifiableList<MessageListener>(_listeners);
133            }
134    
135            private void _start() {
136                    if (_log.isDebugEnabled()) {
137                            _log.debug("Start");
138                    }
139    
140                    try {
141                            _schedulerEntry = new SchedulerEntryImpl();
142    
143                            _schedulerEntry.setEventListenerClass(
144                                    POPNotificationsMessageListener.class.getName());
145                            _schedulerEntry.setTimeUnit(TimeUnit.MINUTE);
146                            _schedulerEntry.setTriggerType(TriggerType.SIMPLE);
147                            _schedulerEntry.setTriggerValue(
148                                    PropsValues.POP_SERVER_NOTIFICATIONS_INTERVAL);
149    
150                            SchedulerEngineUtil.schedule(
151                                    _schedulerEntry, PortalClassLoaderUtil.getClassLoader());
152                    }
153                    catch (Exception e) {
154                            _log.error(e, e);
155                    }
156            }
157    
158            private void _stop() {
159                    if (_log.isDebugEnabled()) {
160                            _log.debug("Stop");
161                    }
162    
163                    try {
164                            if (_schedulerEntry != null) {
165                                    SchedulerEngineUtil.unschedule(_schedulerEntry);
166                            }
167                    }
168                    catch (Exception e) {
169                            _log.error(e, e);
170                    }
171            }
172    
173            private static Log _log = LogFactoryUtil.getLog(POPServerUtil.class);
174    
175            private static POPServerUtil _instance = new POPServerUtil();
176    
177            private List<MessageListener> _listeners = new ArrayList<MessageListener>();
178            private SchedulerEntry _schedulerEntry;
179    
180    }