blob: a66e20cc8bcdf54b8acaec1f02c852f04e59f669 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010-2014 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.skalli.core.feed.jpa;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import org.eclipse.skalli.commons.CollectionUtils;
import org.eclipse.skalli.services.feed.Entry;
import org.eclipse.skalli.services.feed.FeedService;
import org.eclipse.skalli.services.persistence.EntityManagerServiceBase;
import org.osgi.service.component.ComponentConstants;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class JPAFeedComponent extends EntityManagerServiceBase implements FeedService {
private static final Logger LOG = LoggerFactory.getLogger(JPAFeedComponent.class);
@Override
protected void activate(ComponentContext context) {
super.activate(context);
LOG.info(MessageFormat.format("[FeedService][jpa] {0} : activated",
(String) context.getProperties().get(ComponentConstants.COMPONENT_NAME)));
}
@Override
protected void deactivate(ComponentContext context) {
LOG.info(MessageFormat.format("[FeedService][jpa] {0} : deactivated",
(String) context.getProperties().get(ComponentConstants.COMPONENT_NAME)));
super.deactivate(context);
}
@Override
public List<Entry> findEntries(UUID projectId, int maxResults) throws IOException {
return findEntries(projectId, null, maxResults);
}
@Override
public List<Entry> findEntries(UUID projectId, Collection<String> sources, int maxResults)
throws IOException {
if (projectId == null) {
throw new IllegalArgumentException("argument 'projectId' must not be null");
}
if (maxResults < 0) {
maxResults = FeedService.SELECT_ALL;
}
if (maxResults == 0 || CollectionUtils.isBlank(sources)) {
return Collections.emptyList();
}
String jpaQuery = sources != null? EntryJPA.FIND_BY_PROJECT_AND_SOURCES : EntryJPA.FIND_BY_PROJECT_ID;
List<Entry> results = new ArrayList<Entry>();
EntityManager em = getEntityManager();
EntityTransaction tx = null;
try {
tx = em.getTransaction();
tx.begin();
Query q = em.createNamedQuery(jpaQuery);
if (maxResults > 0) {
q.setMaxResults(maxResults);
}
q.setParameter(EntryJPA.PARAM_PROJECT_ID, projectId.toString());
if (sources != null) {
q.setParameter(EntryJPA.PARAM_SOURCES, sources);
}
results = (List<Entry>) q.getResultList();
if (results == null) {
results = new ArrayList<Entry>();
}
tx.rollback();
} catch (Exception e) {
if (tx != null && tx.isActive()) {
tx.rollback();
}
throw new IOException(MessageFormat.format(
"Can''t find feed entries for project {0}", projectId.toString(), e));
} finally {
em.close();
}
return results;
}
@Override
public List<String> findSources(UUID projectId) throws IOException {
if (projectId == null) {
throw new IllegalArgumentException("argument 'projectId' must not be null");
}
List<String> results;
EntityManager em = getEntityManager();
EntityTransaction tx = null;
try {
tx = em.getTransaction();
tx.begin();
Query q = em.createNamedQuery(EntryJPA.FIND_SOURCES_BY_PROJECT_ID);
q.setParameter(EntryJPA.PARAM_PROJECT_ID, projectId.toString());
results = (List<String>) q.getResultList();
if (results == null) {
results = new ArrayList<String>();
}
tx.rollback();
} catch (Exception e) {
if (tx != null && tx.isActive()) {
tx.rollback();
}
throw new IOException(MessageFormat.format(
"Can''t find feed sources for project {0}", projectId.toString()), e);
} finally {
em.close();
}
return results;
}
}