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

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

ref --> href
+ xml:id for instances
refactoring

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