source: ComponentRegistry/trunk/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/impl/ComponentDaoImpl.java @ 5549

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

Added group service. Tested via the tomcat on loclahots (test URI and postman), old unit tests are adjusted and work well. Todo: retest on localhost tomcat, look at run-time exceptions, add new unit tests, adjust front-end

File size: 11.8 KB
Line 
1package clarin.cmdi.componentregistry.persistence.impl;
2
3import java.util.ArrayList;
4import java.util.HashMap;
5import java.util.List;
6import java.util.Map;
7
8import org.slf4j.Logger;
9import org.slf4j.LoggerFactory;
10import org.springframework.beans.factory.annotation.Autowired;
11import org.springframework.dao.DataAccessException;
12import org.springframework.stereotype.Repository;
13
14import clarin.cmdi.componentregistry.impl.ComponentUtils;
15import clarin.cmdi.componentregistry.model.BaseDescription;
16import clarin.cmdi.componentregistry.model.ComponentDescription;
17import clarin.cmdi.componentregistry.model.ProfileDescription;
18import clarin.cmdi.componentregistry.model.RegistryUser;
19import clarin.cmdi.componentregistry.persistence.ComponentDao;
20import clarin.cmdi.componentregistry.persistence.jpa.CommentsDao;
21import clarin.cmdi.componentregistry.persistence.jpa.JpaComponentDao;
22import clarin.cmdi.componentregistry.persistence.jpa.UserDao;
23
24/**
25 * Base DAO which can be extended to serve {@link ComponentDescription}s and
26 * {@link ProfileDescription}s
27 *
28 * @author Twan Goosen <twan.goosen@mpi.nl>
29 * @author George.Georgovassilis@mpi.nl
30 */
31
32@Repository
33public class ComponentDaoImpl implements ComponentDao {
34
35    @Autowired
36    private JpaComponentDao jpaComponentDao;
37
38    @Autowired
39    private CommentsDao commentsDao;
40
41    @Autowired
42    private UserDao userDao;
43
44    private final static Logger LOG = LoggerFactory
45            .getLogger(ComponentDaoImpl.class);
46
47    /**
48     * Copy a set of properties which are allowed to change from "from" to "to"
49     * thus making sure that only those properties are updated and not other
50     * ones.
51     *
52     * @param from
53     * @param to
54     */
55    protected void copyPersistentProperties(BaseDescription from, BaseDescription to) {
56        to.setName(from.getName());
57        to.setDescription(from.getDescription());
58        to.setRegistrationDate(from.getRegistrationDate());
59        to.setCreatorName(from.getCreatorName());
60        to.setDomainName(from.getDomainName());
61        to.setGroupName(from.getGroupName());
62        to.setHref(from.getHref());
63    }
64
65    protected String getTableName() {
66        return "persistentcomponents";
67    };
68
69    private boolean compare(String s, Number n) {
70        return ("" + s).equals("" + n);
71    }
72
73    private String toString(Number n) {
74        if (n == null)
75            return null;
76        return n.toString();
77    }
78
79    private BaseDescription castDown(BaseDescription c) {
80        // JPA will save only BaseComponent instances, not derived classes
81        if (c instanceof ComponentDescription
82                || c instanceof ProfileDescription) {
83            BaseDescription copy = new BaseDescription();
84            ComponentUtils.copyPropertiesFrom(c, copy);
85            return copy;
86        }
87        return c;
88    }
89
90    /**
91     * Update {@link BaseDescription#getCommentsCount()} (which is a transient
92     * property) with the number of comments for that component and load
93     * {@link BaseDescription#getContent()}
94     *
95     * @param baseDescription
96     */
97    private void augment(BaseDescription baseDescription) {
98        if (baseDescription == null)
99            return;
100        int count = (int) commentsDao.findCommentCountForComponent(baseDescription
101                .getId());
102        baseDescription.setCommentsCount(count);
103        baseDescription.setContent(jpaComponentDao.findContentByComponentId(baseDescription
104                .getId()));
105    }
106
107/**
108     * Update {@link BaseDescription#getCommentsCount()
109     * @param baseDescription
110     */
111    private List<BaseDescription> augment(List<BaseDescription> baseDescription) {
112        if (baseDescription.isEmpty()) {
113            return baseDescription;
114        }
115        Map<String, BaseDescription> map = new HashMap<String, BaseDescription>();
116        List<String> idlist = new ArrayList<String>();
117        for (BaseDescription c:baseDescription) {
118            idlist.add(c.getId());
119            map.put(c.getId(), c);
120        }
121        List<Object[]> tuples = commentsDao
122                .findCommentCountForComponents(idlist);
123        for (Object[] tuple : tuples) {
124            String id = tuple[0].toString();
125            int count = Integer.parseInt(tuple[1].toString());
126            map.get(id).setCommentsCount(count);
127        }
128        return baseDescription;
129    }
130
131    /**
132     *
133     * @param cmdId
134     *            CMD id
135     * @return Whether the specified item is in the public space
136     */
137    @Override
138    public boolean isPublic(String cmdId) {
139        BaseDescription baseDescription = jpaComponentDao.findByComponentId(cmdId);
140        return baseDescription != null && baseDescription.isPublic();
141    }
142
143    /**
144     *
145     * @param cmdId
146     *            CMD id
147     * @param userId
148     *            User db id of workspace owner
149     * @return Whether the specified item is in the specified user's workspace
150     */
151    @Override
152    public boolean isInUserSpace(String cmdId, Number userId) {
153        BaseDescription baseDescription = jpaComponentDao.findByComponentId(cmdId);
154        boolean b = baseDescription != null && !baseDescription.isPublic()
155                && compare(baseDescription.getUserId(), userId);
156        return b;
157    }
158
159    /**
160     *
161     * @param cmdId
162     *            CMD id
163     * @param userId
164     *            User db id of workspace owner, null for public registry
165     * @return Whether the specified item is in the specified workspace (user or
166     *         public)
167     */
168//    @Override
169//    public boolean isAccessible(String cmdId, Number userId) {
170//      if (userId == null) {
171//          return this.isPublic(cmdId);
172//      } else {
173//          return this.isInUserSpace(cmdId, userId);
174//      }
175//    }
176
177    /**
178     *
179     * @param cmdId
180     *            Profile or component Id (not primary key)
181     * @return String value of XML content for profile or component
182     */
183    @Override
184    public String getContent(boolean isDeleted, String cmdId) {
185        return jpaComponentDao.findContentByComponentId(cmdId, isDeleted);
186    }
187
188    /**
189     * @param description
190     *            Description to insert
191     * @param content
192     *            Content to insert and refer to from description
193     * @return Id of newly inserted description
194     */
195    @Override
196    public Number insertDescription(BaseDescription description, String content,
197            boolean isPublic, Number userId) {
198
199        if (description.getId() != null
200                && jpaComponentDao.findByComponentId(description.getId()) != null) {
201            throw new IllegalArgumentException("Component "
202                    + description.getId() + " already in DB");
203        }
204        if (content == null)
205            content = "";
206        BaseDescription copy = castDown(description);
207        copy.setContent(content);
208        copy.setPublic(isPublic);
209        copy.setUserId(toString(userId));
210        copy.setCreatorName(description.getCreatorName());
211        copy = jpaComponentDao.saveAndFlush(copy);
212        jpaComponentDao.updateContent(copy.getId(), content);
213        return copy.getDbId();
214    }
215
216    /**
217     * Updates a description by database id
218     *
219     * @param id
220     *            Id (key) of description record
221     * @param description
222     *            New values for description (leave null to not change)
223     * @param content
224     *            New content for description (leave null to not change)
225     */
226    @Override
227    public void updateDescription(Number id, BaseDescription description,
228            String content) {
229        if (content == null)
230            content = "";
231        if (description != null) {
232            // Update description
233            BaseDescription copy = jpaComponentDao.findByComponentId(description
234                    .getId());
235            copyPersistentProperties(description, copy);
236            jpaComponentDao.saveAndFlush(copy);
237            jpaComponentDao.updateContent(copy.getId(), content);
238        }
239
240        if (content != null) {
241            BaseDescription copy = jpaComponentDao.findOne(id.longValue());
242            copy.setContent(content);
243            jpaComponentDao.saveAndFlush(copy);
244            jpaComponentDao.updateContent(copy.getId(), content);
245        }
246    }
247
248    /**
249     * Retrieves description by it's primary key Id
250     *
251     * @param id
252     *            Description key
253     * @return The description, if it exists; null otherwise
254     */
255    @Override
256    public BaseDescription getById(Number id) {
257        BaseDescription baseDescription = jpaComponentDao.findOne(id.longValue());
258        if (baseDescription != null && !baseDescription.isDeleted()) {
259            augment(baseDescription);
260            return baseDescription;
261        }
262        return null;
263    }
264
265    /**
266     * Get by ComponentId / ProfileId, whether in userspace or public
267     *
268     * @param id
269     *            Full component id
270     * @return The description, if it exists; null otherwise
271     */
272    @Override
273    public BaseDescription getByCmdId(String id) {
274        BaseDescription baseDescription = jpaComponentDao.findByComponentId(id);
275        if (baseDescription != null && !baseDescription.isDeleted()) {
276            augment(baseDescription);
277            return baseDescription;
278        }
279        return null;
280    }
281
282 
283    /**
284     *
285     * @param cmdId
286     *            CMD Id of description
287     * @return Database id for description record
288     */
289    @Override
290    public Number getDbId(String cmdId) {
291        Number id = null;
292        BaseDescription c = jpaComponentDao.findByComponentId(cmdId);
293        if (c != null)
294            id = c.getDbId();
295        return id;
296    }
297
298    /**
299     *
300     * @return All descriptions in the public space. Won't include xml content
301     *         and comments count.
302     */
303    @Override
304    public List<BaseDescription> getPublicDescriptions() {
305        return augment(jpaComponentDao.findPublicItems());
306    }
307
308    /**
309     * @return List of deleted descriptions in user space or in public when
310     *         userId=null. Won't include xml content and comments count.
311     * @param userId
312     */
313    @Override
314    public List<BaseDescription> getDeletedDescriptions(Number userId) {
315        List<BaseDescription> list = null;
316        if (userId != null) {
317            list = jpaComponentDao.findDeletedItemsForUser(userId.longValue());
318        } else {
319            list = jpaComponentDao.findPublicDeletedItems();
320        }
321        list = augment(list);
322        return list;
323    }
324
325    /**
326     *
327     * @return All the user's descriptions not in the public space .Won't
328     *         include xml content and comments count.
329     */
330    @Override
331    public List<BaseDescription> getPrivateBaseDescriptions(Number userId, String prefix) {
332        return augment(jpaComponentDao.findItemsForUserThatAreNotInGroups(userId.longValue(),prefix + "%"));
333        //return augment(jpaComponentDao.findNotPublishedUserItems(userId.longValue(),prefix + "%"));
334    }
335
336   
337    @Override
338    public void setDeleted(BaseDescription desc, boolean isDeleted) {
339        BaseDescription copy = jpaComponentDao.findByComponentId(desc.getId());
340        copy.setDeleted(isDeleted);
341        jpaComponentDao.saveAndFlush(copy);
342    }
343
344    @Override
345    public void setPublished(Number id, boolean published) {
346        BaseDescription copy = jpaComponentDao.findOne(id.longValue());
347        copy.setPublic(published);
348        jpaComponentDao.saveAndFlush(copy);
349    }
350
351    /**
352     *
353     * @param id
354     *            Id of description record
355     * @return Principal name of description's owner, if any. Otherwise, null.
356     */
357    @Override
358    public String getOwnerPrincipalName(Number id) {
359        BaseDescription baseDescription = getById(id);
360        if (baseDescription == null)
361            return null;
362
363        long userId = baseDescription.getDbUserId();
364        RegistryUser user = userDao.findOne(userId);
365        if (user == null)
366            return null;
367
368        return user.getPrincipalName();
369    }
370
371    @Override
372    public List<BaseDescription> getPublicBaseDescriptions(String prefix) {
373        return augment(jpaComponentDao.findPublishedItems(prefix + "%"));
374    }
375
376   
377    @Override
378    public List<String> getAllNonDeletedProfileIds() {
379        return jpaComponentDao.findNonDeletedItemIds(ProfileDescription.PROFILE_PREFIX+"%");
380    }
381
382    @Override
383    public List<String> getAllNonDeletedComponentIds() {
384        return jpaComponentDao.findNonDeletedItemIds(ComponentDescription.COMPONENT_PREFIX+"%");
385    }
386   
387    @Override
388    public List<BaseDescription> getAllNonDeletedDescriptions() {
389        return jpaComponentDao.findNonDeletedDescriptions();
390    }
391   
392    // Olha was here
393    @Override
394    public List<String> getAllItemIdsInGroup(String prefix, Long groupId) {
395        // we are ineterested only in non-published components in the group
396        return jpaComponentDao.findAllItemIdsInGroup(false, prefix + "%", groupId);
397    }
398   
399   
400}
Note: See TracBrowser for help on using the repository browser.