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

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

refactored.Redundar row mappers are some other methods are thrown away

File size: 13.6 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.slf4j.Logger;
34import org.slf4j.LoggerFactory;
35import org.springframework.jdbc.core.RowMapper;
36
37/**
38 *
39 * @author olhsha
40 */
41public class JdbcTargetDao extends JdbcResourceDao implements TargetDao {
42
43    private final Logger loggerTargetDao = LoggerFactory.getLogger(JdbcTargetDao.class);
44
45    public JdbcTargetDao(DataSource dataTarget) {
46        setDataSource(dataTarget);
47        internalIdName = target_id;
48        resourceTableName = targetTableName;
49    }
50
51    @Override
52    public void setServiceURI(String serviceURI) {
53        _serviceURI = serviceURI;
54    }
55
56    //////////////////////// GETTERS ///////////////////////////////////
57    @Override
58    public Target getTarget(Number internalID) {
59
60        if (internalID == null) {
61            loggerTargetDao.debug("internalID: " + nullArgument);
62            return null;
63        }
64
65        StringBuilder sql = new StringBuilder("SELECT ");
66        sql.append(targetStar).append(" FROM ").append(targetTableName).append(" WHERE ").append(target_id).append("= ? LIMIT 1");
67        List<Target> result = getSimpleJdbcTemplate().query(sql.toString(), targetRowMapper, internalID);
68        return (!result.isEmpty() ? result.get(0) : null);
69    }
70    private final RowMapper<Target> targetRowMapper = new RowMapper<Target>() {
71        @Override
72        public Target mapRow(ResultSet rs, int rowNumber) throws SQLException {
73            XMLGregorianCalendar xmlDate = timeStampToXMLGregorianCalendar(rs.getString(last_modified));
74            Target result =
75                    constructTarget(rs.getString(external_id), rs.getString(link_uri), rs.getString(version), xmlDate, rs.getString(fragment_descriptor));
76            return result;
77        }
78    };
79
80    @Override
81    public String getLink(Number internalID) {
82
83        if (internalID == null) {
84            loggerTargetDao.debug("internalID: " + nullArgument);
85            return null;
86        }
87
88        StringBuilder sql = new StringBuilder("SELECT ");
89        sql.append(targetStar).append(" FROM ").append(targetTableName).append(" WHERE ").append(target_id).append("= ? LIMIT 1");
90        List<String> result = getSimpleJdbcTemplate().query(sql.toString(), linkRowMapper, internalID);
91        return (!result.isEmpty() ? result.get(0) : null);
92    }
93    private final RowMapper<String> linkRowMapper = new RowMapper<String>() {
94        @Override
95        public String mapRow(ResultSet rs, int rowNumber) throws SQLException {
96            return rs.getString(link_uri);
97        }
98    };
99
100 
101    @Override
102    public Map<Number, String> getCachedRepresentationFragmentPairs(Number targetID) {
103
104        if (targetID == null) {
105            loggerTargetDao.debug("targetID: " + nullArgument);
106            return null;
107        }
108
109        Map<Number, String> result = new HashMap<Number, String>();
110        String sql = "SELECT " + cached_representation_id + "," + fragment_descriptor_in_cached + " FROM " + targetsCachedRepresentationsTableName + " WHERE " + target_id + " = ?";
111        List<Map<Number, String>> respond = getSimpleJdbcTemplate().query(sql, cachedFragmentRowMapper, targetID);
112        for (Map<Number, String> pair : respond) {
113            result.putAll(pair);
114        }
115        return result;
116    }
117    private final RowMapper<Map<Number, String>> cachedFragmentRowMapper = new RowMapper<Map<Number, String>>() {
118        @Override
119        public Map<Number, String> mapRow(ResultSet rs, int rowNumber) throws SQLException {
120            Map<Number, String> result = new HashMap<Number, String>();
121            result.put(rs.getInt(cached_representation_id), rs.getString(fragment_descriptor_in_cached));
122            return result;
123        }
124    };
125
126    ///////////////////////////////////////////////////////////////////
127    @Override
128    public List<TargetInfo> getTargetInfos(List<Number> targets) {
129        if (targets == null) {
130            loggerTargetDao.debug("targets: " + nullArgument);
131            return null;
132        }
133        if (targets.isEmpty()) {
134            return new ArrayList<TargetInfo>();
135        }
136
137        String targetIDs = makeListOfValues(targets);
138
139        StringBuilder sql = new StringBuilder("SELECT ");
140        sql.append(external_id).append(",").append(link_uri).append(",").append(version).append(",").append(fragment_descriptor).
141                append(" FROM ").append(targetTableName).append(" WHERE ").append(target_id).append(" IN ").append(targetIDs);
142        return getSimpleJdbcTemplate().query(sql.toString(), targetInfoRowMapper);
143    }
144    private final RowMapper<TargetInfo> targetInfoRowMapper = new RowMapper<TargetInfo>() {
145        @Override
146        public TargetInfo mapRow(ResultSet rs, int rowNumber) throws SQLException {
147            return constructTargetInfo(rs.getString(external_id), rs.getString(link_uri), rs.getString(version), rs.getString(fragment_descriptor));
148        }
149    };
150
151    /////////////////////////////////////////////////////
152    @Override
153    public List<Number> getTargetsReferringTo(String word) {
154        if (word == null) {
155            loggerTargetDao.debug("word: " + nullArgument);
156            return null;
157        }
158        String searchTerm = "%" + word + "%";
159        StringBuilder sql = new StringBuilder("SELECT ");
160        sql.append(target_id).append(" FROM ").append(targetTableName).append(" WHERE ").append(link_uri).append(" LIKE ? ");
161        return getSimpleJdbcTemplate().query(sql.toString(), internalIDRowMapper, searchTerm);
162    }
163
164    /////////////////////////////////////////////////////
165    @Override
166    public List<Number> getTargetsForLink(String link) {
167        if (link == null) {
168            loggerTargetDao.debug("link: " + nullArgument);
169            return null;
170        }
171
172        StringBuilder sql = new StringBuilder("SELECT ");
173        sql.append(target_id).append(" FROM ").append(targetTableName).append(" WHERE ").append(link_uri).append(" =  ? ");
174        return getSimpleJdbcTemplate().query(sql.toString(), internalIDRowMapper, link);
175    }
176
177 
178   
179   
180     //////////////////////////////////////
181    @Override
182    public boolean cachedIsInUse(Number cachedID) {
183       
184        if (cachedID == null) {
185            logger.debug("Cached's Id is null");
186            return false;
187        }
188       
189        StringBuilder sql = new StringBuilder("SELECT ");
190        sql.append(target_id).append(" FROM ").append(targetsCachedRepresentationsTableName).append(" WHERE ").append(cached_representation_id).append("= ? LIMIT 1");
191        List<Number> result = getSimpleJdbcTemplate().query(sql.toString(), internalIDRowMapper, cachedID);
192        if (result != null) {
193            return (!result.isEmpty());
194        } else {
195            return false;
196        }
197    }
198   
199   
200    @Override
201    public List<Number> retrieveTargetIDs(Number annotationID) {
202        if (annotationID != null) {
203            StringBuilder sql = new StringBuilder("SELECT DISTINCT ");
204            sql.append(target_id).append(" FROM ").append(annotationsTargetsTableName).append(" WHERE ").append(annotation_id).append("= ?");
205            return getSimpleJdbcTemplate().query(sql.toString(), internalIDRowMapper, annotationID);
206        } else {
207            loggerTargetDao.debug(nullArgument);
208            return null;
209        }
210    }
211
212    ///////////////////////// ADDERS /////////////////////////////////
213    @Override
214    public Number addTarget(Target target) {
215       
216        if (target == null) {
217            loggerTargetDao.debug("target: " + nullArgument);
218            return null;
219        }
220
221       
222        UUID externalID = UUID.randomUUID();
223        String[] linkParts = splitLink(target.getLink());
224        Map<String, Object> params = new HashMap<String, Object>();
225        params.put("externalId", externalID.toString());
226        params.put("linkUri", linkParts[0]);
227        params.put("version", target.getVersion());
228        params.put("fragmentDescriptor", linkParts[1]);
229        StringBuilder sql = new StringBuilder("INSERT INTO ");
230        sql.append(targetTableName).append("(").append(external_id).append(",").append(link_uri).append(",").append(version).append(",").append(fragment_descriptor).append(" ) VALUES (:externalId, :linkUri,  :version, :fragmentDescriptor)");
231        final int affectedRows = getSimpleJdbcTemplate().update(sql.toString(), params);
232        return (affectedRows > 0 ? getInternalID(UUID.fromString(externalID.toString())) : null);
233    }
234
235    ///////////////////////////////////////////////////////////////////
236    @Override
237    public int addTargetCachedRepresentation(Number targetID, Number cachedID, String fragmentDescriptor) {
238         if (targetID == null) {
239            loggerTargetDao.debug("targetID: " + nullArgument);
240            return 0;
241        }
242
243         if (cachedID == null) {
244            loggerTargetDao.debug("cachedID: " + nullArgument);
245            return 0;
246        }
247         
248        Map<String, Object> paramsJoint = new HashMap<String, Object>();
249        paramsJoint.put("targetId", targetID);
250        paramsJoint.put("cachedId", cachedID);
251        paramsJoint.put("fragmentDescriptor", fragmentDescriptor);
252        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)");
253        return getSimpleJdbcTemplate().update(sqlJoint.toString(), paramsJoint);
254    }
255
256  ///////////////////////////////////
257   @Override
258    public int deleteTarget(Number internalID) {
259        if (internalID == null) {
260            logger.debug("internalID of the target is null.");
261            return 0;
262        }
263       
264     
265        StringBuilder sqlTargetsVersions = new StringBuilder("DELETE FROM ");
266        sqlTargetsVersions.append(targetTableName).append(" WHERE ").append(target_id).append(" = ? ");
267        return getSimpleJdbcTemplate().update(sqlTargetsVersions.toString(), internalID);
268
269    }
270
271
272    ///////////////////////////////////////////////////////////////////
273    @Override
274    public int deleteTargetCachedRepresentation(Number targetID, Number cachedID) {
275       
276         if (targetID == null) {
277            loggerTargetDao.debug("targetID: " + nullArgument);
278            return 0;
279        }
280
281         if (cachedID == null) {
282            loggerTargetDao.debug("cachedID: " + nullArgument);
283            return 0;
284        }
285       
286       
287        Map<String, Object> paramsJoint = new HashMap<String, Object>();
288        paramsJoint.put("targetId", targetID);
289        paramsJoint.put("cachedId", cachedID);
290        StringBuilder sqlTargetsVersions = new StringBuilder("DELETE FROM ");
291        sqlTargetsVersions.append(targetsCachedRepresentationsTableName).append(" WHERE ").append(target_id).append(" = :targetId").
292                append(" AND ").append(cached_representation_id).append(" = :cachedId");
293        return getSimpleJdbcTemplate().update(sqlTargetsVersions.toString(), paramsJoint);
294
295    }
296
297    /////////// HELPERS  ////////////////
298    private TargetInfo constructTargetInfo(String externalID, String link, String version, String fragment) {
299        TargetInfo targetInfo = new TargetInfo();
300        targetInfo.setRef(externalIDtoURI(externalID));
301        targetInfo.setLink(((new StringBuilder(link)).append("#").append(fragment)).toString());
302        targetInfo.setVersion(version);
303        return targetInfo;
304    }
305
306    private Target constructTarget(String externalID, String link, String version, XMLGregorianCalendar xmlTimeStamp, String fragment) {
307        Target target = new Target();
308        target.setURI(externalIDtoURI(externalID));
309        target.setLastModified(xmlTimeStamp);
310        if (fragment != null) {
311            target.setLink(((new StringBuilder(link)).append("#").append(fragment)).toString());
312        } else {
313            target.setLink(link);
314        }
315        target.setVersion(version);
316        return target;
317    }
318
319    private String[] splitLink(String link) {
320        if (link != null) {
321            String[] result = new String[2];
322            String[] parts = link.split("#");
323            result[0] = parts[0];
324            if (parts.length > 1) {
325                StringBuilder buffer = new StringBuilder();
326                for (int i = 1; i < parts.length; i++) {
327                    if (parts[i] != null) {
328                        buffer.append(parts[i]);
329                    }
330                }
331                result[1] = buffer.toString();
332            }
333            return result;
334        } else {
335            return null;
336        }
337    }
338}
Note: See TracBrowser for help on using the repository browser.