/* * JBoss, Home of Professional Open Source * Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors * as indicated by the @authors tag. All rights reserved. */ package org.searchisko.persistence.service; import java.sql.Timestamp; import java.util.Arrays; import java.util.List; import javax.ejb.LocalBean; import javax.ejb.Stateless; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import org.searchisko.persistence.jpa.model.Tag; /** * JPA based implementation of {@link CustomTagPersistenceService}. * * @author Jiri Mauritz (jirmauritz at gmail dot com) */ @Stateless @LocalBean public class JpaCustomTagPersistenceService implements CustomTagPersistenceService { @Inject protected EntityManager em; @Override public List<Tag> getTagsByContent(String... contentId) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Tag> queryList = cb.createQuery(Tag.class); Root<Tag> tagRoot = queryList.from(Tag.class); queryList.select(tagRoot); queryList.where(cb.isTrue(tagRoot.get("contentId").in((Object[]) contentId))); TypedQuery<Tag> q = em.createQuery(queryList); return q.getResultList(); } @Override public List<Tag> getTagsByContentType(String contentType) { return em.createQuery("SELECT t FROM Tag t WHERE SUBSTRING(t.contentId, 1, ?1) = ?2") .setParameter(1, contentType.length()) .setParameter(2, contentType) .getResultList(); } @Override public boolean createTag(Tag tag) { if (!(tag instanceof Tag)) { return false; } if (tag.getTagLabel() == null) { return false; } // to lower case tag.setTagLabel(tag.getTagLabel().toLowerCase()); // check if there is same tag for the same content for (Tag item : getTagsByContent(tag.getContentId())) { if (item.getTagLabel().equals(tag.getTagLabel())) { // tag already exists return false; } } tag.setCreatedAt(new Timestamp(System.currentTimeMillis())); em.persist(tag); return true; } @Override public void deleteTag(String contentId, String tagLabel) { tagLabel = tagLabel.toLowerCase(); if ((contentId != null) && (tagLabel!= null)) { em.createQuery("delete from Tag t where t.contentId = ?1 and t.tagLabel = ?2") .setParameter(1, contentId) .setParameter(2, tagLabel) .executeUpdate(); } } @Override public void deleteTagsForContent(String... contentId) { if (contentId != null && contentId.length > 0) em.createQuery("delete from Tag t where t.contentId in ?1").setParameter(1, Arrays.asList(contentId)) .executeUpdate(); } @Override public void changeOwnershipOfTags(String contributorFrom, String contributorTo) { if (contributorFrom == null || contributorTo == null) return; List<Tag> tags = em.createQuery("FROM Tag").getResultList(); for (Tag tag : tags) { if (tag.getContributorId().equals(contributorFrom)) { tag.setContributorId(contributorTo); em.merge(tag); } } } }