1+ /**
2+ * The contents of this file are subject to the license and copyright
3+ * detailed in the LICENSE and NOTICE files at the root of the source
4+ * tree and available online at
5+ *
6+ * http://www.dspace.org/license/
7+ */
8+ package org .dspace .content .dao .impl ;
9+
10+ import java .sql .SQLException ;
11+ import java .util .UUID ;
12+
13+ import org .dspace .content .MetadataSchema ;
14+ import org .dspace .content .dao .ItemForMetadataEnhancementUpdateDAO ;
15+ import org .dspace .content .factory .ContentServiceFactory ;
16+ import org .dspace .content .service .MetadataSchemaService ;
17+ import org .dspace .core .Context ;
18+ import org .dspace .core .DBConnection ;
19+ import org .dspace .services .ConfigurationService ;
20+ import org .dspace .utils .DSpace ;
21+ import org .hibernate .Session ;
22+ import org .hibernate .query .NativeQuery ;
23+ import org .springframework .beans .factory .annotation .Autowired ;
24+
25+ /**
26+ * Hibernate implementation of the Database Access Object interface class for
27+ * the ItemForMetadataEnhancementUpdate object. This class is responsible for
28+ * all database calls for the ItemForMetadataEnhancementUpdate object and is
29+ * autowired by spring This class should never be accessed directly.
30+ */
31+ public class ItemForMetadataEnhancementUpdateDAOImpl implements ItemForMetadataEnhancementUpdateDAO {
32+ @ Autowired
33+ ConfigurationService configurationService ;
34+
35+ @ Override
36+ public void removeItemForUpdate (Context context , UUID itemToRemove ) {
37+ try {
38+ Session session = getHibernateSession ();
39+ String sql = "DELETE FROM itemupdate_metadata_enhancement WHERE uuid = :uuid" ;
40+ NativeQuery <?> query = session .createNativeQuery (sql );
41+ query .setParameter ("uuid" , itemToRemove );
42+ query .executeUpdate ();
43+ } catch (Exception e ) {
44+ throw new RuntimeException (e );
45+ }
46+
47+ }
48+
49+ @ Override
50+ public UUID pollItemToUpdate (Context context ) {
51+ try {
52+ Session session = getHibernateSession ();
53+ String sql = "SELECT cast(uuid as varchar) FROM itemupdate_metadata_enhancement"
54+ + " ORDER BY date_queued ASC LIMIT 1" ;
55+ NativeQuery <?> query = session .createNativeQuery (sql );
56+ Object uuidObj = query .uniqueResult ();
57+ if (uuidObj != null ) {
58+ UUID uuid ;
59+ if (uuidObj instanceof String ) {
60+ uuid = (UUID ) UUID .fromString ((String ) uuidObj );
61+ } else {
62+ throw new RuntimeException ("Unexpected result type from the database " + uuidObj );
63+ }
64+ removeItemForUpdate (context , uuid );
65+ return uuid ;
66+ } else {
67+ return null ;
68+ }
69+ } catch (Exception e ) {
70+ throw new RuntimeException (e );
71+ }
72+
73+ }
74+
75+ @ Override
76+ public int saveAffectedItemsForUpdate (Context context , UUID uuid ) {
77+ try {
78+ Session session = getHibernateSession ();
79+ MetadataSchemaService schemaService = ContentServiceFactory .getInstance ().getMetadataSchemaService ();
80+ MetadataSchema schema = schemaService .find (context , "cris" );
81+ String sqlInsertOrUpdate ;
82+ if ("org.h2.Driver" .equals (configurationService .getProperty ("db.driver" ))) {
83+ // H2 doesn't support the INSERT OR UPDATE statement so let's do in two steps
84+ // update queued date for records already in the queue
85+ String sqlUpdate = "UPDATE itemupdate_metadata_enhancement iue " +
86+ "SET date_queued = CURRENT_TIMESTAMP " +
87+ "WHERE EXISTS ( " +
88+ " SELECT 1 " +
89+ " FROM metadatavalue mv " +
90+ " JOIN metadatafieldregistry mfr ON mv.metadata_field_id = mfr.metadata_field_id " +
91+ " WHERE mv.dspace_object_id = iue.uuid " +
92+ " AND mfr.metadata_schema_id = :schema " +
93+ " AND mfr.element = 'virtualsource' " +
94+ " AND SUBSTRING(mv.text_value,1,36) = :uuid " +
95+ ")" ;
96+ String sqlInsert =
97+ "INSERT INTO itemupdate_metadata_enhancement (uuid, date_queued) " +
98+ "SELECT DISTINCT mv.dspace_object_id, CURRENT_TIMESTAMP " +
99+ "FROM metadatavalue mv " +
100+ "JOIN metadatafieldregistry mfr ON mv.metadata_field_id = mfr.metadata_field_id " +
101+ "LEFT JOIN itemupdate_metadata_enhancement iue ON mv.dspace_object_id = iue.uuid " +
102+ "WHERE mfr.metadata_schema_id = :schema " +
103+ "AND mfr.element = 'virtualsource' " +
104+ "AND SUBSTRING(mv.text_value,1,36) = :uuid " +
105+ "AND iue.uuid IS NULL" ;
106+ NativeQuery <?> queryUpdate = session .createNativeQuery (sqlUpdate );
107+ queryUpdate .setParameter ("uuid" , uuid .toString ());
108+ queryUpdate .setParameter ("schema" , schema .getID ());
109+ queryUpdate .executeUpdate ();
110+ NativeQuery <?> queryInsert = session .createNativeQuery (sqlInsert );
111+ queryInsert .setParameter ("uuid" , uuid .toString ());
112+ queryInsert .setParameter ("schema" , schema .getID ());
113+ return queryInsert .executeUpdate ();
114+ } else {
115+ sqlInsertOrUpdate = "INSERT INTO itemupdate_metadata_enhancement (uuid, date_queued)" +
116+ "SELECT DISTINCT mv.dspace_object_id, CURRENT_TIMESTAMP " +
117+ "FROM metadatavalue mv " +
118+ "JOIN metadatafieldregistry mfr ON mv.metadata_field_id = mfr.metadata_field_id " +
119+ "WHERE mfr.metadata_schema_id = :schema " +
120+ "AND mfr.element = 'virtualsource' " +
121+ "AND SUBSTRING(mv.text_value,1,36) = :uuid " +
122+ "ON CONFLICT (uuid) DO UPDATE " +
123+ "SET date_queued = EXCLUDED.date_queued" ;
124+ NativeQuery <?> queryInsertOrUpdate = session .createNativeQuery (sqlInsertOrUpdate );
125+ queryInsertOrUpdate .setParameter ("uuid" , uuid .toString ());
126+ queryInsertOrUpdate .setParameter ("schema" , schema .getID ());
127+ return queryInsertOrUpdate .executeUpdate ();
128+ }
129+ } catch (Exception e ) {
130+ throw new RuntimeException (e );
131+ }
132+ }
133+
134+ /**
135+ * The Hibernate Session used in the current thread
136+ *
137+ * @return the current Session.
138+ * @throws SQLException
139+ */
140+ private Session getHibernateSession () throws SQLException {
141+ DBConnection dbConnection = new DSpace ().getServiceManager ().getServiceByName (null , DBConnection .class );
142+ return ((Session ) dbConnection .getSession ());
143+ }
144+
145+ public UUID ConvertByteArrayToUUID (byte [] bytea ) {
146+ long mostSigBits = 0 ;
147+ long leastSigBits = 0 ;
148+ for (int i = 0 ; i < 8 ; i ++) {
149+ mostSigBits = (mostSigBits << 8 ) | (bytea [i ] & 0xff );
150+ leastSigBits = (leastSigBits << 8 ) | (bytea [i + 8 ] & 0xff );
151+ }
152+
153+ UUID uuid = new UUID (mostSigBits , leastSigBits );
154+ return uuid ;
155+ }
156+ }
0 commit comments