source: DASISH/t5.6/backend/annotator-backend/trunk/annotator-backend/src/main/java/eu/dasish/annotation/backend/dao/impl/JdbcTargetDao.java @ 4183

Last change on this file since 4183 was 4183, checked in by olhsha, 10 years ago

fixing HSQL/Postgres discrepance problem when setting an current_time date in UTC as default (translation added for Unit test DB and actual Postgres DB is updated so the defaults is set implicitely (no need to send it via the sql request).

File size: 12.1 KB
Line 
1/*
2 * Copyright (C) 2013 DASISH
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
17 */
18package eu.dasish.annotation.backend.dao.impl;
19
20import eu.dasish.annotation.backend.dao.TargetDao;
21import eu.dasish.annotation.schema.Target;
22import eu.dasish.annotation.schema.TargetInfo;
23import java.sql.ResultSet;
24import java.sql.SQLException;
25import java.util.ArrayList;
26import java.util.HashMap;
27import java.util.List;
28import java.util.Map;
29import java.util.UUID;
30import javax.sql.DataSource;
31import javax.xml.datatype.DatatypeConfigurationException;
32import javax.xml.datatype.XMLGregorianCalendar;
33import org.springframework.jdbc.core.RowMapper;
34
35/**
36 *
37 * @author olhsha
38 */
39public class JdbcTargetDao extends JdbcResourceDao implements TargetDao {
40
41    public JdbcTargetDao(DataSource dataTarget) {
42        setDataSource(dataTarget);
43        internalIdName = target_id;
44        resourceTableName = targetTableName;
45    }
46
47    @Override
48    public void setServiceURI(String serviceURI) {
49        _serviceURI = serviceURI;
50    }
51
52    //////////////////////// GETTERS ///////////////////////////////////
53    @Override
54    public Target getTarget(Number internalID) {
55        StringBuilder sql = new StringBuilder("SELECT ");
56        sql.append(targetStar).append(" FROM ").append(targetTableName).append(" WHERE ").append(target_id).append("= ? LIMIT 1");
57        List<Target> result = getSimpleJdbcTemplate().query(sql.toString(), targetRowMapper, internalID);
58        return (!result.isEmpty() ? result.get(0) : null);
59    }
60    private final RowMapper<Target> targetRowMapper = new RowMapper<Target>() {
61        @Override
62        public Target mapRow(ResultSet rs, int rowNumber) throws SQLException {
63            XMLGregorianCalendar xmlDate = timeStampToXMLGregorianCalendar(rs);
64            Target result =
65                    constructTarget(rs.getString(external_id), rs.getString(link_uri), rs.getString(version), xmlDate, rs.getString(fragment_descriptor));
66            return result;
67        }
68    };
69
70    @Override
71    public String getLink(Number internalID) {
72        StringBuilder sql = new StringBuilder("SELECT ");
73        sql.append(targetStar).append(" FROM ").append(targetTableName).append(" WHERE ").append(target_id).append("= ? LIMIT 1");
74        List<String> result = getSimpleJdbcTemplate().query(sql.toString(), linkRowMapper, internalID);
75        return (!result.isEmpty() ? result.get(0) : null);
76    }
77    private final RowMapper<String> linkRowMapper = new RowMapper<String>() {
78        @Override
79        public String mapRow(ResultSet rs, int rowNumber) throws SQLException {
80            return rs.getString(link_uri);
81        }
82    };
83
84    /////////////////////////////////////////
85    @Override
86    public List<Number> getCachedRepresentations(Number targetID) {
87
88        String sql = "SELECT " + cached_representation_id + " FROM " + targetsCachedRepresentationsTableName + " WHERE " + target_id + " = ?";
89        return getSimpleJdbcTemplate().query(sql, cachedIDRowMapper, targetID);
90    }
91
92    @Override
93    public Map<Number, String> getCachedRepresentationFragmentPairs(Number targetID) {
94        Map<Number, String> result = new HashMap<Number, String>();
95        String sql = "SELECT " + cached_representation_id + "," + fragment_descriptor_in_cached + " FROM " + targetsCachedRepresentationsTableName + " WHERE " + target_id + " = ?";
96        List<Map<Number, String>> respond = getSimpleJdbcTemplate().query(sql, cachedFragmentRowMapper, targetID);
97        for (Map<Number, String> pair : respond) {
98            result.putAll(pair);
99        }
100        return result;
101    }
102    private final RowMapper<Map<Number, String>> cachedFragmentRowMapper = new RowMapper<Map<Number, String>>() {
103        @Override
104        public Map<Number, String> mapRow(ResultSet rs, int rowNumber) throws SQLException {
105            Map<Number, String> result = new HashMap<Number, String>();
106            result.put(rs.getInt(cached_representation_id), rs.getString(fragment_descriptor_in_cached));
107            return result;
108        }
109    };
110
111    ///////////////////////////////////////////////////////////////////
112    @Override
113    public List<TargetInfo> getTargetInfos(List<Number> targets) {
114        if (targets == null) {
115            return null;
116        }
117        if (targets.isEmpty()) {
118            return new ArrayList<TargetInfo>();
119        }
120
121        String targetIDs = makeListOfValues(targets);
122
123        StringBuilder sql = new StringBuilder("SELECT ");
124        sql.append(external_id).append(",").append(link_uri).append(",").append(version).append(",").append(fragment_descriptor).
125                append(" FROM ").append(targetTableName).append(" WHERE ").append(target_id).append(" IN ").append(targetIDs);
126        return getSimpleJdbcTemplate().query(sql.toString(), targetInfoRowMapper);
127    }
128    private final RowMapper<TargetInfo> targetInfoRowMapper = new RowMapper<TargetInfo>() {
129        @Override
130        public TargetInfo mapRow(ResultSet rs, int rowNumber) throws SQLException {
131            return constructTargetInfo(rs.getString(external_id), rs.getString(link_uri), rs.getString(version), rs.getString(fragment_descriptor));
132        }
133    };
134
135    /////////////////////////////////////////////////////
136    @Override
137    public List<Number> getTargetsReferringTo(String word) {
138        String searchTerm = "%" + word + "%";
139        StringBuilder sql = new StringBuilder("SELECT ");
140        sql.append(target_id).append(" FROM ").append(targetTableName).append(" WHERE ").append(link_uri).append(" LIKE ? ");
141        return getSimpleJdbcTemplate().query(sql.toString(), internalIDRowMapper, searchTerm);
142    }
143
144    /////////////////////////////////////////////////////
145    @Override
146    public List<Number> getTargetsForLink(String link) {
147        StringBuilder sql = new StringBuilder("SELECT ");
148        sql.append(target_id).append(" FROM ").append(targetTableName).append(" WHERE ").append(link_uri).append(" =  ? ");
149        return getSimpleJdbcTemplate().query(sql.toString(), internalIDRowMapper, link);
150    }
151
152    /////////////////////////////////////////////////
153    @Override
154    public boolean targetIsInUse(Number targetID) {
155        StringBuilder sqlAnnotations = new StringBuilder("SELECT ");
156        sqlAnnotations.append(annotation_id).append(" FROM ").append(annotationsTargetsTableName).append(" WHERE ").append(target_id).append(" = ? LIMIT 1");
157        List<Number> resultAnnotations = getSimpleJdbcTemplate().query(sqlAnnotations.toString(), annotationIDRowMapper, targetID);
158        if (resultAnnotations == null) {
159            return false;
160        }
161        return (resultAnnotations.size() > 0);
162    }
163
164    ///////////////////////// ADDERS /////////////////////////////////
165    @Override
166    public Number addTarget(Target target) {
167        UUID externalID = UUID.randomUUID();
168        String[] linkParts = splitLink(target.getLink());
169        Map<String, Object> params = new HashMap<String, Object>();
170        params.put("externalId", externalID.toString());
171        params.put("linkUri", linkParts[0]);
172        params.put("version", target.getVersion());
173        params.put("fragmentDescriptor", linkParts[1]);
174        StringBuilder sql = new StringBuilder("INSERT INTO ");
175        sql.append(targetTableName).append("(").append(external_id).append(",").append(link_uri).append(",").append(version).append(",").append(fragment_descriptor).append(" ) VALUES (:externalId, :linkUri,  :version, :fragmentDescriptor)");
176        final int affectedRows = getSimpleJdbcTemplate().update(sql.toString(), params);
177        return (affectedRows > 0 ? getInternalID(UUID.fromString(externalID.toString())) : null);
178    }
179
180    ///////////////////////////////////////////////////////////////////
181    @Override
182    public int addTargetCachedRepresentation(Number targetID, Number cachedID, String fragmentDescriptor) {
183        Map<String, Object> paramsJoint = new HashMap<String, Object>();
184        paramsJoint.put("targetId", targetID);
185        paramsJoint.put("cachedId", cachedID);
186        paramsJoint.put("fragmentDescriptor", fragmentDescriptor);
187        StringBuilder sqlJoint = new StringBuilder("INSERT INTO ").append(targetsCachedRepresentationsTableName).append("(").append(target_id).append(",").append(cached_representation_id).append(",").append(fragment_descriptor_in_cached).append(" ) VALUES (:targetId, :cachedId, :fragmentDescriptor)");
188        return getSimpleJdbcTemplate().update(sqlJoint.toString(), paramsJoint);
189    }
190
191    ///////////////////////////////////////////////////////////////////
192    @Override
193    public int updateSiblingClass(Number TargetID, int classID) {
194        if (TargetID == null) {
195            return 0;
196        }
197        StringBuilder sql = new StringBuilder("UPDATE ");
198        sql.append(targetTableName).append(" SET ").append(sibling_Target_class).append("= '").append(classID).append("' WHERE ").append(target_id).append("= ?");
199        return getSimpleJdbcTemplate().update(sql.toString(), TargetID);
200    }
201
202////////////////////// DELETERS ////////////////////////
203    @Override
204    public int deleteTarget(Number internalID) {
205        if (targetIsInUse(internalID)) {
206            return 0;
207        }
208        StringBuilder sqlTargetsVersions = new StringBuilder("DELETE FROM ");
209        sqlTargetsVersions.append(targetTableName).append(" WHERE ").append(target_id).append(" = ? ");
210        return getSimpleJdbcTemplate().update(sqlTargetsVersions.toString(), internalID);
211
212    }
213
214    ///////////////////////////////////////////////////////////////////
215    @Override
216    public int deleteTargetCachedRepresentation(Number targetID, Number cachedID) {
217        if (targetID == null || cachedID == null) {
218            return 0;
219        }
220        Map<String, Object> paramsJoint = new HashMap<String, Object>();
221        paramsJoint.put("targetId", targetID);
222        paramsJoint.put("cachedId", cachedID);
223        StringBuilder sqlTargetsVersions = new StringBuilder("DELETE FROM ");
224        sqlTargetsVersions.append(targetsCachedRepresentationsTableName).append(" WHERE ").append(target_id).append(" = :targetId").
225                append(" AND ").append(cached_representation_id).append(" = :cachedId");
226        return getSimpleJdbcTemplate().update(sqlTargetsVersions.toString(), paramsJoint);
227
228    }
229
230    /////////// HELPERS  ////////////////
231    private TargetInfo constructTargetInfo(String externalID, String link, String version, String fragment) {
232        TargetInfo targetInfo = new TargetInfo();
233        targetInfo.setRef(externalIDtoURI(externalID));
234        targetInfo.setLink(((new StringBuilder(link)).append("#").append(fragment)).toString());
235        targetInfo.setVersion(version);
236        return targetInfo;
237    }
238
239    private Target constructTarget(String externalID, String link, String version, XMLGregorianCalendar xmlTimeStamp, String fragment) {
240        Target target = new Target();
241        target.setURI(externalIDtoURI(externalID));
242        target.setLastModified(xmlTimeStamp);
243        target.setLink(((new StringBuilder(link)).append("#").append(fragment)).toString());
244        target.setVersion(version);
245        return target;
246    }
247   
248    private String[] splitLink(String link){
249      if (link!=null) {
250         String[] result = new String[2]; 
251         String[] parts = link.split("#");
252         if (parts.length > 1) {
253             result[0] = parts[0];             
254             StringBuilder buffer = new StringBuilder();
255             for (int i=1; i<parts.length ; i++){
256                 if (parts[i]!=null){
257                     buffer.append(parts[i]);
258                 }
259             }
260             result[1] = buffer.toString();
261         }
262         return result;
263      }
264      else return null;
265    }
266}
Note: See TracBrowser for help on using the repository browser.