View Javadoc
1   /*
2    * This file is part of ***  M y C o R e  ***
3    * See http://www.mycore.de/ for details.
4    *
5    * MyCoRe is free software: you can redistribute it and/or modify
6    * it under the terms of the GNU General Public License as published by
7    * the Free Software Foundation, either version 3 of the License, or
8    * (at your option) any later version.
9    *
10   * MyCoRe is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   * GNU General Public License for more details.
14   *
15   * You should have received a copy of the GNU General Public License
16   * along with MyCoRe.  If not, see <http://www.gnu.org/licenses/>.
17   */
18  
19  package org.mycore.datamodel.metadata.history;
20  
21  import java.io.Serializable;
22  import java.time.Instant;
23  
24  import org.mycore.backend.jpa.MCRObjectIDConverter;
25  import org.mycore.common.MCRSession;
26  import org.mycore.common.MCRSessionMgr;
27  import org.mycore.datamodel.metadata.MCRObjectID;
28  
29  import jakarta.persistence.Basic;
30  import jakarta.persistence.Column;
31  import jakarta.persistence.Convert;
32  import jakarta.persistence.Entity;
33  import jakarta.persistence.GeneratedValue;
34  import jakarta.persistence.GenerationType;
35  import jakarta.persistence.Id;
36  import jakarta.persistence.Index;
37  import jakarta.persistence.NamedQueries;
38  import jakarta.persistence.NamedQuery;
39  import jakarta.persistence.Table;
40  
41  /**
42   * Entity implementation class for Entity: MCRMetaHistoryItem
43   *
44   */
45  @Entity
46  @Table(name = "MCRMetaHistory",
47      indexes = {
48          @Index(name = "IDX_ID_TIME", columnList = "id,time"),
49          @Index(name = "IDX_TIME", columnList = "time")
50      })
51  @NamedQueries({
52      @NamedQuery(name = "MCRMetaHistory.getLastOfType",
53          query = "SELECT MAX(time) FROM MCRMetaHistoryItem i WHERE i.id=:id and i.eventType=:type"),
54      @NamedQuery(name = "MCRMetaHistory.getLastEventByID",
55          query = "SELECT a FROM MCRMetaHistoryItem a "
56              + "WHERE a.time in (SELECT max(time) as time FROM MCRMetaHistoryItem b "
57              + "WHERE a.id=b.id AND time BETWEEN :from AND :until) "
58              + "AND a.eventType=:eventType"),
59      @NamedQuery(name = "MCRMetaHistory.getFirstDate", query = "SELECT MIN(time) from MCRMetaHistoryItem"),
60      @NamedQuery(name = "MCRMetaHistory.getHighestID",
61          query = "SELECT MAX(id) from MCRMetaHistoryItem WHERE ID like :looksLike"),
62      @NamedQuery(name = "MCRMetaHistory.getNextActiveIDs",
63          query = "SELECT c"
64              + " FROM MCRMetaHistoryItem c"
65              + " WHERE (:afterID is null or c.id >:afterID)"
66              + "   AND c.eventType='c'"
67              + "   AND (:kind!='object' OR c.id NOT LIKE '%\\_derivate\\_%')"
68              + "   AND (:kind!='derivate' OR c.id LIKE '%\\_derivate\\_%')"
69              + "   AND (NOT EXISTS (SELECT d.time FROM MCRMetaHistoryItem d WHERE d.eventType='d' AND c.id=d.id)"
70              + "        OR c.time > ALL (SELECT d.time FROM MCRMetaHistoryItem d WHERE d.eventType='d' AND c.id=d.id))"
71              + " ORDER by c.id"),
72      @NamedQuery(name = "MCRMetaHistory.countActiveIDs",
73          query = "SELECT count(c)"
74              + " FROM MCRMetaHistoryItem c"
75              + " WHERE c.eventType='c'"
76              + "   AND (:kind!='object' OR c.id NOT LIKE '%\\_derivate\\_%')"
77              + "   AND (:kind!='derivate' OR c.id LIKE '%\\_derivate\\_%')"
78              + "   AND (NOT EXISTS (SELECT d.time FROM MCRMetaHistoryItem d WHERE d.eventType='d' AND c.id=d.id)"
79              + "        OR c.time > ALL (SELECT d.time FROM MCRMetaHistoryItem d WHERE d.eventType='d' AND c.id=d.id))")
80  })
81  public class MCRMetaHistoryItem implements Serializable {
82  
83      @Id
84      @GeneratedValue(strategy = GenerationType.IDENTITY)
85      private long internalid;
86  
87      @Column(length = MCRObjectID.MAX_LENGTH)
88      @Convert(converter = MCRObjectIDConverter.class)
89      @Basic
90      private MCRObjectID id;
91  
92      private Instant time;
93  
94      @Convert(converter = MCRMetadataHistoryEventTypeConverter.class)
95      @Column(length = 1)
96      private MCRMetadataHistoryEventType eventType;
97  
98      private String userID;
99  
100     private String userIP;
101 
102     private static final long serialVersionUID = 1L;
103 
104     static MCRMetaHistoryItem createdNow(MCRObjectID id) {
105         return now(id, MCRMetadataHistoryEventType.Create);
106     }
107 
108     static MCRMetaHistoryItem deletedNow(MCRObjectID id) {
109         return now(id, MCRMetadataHistoryEventType.Delete);
110     }
111 
112     static MCRMetaHistoryItem now(MCRObjectID id, MCRMetadataHistoryEventType type) {
113         MCRMetaHistoryItem historyItem = new MCRMetaHistoryItem();
114         historyItem.setId(id);
115         historyItem.setTime(Instant.now());
116         historyItem.setEventType(type);
117         if (MCRSessionMgr.hasCurrentSession()) {
118             MCRSession currentSession = MCRSessionMgr.getCurrentSession();
119             historyItem.setUserID(currentSession.getUserInformation().getUserID());
120             historyItem.setUserIP(currentSession.getCurrentIP());
121         }
122         return historyItem;
123     }
124 
125     public long getInternalid() {
126         return this.internalid;
127     }
128 
129     public void setInternalid(long internalid) {
130         this.internalid = internalid;
131     }
132 
133     public MCRObjectID getId() {
134         return this.id;
135     }
136 
137     public void setId(MCRObjectID id) {
138         this.id = id;
139     }
140 
141     public Instant getTime() {
142         return this.time;
143     }
144 
145     public void setTime(Instant time) {
146         this.time = time;
147     }
148 
149     public MCRMetadataHistoryEventType getEventType() {
150         return this.eventType;
151     }
152 
153     public void setEventType(MCRMetadataHistoryEventType eventType) {
154         this.eventType = eventType;
155     }
156 
157     public String getUserID() {
158         return this.userID;
159     }
160 
161     public void setUserID(String userId) {
162         this.userID = userId;
163     }
164 
165     public String getUserIP() {
166         return this.userIP;
167     }
168 
169     public void setUserIP(String ip) {
170         this.userIP = ip;
171     }
172 
173     @Override
174     public String toString() {
175         return "MCRMetaHistoryItem [eventType=" + eventType + ", id=" + id + ", time=" + time + ", userID=" + userID
176             + ", userIP=" + userIP + "]";
177     }
178 
179 }