View Javadoc
1   /*
2    * Licensed to The Apereo Foundation under one or more contributor license
3    * agreements. See the NOTICE file distributed with this work for additional
4    * information regarding copyright ownership.
5    *
6    *
7    * The Apereo Foundation licenses this file to you under the Educational
8    * Community License, Version 2.0 (the "License"); you may not use this file
9    * except in compliance with the License. You may obtain a copy of the License
10   * at:
11   *
12   *   http://opensource.org/licenses/ecl2.txt
13   *
14   * Unless required by applicable law or agreed to in writing, software
15   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
17   * License for the specific language governing permissions and limitations under
18   * the License.
19   *
20   */
21  
22  package org.opencastproject.usertracking.impl;
23  
24  import org.opencastproject.usertracking.api.UserAction;
25  import org.opencastproject.usertracking.api.UserSession;
26  
27  import java.util.Date;
28  
29  import javax.persistence.Access;
30  import javax.persistence.AccessType;
31  import javax.persistence.Basic;
32  import javax.persistence.Column;
33  import javax.persistence.Entity;
34  import javax.persistence.GeneratedValue;
35  import javax.persistence.GenerationType;
36  import javax.persistence.Id;
37  import javax.persistence.Index;
38  import javax.persistence.JoinColumn;
39  import javax.persistence.Lob;
40  import javax.persistence.ManyToOne;
41  import javax.persistence.NamedQueries;
42  import javax.persistence.NamedQuery;
43  import javax.persistence.Table;
44  import javax.persistence.Temporal;
45  import javax.persistence.TemporalType;
46  import javax.xml.bind.annotation.XmlAccessType;
47  import javax.xml.bind.annotation.XmlAccessorType;
48  import javax.xml.bind.annotation.XmlElement;
49  import javax.xml.bind.annotation.XmlRootElement;
50  import javax.xml.bind.annotation.XmlType;
51  
52  /**
53   * A JAXB-annotated implementation of {@link UserAction}
54   */
55  @Entity(name = "UserAction")
56  @Access(AccessType.FIELD)
57  @Table(name = "oc_user_action", indexes = {
58      @Index(name = "IX_oc_user_action_created", columnList = "created"),
59      @Index(name = "IX_oc_user_action_inpoint", columnList = "inpoint"),
60      @Index(name = "IX_oc_user_action_outpoint", columnList = "outpoint"),
61      @Index(name = "IX_oc_user_action_mediapackage_id", columnList = "mediapackage"),
62      @Index(name = "IX_oc_user_action_type", columnList = "type")})
63  @NamedQueries({
64      @NamedQuery(name = "findUserActions", query = "SELECT a FROM UserAction a"),
65      @NamedQuery(name = "countSessionsGroupByMediapackage", query = "SELECT a.mediapackageId, COUNT(distinct a.session), SUM(a.length) FROM UserAction a GROUP BY a.mediapackageId"),
66      @NamedQuery(name = "countSessionsGroupByMediapackageByIntervall", query = "SELECT a.mediapackageId, COUNT(distinct a.session.sessionId), SUM(a.length) FROM UserAction a WHERE :begin <= a.created AND a.created <= :end GROUP BY a.mediapackageId"),
67      @NamedQuery(name = "countSessionsOfMediapackage", query = "SELECT COUNT(distinct a.session) FROM UserAction a WHERE a.mediapackageId = :mediapackageId"),
68      @NamedQuery(name = "findLastUserFootprintOfSession", query = "SELECT a FROM UserAction a  WHERE a.session = :session AND a.type = \'FOOTPRINT\'  ORDER BY a.created DESC"),
69      @NamedQuery(name = "findLastUserActionsOfSession", query = "SELECT a FROM UserAction a  WHERE a.session = :session ORDER BY a.created DESC"),
70      @NamedQuery(name = "findUserActionsByType", query = "SELECT a FROM UserAction a WHERE a.type = :type"),
71      @NamedQuery(name = "findUserActionsByTypeAndMediapackageId", query = "SELECT a FROM UserAction a WHERE a.mediapackageId = :mediapackageId AND a.type = :type"),
72      @NamedQuery(name = "findUserActionsByTypeAndMediapackageIdOrderByOutpointDESC", query = "SELECT a FROM UserAction a WHERE a.mediapackageId = :mediapackageId AND a.type = :type ORDER BY a.outpoint DESC"),
73      @NamedQuery(name = "findUserActionsByTypeAndMediapackageIdByUserOrderByOutpointDESC", query = "SELECT a FROM UserAction a WHERE a.mediapackageId = :mediapackageId AND a.type = :type AND a.session.userId = :userid ORDER BY a.outpoint DESC"),
74      @NamedQuery(name = "findUserActionsByIntervall", query = "SELECT a FROM UserAction a WHERE :begin <= a.created AND a.created <= :end"),
75      @NamedQuery(name = "findUserActionsByTypeAndIntervall", query = "SELECT a FROM UserAction a WHERE :begin <= a.created AND a.created <= :end AND a.type = :type"),
76      @NamedQuery(name = "findTotal", query = "SELECT COUNT(a) FROM UserAction a"),
77      @NamedQuery(name = "findTotalByType", query = "SELECT COUNT(a) FROM UserAction a WHERE a.type = :type"),
78      @NamedQuery(name = "findTotalByTypeAndMediapackageId", query = "SELECT COUNT(a) FROM UserAction a WHERE a.mediapackageId = :mediapackageId AND a.type = :type"),
79      @NamedQuery(name = "findTotalByIntervall", query = "SELECT COUNT(a) FROM UserAction a WHERE :begin <= a.created AND a.created <= :end"),
80      @NamedQuery(name = "findDistinctEpisodeIdTotalByIntervall", query = "SELECT COUNT(distinct a.mediapackageId) FROM UserAction a WHERE :begin <= a.created AND a.created <= :end"),
81      @NamedQuery(name = "findTotalByTypeAndIntervall", query = "SELECT COUNT(a) FROM UserAction a WHERE :begin <= a.created AND a.created <= :end AND a.type = :type"),
82      @NamedQuery(name = "findUserActionsByMediaPackageAndTypeAscendingByDate", query = "SELECT a FROM UserAction a WHERE a.mediapackageId = :mediapackageId AND a.type = :type ORDER BY a.created"),
83      @NamedQuery(name = "findUserActionsByMediaPackageAndTypeDescendingByDate", query = "SELECT a FROM UserAction a WHERE a.mediapackageId = :mediapackageId AND a.type = :type ORDER BY a.created DESC") })
84  @XmlType(name = "action", namespace = "http://usertracking.opencastproject.org")
85  @XmlRootElement(name = "action", namespace = "http://usertracking.opencastproject.org")
86  @XmlAccessorType(XmlAccessType.FIELD)
87  public class UserActionImpl implements UserAction {
88  
89    @Id
90    @Column(name = "id")
91    @GeneratedValue(strategy = GenerationType.AUTO)
92    @XmlElement(name = "id")
93    private Long id;
94  
95    @Column(name = "mediapackage", length = 128)
96    @XmlElement(name = "mediapackageId")
97    private String mediapackageId;
98  
99    @ManyToOne(targetEntity = UserSessionImpl.class)
100   @JoinColumn(name = "session_id")
101   @XmlElement(name = "sessionId")
102   private UserSessionImpl session;
103 
104   @Column(name = "inpoint")
105   @XmlElement(name = "inpoint")
106   private int inpoint;
107 
108   @Column(name = "outpoint")
109   @XmlElement(name = "outpoint")
110   private int outpoint;
111 
112   @Column(name = "length")
113   @XmlElement(name = "length")
114   private int length;
115 
116   @Lob
117   @Column(name = "type", length = 128)
118   @XmlElement(name = "type")
119   private String type;
120 
121   @Column(name = "playing")
122   @XmlElement(name = "isPlaying")
123   private boolean isPlaying;
124 
125   @Basic(optional = false)
126   @Column(name = "created")
127   @Temporal(TemporalType.TIMESTAMP)
128   @XmlElement(name = "created")
129   private Date created = new Date();
130 
131   /**
132    * A no-arg constructor needed by JAXB
133    */
134   public UserActionImpl() {
135   }
136 
137   @Override
138   public Long getId() {
139     return id;
140   }
141 
142   @Override
143   public void setId(Long id) {
144     this.id = id;
145   }
146 
147   @Override
148   public void setSession(UserSession session) {
149     this.session = (UserSessionImpl) session;
150   }
151 
152   @Override
153   public UserSession getSession() {
154     return session;
155   }
156 
157   @Override
158   public String getMediapackageId() {
159     return mediapackageId;
160   }
161 
162   @Override
163   public void setMediapackageId(String mediapackageId) {
164     this.mediapackageId = mediapackageId;
165   }
166 
167   @Override
168   public int getInpoint() {
169     return inpoint;
170   }
171 
172   @Override
173   public void setInpoint(int inpoint) {
174     this.inpoint = inpoint;
175     updateLength();
176   }
177 
178   @Override
179   public int getOutpoint() {
180     return outpoint;
181   }
182 
183   @Override
184   public void setOutpoint(int outpoint) {
185     this.outpoint = outpoint;
186     updateLength();
187   }
188 
189   @Override
190   public int getLength() {
191     return length;
192   }
193 
194   @Override
195   public String getType() {
196     return type;
197   }
198 
199   @Override
200   public void setType(String type) {
201     this.type = type;
202   }
203 
204   @Override
205   public boolean getIsPlaying() {
206     return isPlaying;
207   }
208 
209   @Override
210   public void setIsPlaying(boolean isPlaying) {
211     this.isPlaying = isPlaying;
212   }
213 
214   @Override
215   public Date getCreated() {
216     return created;
217   }
218 
219   public void setCreated(Date created) {
220     this.created = created;
221   }
222 
223   private void updateLength() {
224     this.length = this.outpoint - this.inpoint;
225   }
226 }