1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
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 }