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.kernel.scheduler.messaging;
016    
017    import com.liferay.portal.kernel.messaging.DestinationNames;
018    import com.liferay.portal.kernel.messaging.Message;
019    import com.liferay.portal.kernel.messaging.MessageBusUtil;
020    import com.liferay.portal.kernel.messaging.MessageListener;
021    import com.liferay.portal.kernel.messaging.MessageListenerException;
022    import com.liferay.portal.kernel.scheduler.JobState;
023    import com.liferay.portal.kernel.scheduler.SchedulerEngine;
024    import com.liferay.portal.kernel.scheduler.SchedulerEngineUtil;
025    import com.liferay.portal.kernel.scheduler.TriggerState;
026    import com.liferay.portal.kernel.util.GetterUtil;
027    import com.liferay.portal.kernel.util.StringPool;
028    import com.liferay.portal.kernel.uuid.PortalUUIDUtil;
029    
030    import java.util.Date;
031    
032    /**
033     * @author Shuyang Zhou
034     */
035    public class SchedulerEventMessageListenerWrapper implements MessageListener {
036    
037            public void afterPropertiesSet() {
038                    String jobName = _className;
039    
040                    if (_className.length() > SchedulerEngine.JOB_NAME_MAX_LENGTH) {
041                            jobName = _className.substring(
042                                    0, SchedulerEngine.JOB_NAME_MAX_LENGTH);
043                    }
044    
045                    String groupName = _className;
046    
047                    if (_className.length() > SchedulerEngine.GROUP_NAME_MAX_LENGTH) {
048                            groupName = _className.substring(
049                                    0, SchedulerEngine.GROUP_NAME_MAX_LENGTH);
050                    }
051    
052                    _key = jobName.concat(StringPool.PERIOD).concat(groupName);
053    
054                    if (_messageListenerUUID == null) {
055                            _messageListenerUUID = PortalUUIDUtil.generate();
056                    }
057            }
058    
059            public String getMessageListenerUUID() {
060                    return _messageListenerUUID;
061            }
062    
063            public void receive(Message message) throws MessageListenerException {
064                    String destinationName = GetterUtil.getString(
065                            message.getString(SchedulerEngine.DESTINATION_NAME));
066    
067                    if (destinationName.equals(DestinationNames.SCHEDULER_DISPATCH)) {
068                            String receiverKey = GetterUtil.getString(
069                                    message.getString(SchedulerEngine.RECEIVER_KEY));
070    
071                            if (!receiverKey.equals(_key)) {
072                                    return;
073                            }
074                    }
075    
076                    try{
077                            _messageListener.receive(message);
078                    }
079                    catch (Exception e) {
080                            handleException(message, e);
081    
082                            if (e instanceof MessageListenerException) {
083                                    throw (MessageListenerException)e;
084                            }
085                            else {
086                                    throw new MessageListenerException(e);
087                            }
088                    }
089                    finally {
090                            TriggerState triggerState = null;
091    
092                            if (message.getBoolean(SchedulerEngine.DISABLE)) {
093                                    triggerState = TriggerState.COMPLETE;
094    
095                                    if (destinationName.equals(
096                                                    DestinationNames.SCHEDULER_DISPATCH)) {
097    
098                                            MessageBusUtil.unregisterMessageListener(
099                                                    destinationName, this);
100                                    }
101                            }
102                            else {
103                                    triggerState = TriggerState.NORMAL;
104                            }
105    
106                            try {
107                                    SchedulerEngineUtil.auditSchedulerJobs(message, triggerState);
108                            }
109                            catch (Exception e) {
110                                    throw new MessageListenerException(e);
111                            }
112                    }
113            }
114    
115            public void setClassName(String className) {
116                    _className = className;
117            }
118    
119            public void setMessageListener(MessageListener messageListener) {
120                    _messageListener = messageListener;
121            }
122    
123            public void setMessageListenerUUID(String messageListenerUUID) {
124                    _messageListenerUUID = messageListenerUUID;
125            }
126    
127            protected void handleException(Message message, Exception exception) {
128                    JobState jobState = (JobState)message.get(SchedulerEngine.JOB_STATE);
129    
130                    if (jobState != null) {
131                            jobState.addException(exception, new Date());
132                    }
133            }
134    
135            private String _className;
136            private String _key;
137            private MessageListener _messageListener;
138            private String _messageListenerUUID;
139    
140    }