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

Last change on this file since 5393 was 5393, checked in by olhsha@mpi.nl, 10 years ago

testing, debugging, fixing randomuuid-ncname issue

File size: 12.2 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.Helpers;
21import eu.dasish.annotation.backend.NotInDataBaseException;
22import eu.dasish.annotation.backend.dao.TargetDao;
23import eu.dasish.annotation.schema.Target;
24import eu.dasish.annotation.schema.TargetInfo;
25import java.sql.ResultSet;
26import java.sql.SQLException;
27import java.util.ArrayList;
28import java.util.HashMap;
29import java.util.List;
30import java.util.Map;
31import java.util.UUID;
32import javax.sql.DataSource;
33import javax.xml.datatype.XMLGregorianCalendar;
34import org.slf4j.Logger;
35import org.slf4j.LoggerFactory;
36import org.springframework.jdbc.core.RowMapper;
37
38/**
39 *
40 * @author olhsha
41 */
42public class JdbcTargetDao extends JdbcResourceDao implements TargetDao {
43
44    private final Logger loggerTargetDao = LoggerFactory.getLogger(JdbcTargetDao.class);
45   
46    public JdbcTargetDao(DataSource dataTarget) {
47        setDataSource(dataTarget);
48        internalIdName = target_id;
49        resourceTableName = targetTableName;
50    }
51
52    @Override
53    public void setResourcePath(String relResourcePath) {
54        _relResourcePath = relResourcePath;
55    }
56
57    //////////////////////// GETTERS ///////////////////////////////////
58    @Override
59    public Target getTarget(Number internalID) {
60        StringBuilder sql = new StringBuilder("SELECT ");
61        sql.append(targetStar).append(" FROM ").append(targetTableName).append(" WHERE ").append(target_id).append("= ? LIMIT 1");
62        List<Target> result = this.loggedQuery(sql.toString(), targetRowMapper, internalID);
63        return result.get(0);
64    }
65    private final RowMapper<Target> targetRowMapper = new RowMapper<Target>() {
66        @Override
67        public Target mapRow(ResultSet rs, int rowNumber) throws SQLException {
68            XMLGregorianCalendar xmlDate = timeStampToXMLGregorianCalendar(rs.getString(last_modified));
69            Target result =
70                    constructTarget(rs.getString(external_id), rs.getString(link_uri), rs.getString(version), xmlDate, rs.getString(fragment_descriptor));
71            return result;
72        }
73    };
74
75    @Override
76    public String getLink(Number internalID) {
77        StringBuilder sql = new StringBuilder("SELECT ");
78        sql.append(targetStar).append(" FROM ").append(targetTableName).append(" WHERE ").append(target_id).append("= ? LIMIT 1");
79        List<String> result = this.loggedQuery(sql.toString(), linkRowMapper, internalID);
80        return result.get(0);
81    }
82    private final RowMapper<String> linkRowMapper = new RowMapper<String>() {
83        @Override
84        public String mapRow(ResultSet rs, int rowNumber) throws SQLException {
85            return rs.getString(link_uri);
86        }
87    };
88
89    @Override
90    public Map<Number, String> getCachedRepresentationFragmentPairs(Number targetID) {
91
92        if (targetID == null) {
93            loggerTargetDao.debug("targetID: " + nullArgument);
94            return null;
95        }
96
97        Map<Number, String> result = new HashMap<Number, String>();
98        String sql = "SELECT " + cached_representation_id + "," + fragment_descriptor_in_cached + " FROM " + targetsCachedRepresentationsTableName + " WHERE " + target_id + " = ?";
99        List<Map<Number, String>> respond = this.loggedQuery(sql, cachedFragmentRowMapper, targetID);
100        for (Map<Number, String> pair : respond) {
101            result.putAll(pair);
102        }
103        return result;
104    }
105    private final RowMapper<Map<Number, String>> cachedFragmentRowMapper = new RowMapper<Map<Number, String>>() {
106        @Override
107        public Map<Number, String> mapRow(ResultSet rs, int rowNumber) throws SQLException {
108            Map<Number, String> result = new HashMap<Number, String>();
109            result.put(rs.getInt(cached_representation_id), rs.getString(fragment_descriptor_in_cached));
110            return result;
111        }
112    };
113
114    ///////////////////////////////////////////////////////////////////
115    @Override
116    public List<TargetInfo> getTargetInfos(List<Number> targets) {
117
118        if (targets.isEmpty()) {
119            return new ArrayList<TargetInfo>();
120        }
121
122        String targetIDs = makeListOfValues(targets);
123
124        StringBuilder sql = new StringBuilder("SELECT ");
125        sql.append(external_id).append(",").append(link_uri).append(",").append(version).append(",").append(fragment_descriptor).
126                append(" FROM ").append(targetTableName).append(" WHERE ").append(target_id).append(" IN ").append(targetIDs);
127        return this.loggedQuery(sql.toString(), targetInfoRowMapper);
128    }
129    private final RowMapper<TargetInfo> targetInfoRowMapper = new RowMapper<TargetInfo>() {
130        @Override
131        public TargetInfo mapRow(ResultSet rs, int rowNumber) throws SQLException {
132            return constructTargetInfo(rs.getString(external_id), rs.getString(link_uri), rs.getString(version), rs.getString(fragment_descriptor));
133        }
134    };
135
136   
137    /////////////////////////////////////////////////////
138    @Override
139    public List<Number> getTargetsForLink(String link) {
140        if (link == null) {
141            loggerTargetDao.debug("link: " + nullArgument);
142            return new ArrayList<Number>();
143        }
144
145        StringBuilder sql = new StringBuilder("SELECT ");
146        sql.append(target_id).append(" FROM ").append(targetTableName).append(" WHERE ").append(link_uri).append(" =  ? ");
147        return this.loggedQuery(sql.toString(), internalIDRowMapper, link);
148    }
149
150    //////////////////////////////////////
151    @Override
152    public boolean cachedIsInUse(Number cachedID) {
153
154        StringBuilder sql = new StringBuilder("SELECT ");
155        sql.append(target_id).append(" FROM ").append(targetsCachedRepresentationsTableName).append(" WHERE ").append(cached_representation_id).append("= ? LIMIT 1");
156        List<Number> result = this.loggedQuery(sql.toString(), internalIDRowMapper, cachedID);
157        if (result != null) {
158            return (!result.isEmpty());
159        } else {
160            return false;
161        }
162    }
163
164    @Override
165    public List<Number> getTargetIDs(Number annotationID) {
166        StringBuilder sql = new StringBuilder("SELECT DISTINCT ");
167        sql.append(target_id).append(" FROM ").append(annotationsTargetsTableName).append(" WHERE ").append(annotation_id).append("= ?");
168        return this.loggedQuery(sql.toString(), internalIDRowMapper, annotationID);
169
170    }
171
172    //////// UPDATERS //////////
173    @Override
174    public int updateTargetCachedRepresentationFragment(Number targetID, Number cachedID, String fragmentDescription) {
175
176        Map<String, Object> params = new HashMap<String, Object>();
177        params.put("targetID", targetID);
178        params.put("cachedID", cachedID);
179        params.put("fragment", fragmentDescription);
180        StringBuilder sql = new StringBuilder("UPDATE ");
181        sql.append(targetsCachedRepresentationsTableName).append(" SET ").
182                append(fragment_descriptor_in_cached).append("= :fragment").
183                append(" WHERE ").append(target_id).append("= :targetID").append(" AND ").append(cached_representation_id).append("= :cachedID");
184        return this.loggedUpdate(sql.toString(), params);
185    }
186
187    ///////////////////////// ADDERS /////////////////////////////////
188    @Override
189    public Number addTarget(Target target) throws NotInDataBaseException {
190
191        UUID externalID = Helpers.generateUUID();
192        String[] linkParts = splitLink(target.getLink());
193        Map<String, Object> params = new HashMap<String, Object>();
194        params.put("externalId", externalID.toString());
195        params.put("linkUri", linkParts[0]);
196        params.put("version", target.getVersion());
197        params.put("fragmentDescriptor", linkParts[1]);
198        StringBuilder sql = new StringBuilder("INSERT INTO ");
199        sql.append(targetTableName).append("(").append(external_id).append(",").append(link_uri).append(",").append(version).append(",").append(fragment_descriptor).append(" ) VALUES (:externalId, :linkUri,  :version, :fragmentDescriptor)");
200        final int affectedRows = this.loggedUpdate(sql.toString(), params);
201        return getInternalID(UUID.fromString(externalID.toString()));
202    }
203
204    ///////////////////////////////////////////////////////////////////
205    @Override
206    public int addTargetCachedRepresentation(Number targetID, Number cachedID, String fragmentDescriptor) {
207
208        Map<String, Object> paramsJoint = new HashMap<String, Object>();
209        paramsJoint.put("targetId", targetID);
210        paramsJoint.put("cachedId", cachedID);
211        paramsJoint.put("fragmentDescriptor", fragmentDescriptor);
212        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)");
213        return this.loggedUpdate(sqlJoint.toString(), paramsJoint);
214    }
215
216    ///////////////////////////////////
217    @Override
218    public int deleteTarget(Number internalID) {
219
220        StringBuilder sqlTargetsVersions = new StringBuilder("DELETE FROM ");
221        sqlTargetsVersions.append(targetTableName).append(" WHERE ").append(target_id).append(" = ? ");
222        return this.loggedUpdate(sqlTargetsVersions.toString(), internalID);
223
224    }
225
226    ///////////////////////////////////////////////////////////////////
227    @Override
228    public int deleteTargetCachedRepresentation(Number targetID, Number cachedID) {
229
230        Map<String, Object> paramsJoint = new HashMap<String, Object>();
231        paramsJoint.put("targetId", targetID);
232        paramsJoint.put("cachedId", cachedID);
233        StringBuilder sqlTargetsVersions = new StringBuilder("DELETE FROM ");
234        sqlTargetsVersions.append(targetsCachedRepresentationsTableName).append(" WHERE ").append(target_id).append(" = :targetId").
235                append(" AND ").append(cached_representation_id).append(" = :cachedId");
236        return this.loggedUpdate(sqlTargetsVersions.toString(), paramsJoint);
237
238    }
239
240    /////////// HELPERS  ////////////////
241    private TargetInfo constructTargetInfo(String externalID, String link, String version, String fragment) {
242        TargetInfo targetInfo = new TargetInfo();
243        targetInfo.setHref(externalIDtoHref(externalID));
244        targetInfo.setLink(((new StringBuilder(link)).append("#").append(fragment)).toString());
245        targetInfo.setVersion(version);
246        return targetInfo;
247    }
248
249    private Target constructTarget(String externalID, String link, String version, XMLGregorianCalendar xmlTimeStamp, String fragment) {
250        Target target = new Target();
251        target.setId(externalID);
252        target.setHref(externalIDtoHref(externalID));
253        target.setLastModified(xmlTimeStamp);
254        if (fragment != null) {
255            target.setLink(((new StringBuilder(link)).append("#").append(fragment)).toString());
256        } else {
257            target.setLink(link);
258        }
259        target.setVersion(version);
260        return target;
261    }
262
263    private String[] splitLink(String link) {
264        if (link != null) {
265            String[] result = new String[2];
266            String[] parts = link.split("#");
267            result[0] = parts[0];
268            if (parts.length > 1) {
269                StringBuilder buffer = new StringBuilder();
270                for (int i = 1; i < parts.length; i++) {
271                    if (parts[i] != null) {
272                        buffer.append(parts[i]);
273                    }
274                }
275                result[1] = buffer.toString();
276            }
277            return result;
278        } else {
279            return null;
280        }
281    }
282}
Note: See TracBrowser for help on using the repository browser.