source: DASISH/t5.6/backend/annotator-backend/trunk/annotator-backend/src/main/java/eu/dasish/annotation/backend/dao/impl/JdbcAnnotationDao.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: 26.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.AnnotationDao;
23import eu.dasish.annotation.schema.Annotation;
24import eu.dasish.annotation.schema.AnnotationBody;
25import eu.dasish.annotation.schema.AnnotationBody.TextBody;
26import eu.dasish.annotation.schema.AnnotationBody.XmlBody;
27import eu.dasish.annotation.schema.AnnotationInfo;
28import eu.dasish.annotation.schema.Access;
29import java.io.IOException;
30import java.lang.String;
31import java.sql.ResultSet;
32import java.sql.SQLException;
33import java.sql.Timestamp;
34import java.util.ArrayList;
35import java.util.HashMap;
36import java.util.List;
37import java.util.Map;
38import java.util.UUID;
39import javax.sql.DataSource;
40import javax.xml.parsers.ParserConfigurationException;
41import org.slf4j.Logger;
42import org.slf4j.LoggerFactory;
43import org.springframework.jdbc.core.RowMapper;
44import org.xml.sax.SAXException;
45
46/**
47 * Created on : Jun 27, 2013, 10:30:52 AM
48 *
49 * @author Peter Withers <peter.withers@mpi.nl>
50 */
51public class JdbcAnnotationDao extends JdbcResourceDao implements AnnotationDao {
52
53    private final Logger loggerAnnotationDao = LoggerFactory.getLogger(JdbcAnnotationDao.class);
54
55    public JdbcAnnotationDao(DataSource dataSource) {
56        setDataSource(dataSource);
57        internalIdName = annotation_id;
58        resourceTableName = annotationTableName;
59
60    }
61
62    @Override
63    public void setResourcePath(String relResourcePath) {
64        _relResourcePath = relResourcePath;
65    }
66
67    ///////////// GETTERS /////////////
68    ///////////////////////////////////////////////////////////////////
69    @Override
70    public List<Map<Number, String>> getPermissions(Number annotationID) {
71        StringBuilder sql = new StringBuilder("SELECT ");
72        sql.append(principal_id).append(",").append(access).append(" FROM ").append(permissionsTableName).append(" WHERE ").append(annotation_id).append("  = ?");
73        logger.debug("Parameter " + annotation_id + " := " + annotationID.intValue());
74        return this.loggedQuery(sql.toString(), principalsAccesssRowMapper, annotationID);
75    }
76
77    @Override
78    public Access getAccess(Number annotationID, Number principalID) {
79
80        Map<String, Number> params = new HashMap<String, Number>();
81        params.put("annotationId", annotationID);
82        params.put("principalId", principalID);
83
84        StringBuilder sql = new StringBuilder("SELECT ");
85        sql.append(access).append(" FROM ").append(permissionsTableName).append(" WHERE ").
86                append(annotation_id).append("  =  :annotationId ").append(" AND ").
87                append(principal_id).append("  = :principalId").append(" LIMIT 1");
88        List<Access> result = this.loggedQuery(sql.toString(), accessRowMapper, params);
89        if (result.isEmpty()) {
90            return null;
91        } else {
92            return result.get(0);
93        }
94    }
95    private final RowMapper<Access> accessRowMapper = new RowMapper<Access>() {
96        @Override
97        public Access mapRow(ResultSet rs, int rowNumber) throws SQLException {
98            return Access.fromValue(rs.getString(access));
99        }
100    };
101   
102   
103
104    /////////////////////////////////////////////////////////////////////
105    @Override
106    public Access getPublicAttribute(Number annotationID) {
107        StringBuilder sql = new StringBuilder("SELECT ");
108        sql.append(public_).append(" FROM ").append(annotationTableName).append(" WHERE ").
109                append(annotation_id).append("  =  ? ").append(" LIMIT 1");
110        List<Access> result = this.loggedQuery(sql.toString(), public_RowMapper, annotationID);
111        return result.get(0);
112    }
113
114    ////////////////////////////////////////////////////////////////////////
115    @Override
116    public List<Number> getFilteredAnnotationIDs(Number ownerID, String text, String namespace, String after, String before) {
117
118        StringBuilder sql = new StringBuilder("SELECT DISTINCT ");
119        sql.append(annotation_id).append(" FROM ").append(annotationTableName).append(" WHERE TRUE ");
120        Map<String, Object> params = new HashMap<String, Object>();
121
122        if (ownerID != null) {
123            sql.append(" AND ").append(owner_id).append("  = :ownerId");
124            params.put("ownerId", ownerID);
125        }
126
127        if (after != null) {
128            sql.append(" AND ").append(last_modified).append("  > :afterTimestamp");
129            params.put("afterTimestamp", Timestamp.valueOf(after));
130        }
131
132        if (before != null) {
133            sql.append(" AND ").append(last_modified).append("  < :beforeTimestamp");
134            params.put("beforeTimestamp", Timestamp.valueOf(before));
135        }
136
137        if (text != null) {
138            sql.append(" AND ").append(body_text).append("  LIKE '%").append(text).append("%'");
139        }
140
141        return this.loggedQuery(sql.toString(), internalIDRowMapper, params);
142    }
143
144    ///////////////////////////////////////////////////////////////////////////////////
145    @Override
146    public List<Number> getAnnotationIDsForPermission(Number principalID, Access access) {
147
148        StringBuilder sql = new StringBuilder("SELECT ");
149        sql.append(annotation_id).append(" FROM ").append(permissionsTableName).append(" WHERE ").
150                append(principal_id).append("  = ?").append(" AND ").
151                append(this.sqlAccessConstraint(this.access, access));
152        return this.loggedQuery(sql.toString(), internalIDRowMapper, principalID);
153    }
154
155    /// helper ///
156    private String sqlAccessConstraint(String column, Access access) {
157
158        StringBuilder accessConstraint = new StringBuilder();
159        if (access.equals(Access.READ)) {
160            accessConstraint.append("(").append(column).append("  = '").append(Access.READ.value()).append("'");
161            accessConstraint.append(" OR ").append(column).append("  = '").append(Access.WRITE.value()).append("')");
162        } else {
163            accessConstraint.append(column).append("  = '").append(access.value()).append("'");
164        }
165
166        return accessConstraint.toString();
167    }
168
169    /////////////
170    @Override
171    public List<Number> getAnnotationIDsForPublicAccess(Access access) {
172        StringBuilder sql = new StringBuilder("SELECT ");
173        sql.append(annotation_id).append(" FROM ").append(annotationTableName).append(" WHERE ").
174                append(this.sqlAccessConstraint(public_, access));
175        return this.loggedQuery(sql.toString(), internalIDRowMapper);
176    }
177
178   
179
180    /////////////////////////////////////////
181    @Override
182    public List<Number> getAllAnnotationIDs() {
183        StringBuilder sql = new StringBuilder("SELECT ");
184        sql.append(annotation_id).append(" , ").append(last_modified).append(" FROM ").append(annotationTableName).append(" ORDER BY ").append(last_modified).append(" DESC");
185        return this.loggedQuery(sql.toString(), internalIDRowMapper);
186    }
187
188    @Override
189    public List<Number> sublistOrderedAnnotationIDs(List<Number> annotationIDs, int offset, int limit, String orderedBy, String direction) {
190
191        String values = makeListOfValues(annotationIDs);
192        Map<String, Object> params = new HashMap<String, Object>();
193        params.put("offset", offset);
194        params.put("limit", limit);
195
196        StringBuilder query = new StringBuilder("SELECT DISTINCT ");
197        query.append(annotation_id).append(", ").append(orderedBy).append(" FROM ").append(annotationTableName).append(" WHERE ").append(annotation_id).append(" IN ");
198        query.append(values).append(" ORDER BY ").append(orderedBy).append(" ").append(direction).append(" ");
199
200        if (limit > -1) {
201            query.append(" LIMIT :limit ");
202        }
203
204        query.append(" OFFSET :offset ");
205        return this.loggedQuery(query.toString(), internalIDRowMapper, params);
206    }
207
208    //////////////////////////////////////////////////////////////////////
209    @Override
210    public AnnotationInfo getAnnotationInfoWithoutTargetsAndOwner(Number annotationID) {
211        StringBuilder sql = new StringBuilder("SELECT  ");
212        sql.append(annotationStar).append(" FROM ").append(annotationTableName).append(" WHERE ").append(annotation_id).append("  = ? ");
213        List<AnnotationInfo> result = this.loggedQuery(sql.toString(), annotationInfoRowMapper, annotationID);
214        return result.get(0);
215    }
216    private final RowMapper<AnnotationInfo> annotationInfoRowMapper = new RowMapper<AnnotationInfo>() {
217        @Override
218        public AnnotationInfo mapRow(ResultSet rs, int rowNumber) throws SQLException {
219            AnnotationInfo annotationInfo = new AnnotationInfo();
220            String externalId = rs.getString(external_id);
221            annotationInfo.setHref(externalIDtoHref(externalId));
222            annotationInfo.setHeadline(rs.getString(headline));
223            annotationInfo.setLastModified(timeStampToXMLGregorianCalendar(rs.getString(last_modified)));
224            return annotationInfo;
225        }
226    };
227
228    /////////////////////////////////////////////////
229    /**
230     *
231     * @param annotationIDs
232     * @return list of annotation references corresponding to the annotation-ids
233     * from the input list if the input list is null or empty (zero elements)
234     * returns an empty list there may be annotationIDs which are not in the DB
235     * (so that's why we need this method).
236     */
237    @Override
238    public List<String> getAnnotationREFs(List<Number> annotationIDs) {
239
240        if (annotationIDs.isEmpty()) {
241            return (new ArrayList<String>());
242        }
243
244        String values = makeListOfValues(annotationIDs);
245        StringBuilder sql = new StringBuilder("SELECT DISTINCT ");
246        sql.append(external_id).append(" FROM ").append(annotationTableName).append(" WHERE ").append(annotation_id).append("  IN ").append(values);
247        return this.loggedQuery(sql.toString(), annotationREFRowMapper);
248    }
249    private final RowMapper<String> annotationREFRowMapper = new RowMapper<String>() {
250        @Override
251        public String mapRow(ResultSet rs, int rowNumber) throws SQLException {
252            return externalIDtoHref(rs.getString(external_id));
253        }
254    };
255
256    //////////////////////////////////////////////////////////////////////////
257    @Override
258    public Annotation getAnnotationWithoutTargetsAndPemissions(Number annotationID) {
259
260        StringBuilder sql = new StringBuilder("SELECT ");
261        sql.append(annotationStar).append(" FROM ").append(annotationTableName).append(" WHERE ").append(annotation_id).append("= ? LIMIT  1");
262        List<Annotation> result = this.loggedQuery(sql.toString(), annotationRowMapper, annotationID);
263        return result.get(0);
264    }
265    private final RowMapper<Annotation> annotationRowMapper = new RowMapper<Annotation>() {
266        @Override
267        public Annotation mapRow(ResultSet rs, int rowNumber) throws SQLException {
268            Annotation annotation = new Annotation();
269            annotation.setHeadline(rs.getString(headline));
270            AnnotationBody body = new AnnotationBody();
271            if (rs.getBoolean(is_xml)) {
272                body.setTextBody(null);
273                XmlBody xmlBody = new XmlBody();
274                xmlBody.setMimeType(rs.getString(body_mimetype));
275                String bodyText = rs.getString(body_text);
276                try {
277                    try {
278                        try {
279                            xmlBody.setAny(Helpers.stringToElement(bodyText));
280                            body.setXmlBody(xmlBody);
281                        } catch (SAXException e3) {
282                            body.setXmlBody(null);
283                            throw new SQLException(" body field  " + bodyText + " causes " + e3);
284                        }
285                    } catch (IOException e2) {
286                        body.setXmlBody(null);
287                        throw new SQLException("body field" + bodyText + " causes " + e2);
288                    }
289                } catch (ParserConfigurationException e1) {
290                    body.setXmlBody(null);
291                    throw new SQLException(" body field   " + bodyText + " causes " + e1);
292                }
293            } else {
294                body.setXmlBody(null);
295                TextBody textBody = new TextBody();
296                textBody.setMimeType(rs.getString(body_mimetype));
297                textBody.setBody(rs.getString(body_text));
298                body.setTextBody(textBody);
299            }
300            annotation.setBody(body);
301
302            annotation.setTargets(null);
303            String externalId = rs.getString(external_id);
304            annotation.setId(externalId);           
305            annotation.setHref(externalIDtoHref(externalId));
306            annotation.setLastModified(timeStampToXMLGregorianCalendar(rs.getString(last_modified)));
307            return annotation;
308        }
309    };
310
311    @Override
312    public Number getOwner(Number annotationID) {
313
314        StringBuilder sql = new StringBuilder("SELECT ");
315        sql.append(owner_id).append(" FROM ").append(annotationTableName).append(" WHERE ").
316                append(annotation_id).append("= ? LIMIT  1");
317        List<Number> result = this.loggedQuery(sql.toString(), ownerIDRowMapper, annotationID);
318
319        return result.get(0);
320    }
321
322    /////////////////////////////
323//    @Override
324//    public boolean annotationIsInUse(Number annotationID) {
325//        StringBuilder sqlNotebooks = new StringBuilder("SELECT ");
326//        sqlNotebooks.append(notebook_id).append(" FROM ").append(notebooksAnnotationsTableName).append(" WHERE ").append(annotation_id).append("= ? LIMIT 1");
327//        List<Number> resultNotebooks = this.loggedQuery(sqlNotebooks.toString(), notebookIDRowMapper, annotationID);
328//        if (resultNotebooks.size() > 0) {
329//            return true;
330//        }
331//
332//        StringBuilder sqlTargets = new StringBuilder("SELECT ");
333//        sqlTargets.append(target_id).append(" FROM ").append(annotationsTargetsTableName).append(" WHERE ").append(annotation_id).append("= ? LIMIT 1");
334//        List<Number> resultTargets = this.loggedQuery(sqlTargets.toString(), targetIDRowMapper, annotationID);
335//        if (resultTargets.size() > 0) {
336//            return true;
337//        }
338//
339//        StringBuilder sqlAccesss = new StringBuilder("SELECT ");
340//        sqlAccesss.append(principal_id).append(" FROM ").append(permissionsTableName).append(" WHERE ").append(annotation_id).append("= ? LIMIT 1");
341//        List<Number> resultAccesss = this.loggedQuery(sqlAccesss.toString(), principalIDRowMapper, annotationID);
342//        return (resultAccesss.size() > 0);
343//    }
344    @Override
345    public List<Number> getAnnotations(Number notebookID) {
346        StringBuilder sql = new StringBuilder("SELECT ");
347        sql.append(annotation_id).
348                append(" FROM ").append(notebooksAnnotationsTableName).append(" WHERE ").
349                append(notebook_id).append(" = :notebookID");
350        return this.loggedQuery(sql.toString(), internalIDRowMapper, notebookID);
351
352    }
353
354    /////////////////////////////////////////////////
355    @Override
356    public boolean targetIsInUse(Number targetID) {
357        StringBuilder sqlAnnotations = new StringBuilder("SELECT ");
358        sqlAnnotations.append(annotation_id).append(" FROM ").append(annotationsTargetsTableName).append(" WHERE ").append(target_id).append(" = ? LIMIT 1");
359        List<Number> resultAnnotations = this.loggedQuery(sqlAnnotations.toString(), internalIDRowMapper, targetID);
360        return (resultAnnotations.size() > 0);
361    }
362
363    //////////// UPDATERS /////////////
364    @Override
365    public int updateAnnotationBody(Number annotationID, String text, String mimeType, Boolean isXml) {
366        Map<String, Object> params = new HashMap<String, Object>();
367        params.put("annotationID", annotationID);
368        params.put("bodyText", text);
369        params.put("bodyMimeType", mimeType);
370        params.put("isXml", isXml);
371
372        StringBuilder sql = new StringBuilder("UPDATE ");
373        sql.append(annotationTableName).append(" SET ").
374                append(last_modified).append("=  default,").
375                append(body_text).append("= :bodyText, ").
376                append(body_mimetype).append("= :bodyMimeType, ").
377                append(is_xml).append("= :isXml").
378                append(" WHERE ").append(annotation_id).append("= :annotationID");
379        int affectedRows = this.loggedUpdate(sql.toString(), params);
380        return affectedRows;
381    }
382   
383     @Override
384    public int updateAnnotationHeadline(Number annotationID, String header) {
385        Map<String, Object> params = new HashMap<String, Object>();
386        params.put("annotationID", annotationID);
387        params.put("headline", header);
388
389        StringBuilder sql = new StringBuilder("UPDATE ");
390        sql.append(annotationTableName).append(" SET ").
391                append(last_modified).append("=  default,").
392                append(_headline).append("= :headline ").
393                append(" WHERE ").append(annotation_id).append("= :annotationID");
394        int affectedRows = this.loggedUpdate(sql.toString(), params);
395        return affectedRows;
396    }
397
398    // TODO Unit test
399    @Override
400    public int updateAnnotation(Annotation annotation, Number annotationID, Number newOwnerID) {
401
402        String[] body = retrieveBodyComponents(annotation.getBody());
403               
404        Map<String, Object> params = new HashMap<String, Object>();
405        params.put("owner", newOwnerID);
406        params.put("bodyText", body[0]);
407        params.put("bodyMimeType", body[1]);
408        params.put("headline", annotation.getHeadline());
409        params.put("isXml", annotation.getBody().getXmlBody() != null);
410        params.put("externalId", annotation.getId());
411        params.put("annotationId", annotationID);
412
413        StringBuilder sql = new StringBuilder("UPDATE ");
414        sql.append(annotationTableName).append(" SET ").
415                append(owner_id).append("=  :owner ,").
416                append(body_text).append("=  :bodyText ,").
417                append(body_mimetype).append("= :bodyMimeType ,").
418                append(headline).append("=  :headline ,").
419                append(last_modified).append("=  default,").
420                append(is_xml).append("= :isXml, ").
421                append(external_id).append("= :externalId").
422                append(" WHERE ").append(annotation_id).append("= :annotationId"); 
423        int affectedRows = this.loggedUpdate(sql.toString(), params);
424       
425        return affectedRows;
426    }
427
428    @Override
429    public int updateAnnotationPrincipalAccess(Number annotationID, Number principalID, Access access) {
430
431        Map<String, Object> params = new HashMap<String, Object>();
432
433        params.put("annotationID", annotationID);
434        params.put("principalID", principalID);
435        params.put("accessString", access.value());
436        StringBuilder sql = new StringBuilder("UPDATE ");
437        sql.append(permissionsTableName).append(" SET ").
438                append(this.access).append("= :accessString").
439                append(" WHERE ").append(annotation_id).append("= :annotationID").
440                append(" AND ").append(principal_id).append("= :principalID");
441        return this.loggedUpdate(sql.toString(), params);
442
443
444    }
445
446    @Override
447    public int updatePublicAttribute(Number annotationID, Access access) {
448
449        Map<String, Object> params = new HashMap<String, Object>();
450        params.put("access", access.value());
451        params.put("annotationId", annotationID);
452        StringBuilder sql = new StringBuilder("UPDATE ");
453        sql.append(annotationTableName).append(" SET ").
454                append(public_).append("= :access").
455                append(" WHERE ").append(annotation_id).append("= :annotationId");
456        return this.loggedUpdate(sql.toString(), params);
457    }
458
459    //////////// ADDERS ////////////////////////
460    @Override
461    public Number addAnnotation(Annotation annotation, Number ownerID) throws NotInDataBaseException {
462
463        String[] body = retrieveBodyComponents(annotation.getBody());
464
465        // generate a new annotation ID
466        UUID externalID = UUID.randomUUID();
467        Map<String, Object> params = new HashMap<String, Object>();
468        params.put("externalId", externalID.toString());
469        params.put("owner", ownerID);
470        params.put("headline", annotation.getHeadline());
471        params.put("bodyText", body[0]);
472        params.put("bodyMimeType", body[1]);
473        params.put("isXml", annotation.getBody().getXmlBody() != null);
474
475        StringBuilder sql = new StringBuilder("INSERT INTO ");
476        sql.append(annotationTableName).append("(").append(external_id).append(",").append(owner_id);
477        sql.append(",").append(headline).append(",").append(body_text).append(",").append(body_mimetype).append(",").append(is_xml).
478                append(" ) VALUES (:externalId, :owner, :headline, :bodyText, :bodyMimeType, :isXml)");
479        int affectedRows = this.loggedUpdate(sql.toString(), params);
480        return getInternalID(externalID);
481    }
482
483    //////////////////////////////////////////////////////////////////////////////////
484    @Override
485    public int addAnnotationTarget(Number annotationID, Number targetID) {
486        Map<String, Object> paramsAnnotationsTargets = new HashMap<String, Object>();
487        paramsAnnotationsTargets.put("annotationId", annotationID);
488        paramsAnnotationsTargets.put("targetId", targetID);
489        StringBuilder sqlAnnotationsTargets = new StringBuilder("INSERT INTO ");
490        sqlAnnotationsTargets.append(annotationsTargetsTableName).append("(").append(annotation_id).append(",").append(target_id).append(" ) VALUES (:annotationId, :targetId)");
491        return this.loggedUpdate(sqlAnnotationsTargets.toString(), paramsAnnotationsTargets);
492    }
493
494    /////////////////////////////////////////////////////////////////////////////////////////
495    @Override
496    public int addAnnotationPrincipalAccess(Number annotationID, Number principalID, Access access) {
497
498        Map<String, Object> paramsAccesss = new HashMap<String, Object>();
499        paramsAccesss.put("annotationId", annotationID);
500        paramsAccesss.put("principalId", principalID);
501        paramsAccesss.put("status", access.value());
502        StringBuilder sqlUpdateAccessTable = new StringBuilder("INSERT INTO ");
503        sqlUpdateAccessTable.append(permissionsTableName).append(" (").append(annotation_id).append(",").append(principal_id).append(",").append(this.access).append(") VALUES (:annotationId, :principalId, :status)");
504        final int affectedAccesss = this.loggedUpdate(sqlUpdateAccessTable.toString(), paramsAccesss);
505        return affectedAccesss;
506    }
507
508    //////////////////////////////////////////////////////////////////////////////////
509    /////////////////// DELETERS //////////////////////////
510    @Override
511    public int deleteAnnotation(Number annotationID) {
512        StringBuilder sqlAnnotation = new StringBuilder("DELETE FROM ");
513        sqlAnnotation.append(annotationTableName).append(" where ").append(annotation_id).append(" = ?");
514        return (this.loggedUpdate(sqlAnnotation.toString(), annotationID));
515
516    }
517
518    @Override
519    public int deleteAllAnnotationTarget(Number annotationID) {
520        StringBuilder sqlTargetTargets = new StringBuilder("DELETE FROM ");
521        sqlTargetTargets.append(annotationsTargetsTableName).append(" WHERE ").append(annotation_id).append(" = ?");
522        return this.loggedUpdate(sqlTargetTargets.toString(), annotationID); // # removed "annotations_target_Targets" rows
523
524    }
525
526    //////////////////////////////////////////////////////
527    @Override
528    public int deleteAnnotationPermissions(Number annotationID) {
529        StringBuilder sqlAccesss = new StringBuilder("DELETE FROM ");
530        sqlAccesss.append(permissionsTableName).append(" WHERE ").append(annotation_id).append(" = ?");
531        return this.loggedUpdate(sqlAccesss.toString(), annotationID); // removed "access" rows
532    }
533
534    ////////////////////////////////////////
535    @Override
536    public int deleteAnnotationFromAllNotebooks(Number annotationID) {
537        StringBuilder sql = new StringBuilder("DELETE FROM ");
538        sql.append(notebooksAnnotationsTableName).append(" WHERE ").append(annotation_id).append(" = ?");
539        return this.loggedUpdate(sql.toString(), annotationID); // removed "notebook-annotation" rows
540
541    }
542
543    //////////////////////////////////////////////////////
544    @Override
545    public int deleteAnnotationPrincipalAccess(Number annotationID, Number principalID) {
546        Map<String, Number> params = new HashMap();
547        params.put("annotationId", annotationID);
548        params.put("principalId", principalID);
549        StringBuilder sqlAccesss = new StringBuilder("DELETE FROM ");
550        sqlAccesss.append(permissionsTableName).append(" WHERE ").append(annotation_id).append(" = :annotationId AND ").
551                append(principal_id).append(" = :principalId");
552        return this.loggedUpdate(sqlAccesss.toString(), params);
553
554    }
555    /////////////// helpers //////////////////
556
557    @Override
558    public String[] retrieveBodyComponents(AnnotationBody annotationBody) {
559        boolean body_is_xml = annotationBody.getXmlBody() != null;
560        String[] result = new String[2];
561        if (body_is_xml) {
562            result[0] = Helpers.elementToString(annotationBody.getXmlBody().getAny());
563            result[1] = annotationBody.getXmlBody().getMimeType();
564        } else {
565            TextBody textBody = annotationBody.getTextBody();
566            if (textBody != null) {
567                result[0] = textBody.getBody();
568                result[1] = textBody.getMimeType();
569            } else {
570                loggerAnnotationDao.error("Ill-formed body: both options, xml-body and text-body, are set to null. ");
571                return null;
572            }
573        }
574        return result;
575    }
576}
Note: See TracBrowser for help on using the repository browser.