001    /**
002     * Copyright (c) 2000-present 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.kernel.messaging;
016    
017    import com.liferay.portal.kernel.concurrent.ConcurrentHashSet;
018    import com.liferay.portal.kernel.util.StringPool;
019    import com.liferay.portal.kernel.util.Validator;
020    
021    import java.util.Collections;
022    import java.util.Set;
023    
024    import org.osgi.service.component.annotations.Activate;
025    import org.osgi.service.component.annotations.Deactivate;
026    
027    /**
028     * @author Michael C. Han
029     * @author Shuyang Zhou
030     */
031    public abstract class BaseDestination implements Destination {
032    
033            @Override
034            public boolean addDestinationEventListener(
035                    DestinationEventListener destinationEventListener) {
036    
037                    return _destinationEventListeners.add(destinationEventListener);
038            }
039    
040            public void afterPropertiesSet() {
041                    if (Validator.isNull(name)) {
042                            throw new IllegalArgumentException("Name is null");
043                    }
044            }
045    
046            @Override
047            public void close() {
048                    close(false);
049            }
050    
051            @Override
052            public void close(boolean force) {
053            }
054    
055            @Override
056            public void copyDestinationEventListeners(Destination destination) {
057                    for (DestinationEventListener destinationEventListener :
058                                    _destinationEventListeners) {
059    
060                            destination.addDestinationEventListener(destinationEventListener);
061                    }
062            }
063    
064            @Override
065            public void copyMessageListeners(Destination destination) {
066                    for (MessageListener messageListener : messageListeners) {
067                            InvokerMessageListener invokerMessageListener =
068                                    (InvokerMessageListener)messageListener;
069    
070                            destination.register(
071                                    invokerMessageListener.getMessageListener(),
072                                    invokerMessageListener.getClassLoader());
073                    }
074            }
075    
076            @Override
077            public void destroy() {
078                    close(true);
079    
080                    removeDestinationEventListeners();
081    
082                    unregisterMessageListeners();
083            }
084    
085            @Override
086            public DestinationStatistics getDestinationStatistics() {
087                    throw new UnsupportedOperationException();
088            }
089    
090            @Override
091            public int getMessageListenerCount() {
092                    return messageListeners.size();
093            }
094    
095            @Override
096            public Set<MessageListener> getMessageListeners() {
097                    return Collections.unmodifiableSet(messageListeners);
098            }
099    
100            @Override
101            public String getName() {
102                    return name;
103            }
104    
105            @Override
106            public boolean isRegistered() {
107                    if (getMessageListenerCount() > 0) {
108                            return true;
109                    }
110                    else {
111                            return false;
112                    }
113            }
114    
115            @Override
116            public void open() {
117            }
118    
119            @Override
120            public boolean register(MessageListener messageListener) {
121                    InvokerMessageListener invokerMessageListener =
122                            new InvokerMessageListener(messageListener);
123    
124                    return registerMessageListener(invokerMessageListener);
125            }
126    
127            @Override
128            public boolean register(
129                    MessageListener messageListener, ClassLoader classloader) {
130    
131                    InvokerMessageListener invokerMessageListener =
132                            new InvokerMessageListener(messageListener, classloader);
133    
134                    return registerMessageListener(invokerMessageListener);
135            }
136    
137            @Override
138            public boolean removeDestinationEventListener(
139                    DestinationEventListener destinationEventListener) {
140    
141                    return _destinationEventListeners.remove(destinationEventListener);
142            }
143    
144            @Override
145            public void removeDestinationEventListeners() {
146                    _destinationEventListeners.clear();
147            }
148    
149            @Override
150            public void send(Message message) {
151                    throw new UnsupportedOperationException();
152            }
153    
154            public void setName(String name) {
155                    this.name = name;
156            }
157    
158            @Override
159            public boolean unregister(MessageListener messageListener) {
160                    InvokerMessageListener invokerMessageListener =
161                            new InvokerMessageListener(messageListener);
162    
163                    return unregisterMessageListener(invokerMessageListener);
164            }
165    
166            public boolean unregister(
167                    MessageListener messageListener, ClassLoader classloader) {
168    
169                    InvokerMessageListener invokerMessageListener =
170                            new InvokerMessageListener(messageListener, classloader);
171    
172                    return unregisterMessageListener(invokerMessageListener);
173            }
174    
175            @Override
176            public void unregisterMessageListeners() {
177                    for (MessageListener messageListener : messageListeners) {
178                            unregisterMessageListener((InvokerMessageListener)messageListener);
179                    }
180            }
181    
182            @Activate
183            protected void activate() {
184                    afterPropertiesSet();
185            }
186    
187            @Deactivate
188            protected void deactivate() {
189                    destroy();
190            }
191    
192            protected void fireMessageListenerRegisteredEvent(
193                    MessageListener messageListener) {
194    
195                    for (DestinationEventListener destinationEventListener :
196                                    _destinationEventListeners) {
197    
198                            destinationEventListener.messageListenerRegistered(
199                                    getName(), messageListener);
200                    }
201            }
202    
203            protected void fireMessageListenerUnregisteredEvent(
204                    MessageListener messageListener) {
205    
206                    for (DestinationEventListener listener : _destinationEventListeners) {
207                            listener.messageListenerUnregistered(getName(), messageListener);
208                    }
209            }
210    
211            protected boolean registerMessageListener(
212                    InvokerMessageListener invokerMessageListener) {
213    
214                    boolean registered = messageListeners.add(invokerMessageListener);
215    
216                    if (registered) {
217                            fireMessageListenerRegisteredEvent(
218                                    invokerMessageListener.getMessageListener());
219                    }
220    
221                    return registered;
222            }
223    
224            protected boolean unregisterMessageListener(
225                    InvokerMessageListener invokerMessageListener) {
226    
227                    boolean unregistered = messageListeners.remove(invokerMessageListener);
228    
229                    if (unregistered) {
230                            fireMessageListenerUnregisteredEvent(
231                                    invokerMessageListener.getMessageListener());
232                    }
233    
234                    return unregistered;
235            }
236    
237            protected Set<MessageListener> messageListeners = new ConcurrentHashSet<>();
238            protected String name = StringPool.BLANK;
239    
240            private final Set<DestinationEventListener> _destinationEventListeners =
241                    new ConcurrentHashSet<>();
242    
243    }