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

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

lintegrity unit test reconstructed so it does not mock any more. getAnnotation works (the others are "ignored"). Needs refactoring (the subdirectory with beans and DummySecurityFilter? class.

File size: 11.3 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).
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));
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        Map<String, Object> params = new HashMap<String, Object>();
169        params.put("externalId", externalID.toString());
170        params.put("linkUri", target.getLink());
171        params.put("version", target.getVersion());
172        StringBuilder sql = new StringBuilder("INSERT INTO ");
173        sql.append(targetTableName).append("(").append(external_id).append(",").append(link_uri).append(",").append(version).append(",").append(last_modified).append(" ) VALUES (:externalId, :linkUri,  :version, current_timestamp AT TIME ZONE INTERVAL '00:00' HOUR TO MINUTE)");
174        final int affectedRows = getSimpleJdbcTemplate().update(sql.toString(), params);
175        return (affectedRows > 0 ? getInternalID(UUID.fromString(externalID.toString())) : null);
176    }
177
178    ///////////////////////////////////////////////////////////////////
179    @Override
180    public int addTargetCachedRepresentation(Number targetID, Number cachedID, String fragmentDescriptor) {
181        Map<String, Object> paramsJoint = new HashMap<String, Object>();
182        paramsJoint.put("targetId", targetID);
183        paramsJoint.put("cachedId", cachedID);
184        paramsJoint.put("fragmentDescriptor", fragmentDescriptor);
185        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)");
186        return getSimpleJdbcTemplate().update(sqlJoint.toString(), paramsJoint);
187    }
188
189    ///////////////////////////////////////////////////////////////////
190    @Override
191    public int updateSiblingClass(Number TargetID, int classID) {
192        if (TargetID == null) {
193            return 0;
194        }
195        StringBuilder sql = new StringBuilder("UPDATE ");
196        sql.append(targetTableName).append(" SET ").append(sibling_Target_class).append("= '").append(classID).append("' WHERE ").append(target_id).append("= ?");
197        return getSimpleJdbcTemplate().update(sql.toString(), TargetID);
198    }
199
200////////////////////// DELETERS ////////////////////////
201    @Override
202    public int deleteTarget(Number internalID) {
203        if (targetIsInUse(internalID)) {
204            return 0;
205        }
206        StringBuilder sqlTargetsVersions = new StringBuilder("DELETE FROM ");
207        sqlTargetsVersions.append(targetTableName).append(" WHERE ").append(target_id).append(" = ? ");
208        return getSimpleJdbcTemplate().update(sqlTargetsVersions.toString(), internalID);
209
210    }
211
212    ///////////////////////////////////////////////////////////////////
213    @Override
214    public int deleteTargetCachedRepresentation(Number targetID, Number cachedID) {
215        if (targetID == null || cachedID == null) {
216            return 0;
217        }
218        Map<String, Object> paramsJoint = new HashMap<String, Object>();
219        paramsJoint.put("targetId", targetID);
220        paramsJoint.put("cachedId", cachedID);
221        StringBuilder sqlTargetsVersions = new StringBuilder("DELETE FROM ");
222        sqlTargetsVersions.append(targetsCachedRepresentationsTableName).append(" WHERE ").append(target_id).append(" = :targetId").
223                append(" AND ").append(cached_representation_id).append(" = :cachedId");
224        return getSimpleJdbcTemplate().update(sqlTargetsVersions.toString(), paramsJoint);
225
226    }
227
228    /////////// HELPERS  ////////////////
229    private TargetInfo constructTargetInfo(String externalID, String link, String version) {
230        TargetInfo targetInfo = new TargetInfo();
231        targetInfo.setRef(externalIDtoURI(externalID));
232        targetInfo.setLink(link);
233        targetInfo.setVersion(version);
234        return targetInfo;
235    }
236
237    private Target constructTarget(String externalID, String link, String version, XMLGregorianCalendar xmlTimeStamp, String fragment) {
238        Target target = new Target();
239        target.setURI(externalIDtoURI(externalID));
240        target.setLastModified(xmlTimeStamp);
241        target.setLink(link);
242        target.setVersion(version);
243        target.setFragmentDescriptor(fragment);
244        return target;
245    }
246}
Note: See TracBrowser for help on using the repository browser.