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

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

postimg/getting annotations with xml bodies is fixed

File size: 12.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).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        if (fragment != null) {
244            target.setLink(((new StringBuilder(link)).append("#").append(fragment)).toString());
245        } else {
246            target.setLink(link);
247        }
248        target.setVersion(version);
249        return target;
250    }
251
252    private String[] splitLink(String link) {
253        if (link != null) {
254            String[] result = new String[2];
255            String[] parts = link.split("#");
256            result[0] = parts[0];
257            if (parts.length > 1) {
258                StringBuilder buffer = new StringBuilder();
259                for (int i = 1; i < parts.length; i++) {
260                    if (parts[i] != null) {
261                        buffer.append(parts[i]);
262                    }
263                }
264                result[1] = buffer.toString();
265            }
266            return result;
267        } else {
268            return null;
269        }
270    }
271}
Note: See TracBrowser for help on using the repository browser.