001/**
002 * Copyright 2005-2016 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.ksb.messaging;
017
018import java.sql.Timestamp;
019
020import javax.persistence.Column;
021import javax.persistence.Entity;
022import javax.persistence.GeneratedValue;
023import javax.persistence.Id;
024import javax.persistence.NamedQueries;
025import javax.persistence.NamedQuery;
026import javax.persistence.Table;
027import javax.persistence.Transient;
028import javax.persistence.Version;
029
030import org.hibernate.annotations.GenericGenerator;
031import org.hibernate.annotations.Parameter;
032import org.kuali.rice.core.api.config.CoreConfigHelper;
033import org.kuali.rice.core.api.util.RiceUtilities;
034import org.kuali.rice.core.framework.persistence.jpa.OrmUtils;
035import org.kuali.rice.ksb.api.bus.ServiceConfiguration;
036import org.kuali.rice.ksb.api.messaging.AsynchronousCall;
037import org.kuali.rice.ksb.service.KSBServiceLocator;
038import org.kuali.rice.ksb.util.KSBConstants;
039
040/**
041 * A message which has been persisted to the data store.
042 *
043 * @author Kuali Rice Team (rice.collab@kuali.org)
044 */
045@Entity
046@Table(name="KRSB_MSG_QUE_T")
047//@Sequence(name="KRSB_MSG_QUE_S", property="routeQueueId")
048@NamedQueries({
049  @NamedQuery(name="PersistedMessage.FindAll", query="select pm from PersistedMessageBO pm"),
050  @NamedQuery(name="PersistedMessage.FindByServiceName", query="select pm from PersistedMessage pm where pm.serviceName = :serviceName and pm.methodName = :methodName"),
051  @NamedQuery(name="PersistedMessage.GetNextDocuments", query="select pm from PersistedMessage pm where pm.applicationId = :applicationId and pm.queueStatus <> :queueStatus and pm.ipNumber = :ipNumber order by queuePriority asc, routeQueueId asc, queueDate asc")
052})
053public class PersistedMessageBO implements PersistedMessage {
054
055        private static final long serialVersionUID = -7047766894738304195L;
056
057        @Id
058        @GeneratedValue(generator="KRSB_MSG_QUE_S")
059        @GenericGenerator(name="KRSB_MSG_QUE_S",strategy="org.hibernate.id.enhanced.SequenceStyleGenerator",parameters={
060                        @Parameter(name="sequence_name",value="KRSB_MSG_QUE_S"),
061                        @Parameter(name="value_column",value="id")
062        })
063        @Column(name="MSG_QUE_ID")
064        private Long routeQueueId;
065        @Column(name="PRIO")
066        private Integer queuePriority;
067        @Column(name="STAT_CD")
068        private String queueStatus;
069        @Column(name="DT")
070        private Timestamp queueDate;
071        @Column(name="EXP_DT")
072        private Timestamp expirationDate;
073        @Column(name="RTRY_CNT")
074        private Integer retryCount;
075        @Version
076        @Column(name="VER_NBR")
077        private Integer lockVerNbr;
078    @Column(name="IP_NBR")
079        private String ipNumber;
080    @Column(name="SVC_NM")
081        private String serviceName;
082    @Column(name="APPL_ID")
083        private String applicationId;
084    @Column(name="SVC_MTHD_NM")
085        private String methodName;
086    @Transient
087    private AsynchronousCall methodCall;
088    @Transient
089    private PersistedMessagePayload payload;
090    @Column(name="APP_VAL_ONE")
091        private String value1;
092    @Column(name="APP_VAL_TWO")
093        private String value2;
094    
095    public PersistedMessageBO() {
096        // default constructor
097    }
098
099    public static PersistedMessageBO buildMessage(ServiceConfiguration serviceConfiguration, AsynchronousCall methodCall) {
100        PersistedMessageBO message = new PersistedMessageBO();
101        message.setPayload(new PersistedMessagePayload(methodCall, message));
102        message.setIpNumber(RiceUtilities.getIpNumber());
103        message.setServiceName(serviceConfiguration.getServiceName().toString());
104        message.setQueueDate(new Timestamp(System.currentTimeMillis()));
105        if (serviceConfiguration.getPriority() == null) {
106            message.setQueuePriority(KSBConstants.ROUTE_QUEUE_DEFAULT_PRIORITY);
107        } else {
108            message.setQueuePriority(serviceConfiguration.getPriority());
109        }
110        message.setQueueStatus(KSBConstants.ROUTE_QUEUE_QUEUED);
111        message.setRetryCount(0);
112        if (serviceConfiguration.getMillisToLive() > 0) {
113            message.setExpirationDate(new Timestamp(System.currentTimeMillis() + serviceConfiguration.getMillisToLive()));
114        }
115        message.setApplicationId(CoreConfigHelper.getApplicationId());
116        message.setMethodName(methodCall.getMethodName());
117        return message;
118    }
119    
120    //@PrePersist
121    public void beforeInsert(){
122        OrmUtils.populateAutoIncValue(this, KSBServiceLocator.getMessageEntityManagerFactory().createEntityManager());
123    }
124    
125        @Override
126    public String getApplicationId() {
127                return this.applicationId;
128        }
129
130        public void setApplicationId(String applicationId) {
131                this.applicationId = applicationId;
132        }
133
134    @Override
135    public String getIpNumber() {
136        return this.ipNumber;
137    }
138    
139    public void setIpNumber(String ipNumber) {
140        this.ipNumber = ipNumber;
141    }
142    
143        @Override
144    public Timestamp getQueueDate() {
145                return this.queueDate;
146        }
147
148        @Override
149    public Integer getQueuePriority() {
150                return this.queuePriority;
151        }
152
153        @Override
154    public String getQueueStatus() {
155                return this.queueStatus;
156        }
157
158        @Override
159    public Integer getRetryCount() {
160                return this.retryCount;
161        }
162
163
164        public void setQueueDate(Timestamp timestamp) {
165            this.queueDate = timestamp;
166        }
167
168        public void setQueuePriority(Integer integer) {
169            this.queuePriority = integer;
170        }
171
172        public void setQueueStatus(String string) {
173            this.queueStatus = string;
174        }
175
176        public void setRetryCount(Integer integer) {
177            this.retryCount = integer;
178        }
179
180
181    public Integer getLockVerNbr() {
182        return this.lockVerNbr;
183    }
184    
185    public void setLockVerNbr(Integer lockVerNbr) {
186        this.lockVerNbr = lockVerNbr;
187    }
188    
189    @Override
190    public Long getRouteQueueId() {
191        return this.routeQueueId;
192    }
193    
194    public void setRouteQueueId(Long queueSequence) {
195        this.routeQueueId = queueSequence;
196    }
197    
198        @Override
199    public String getServiceName() {
200                return this.serviceName;
201        }
202
203        public void setServiceName(String serviceName) {
204                this.serviceName = serviceName;
205        }
206
207    public String toString() {
208        return "[RouteQueue: " + ", routeQueueId=" + this.routeQueueId + ", ipNumber=" + this.ipNumber 
209                + "applicationId=" + this.applicationId + ", serviceName=" + this.serviceName + ", methodName=" + methodName 
210                + ", queueStatus=" + this.queueStatus + ", queuePriority=" + this.queuePriority
211                + ", queueDate=" + this.queueDate + "]";
212    }
213
214        @Override
215    public AsynchronousCall getMethodCall() {
216                return this.methodCall;
217        }
218
219        public void setMethodCall(AsynchronousCall methodCall) {
220                this.methodCall = methodCall;
221        }
222
223        @Override
224    public String getMethodName() {
225                return this.methodName;
226        }
227
228        public void setMethodName(String methodName) {
229                this.methodName = methodName;
230        }
231
232        @Override
233    public Timestamp getExpirationDate() {
234                return this.expirationDate;
235        }
236
237        public void setExpirationDate(Timestamp expirationDate) {
238                this.expirationDate = expirationDate;
239        }
240
241    @Override
242    public PersistedMessagePayload getPayload() {
243        if (this.payload == null) {
244            if (this.getRouteQueueId() == null) {
245                return null;
246}           this.payload = KSBServiceLocator.getMessageQueueService().findByPersistedMessageByRouteQueueId(this.getRouteQueueId()); 
247        }
248        return this.payload;
249    }
250
251    public void setPayload(PersistedMessagePayload payload) {
252        this.payload = payload;
253    }
254
255    @Override
256    public String getValue1() {
257        return this.value1;
258    }
259
260    public void setValue1(String value1) {
261        this.value1 = value1;
262    }
263
264    @Override
265    public String getValue2() {
266        return this.value2;
267    }
268
269    public void setValue2(String value2) {
270        this.value2 = value2;
271    }
272
273}