/*******************************************************************************
* Copyright 2011 André Rouél
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package net.sf.jacclog.persistence.jpa.internal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import net.sf.jacclog.api.domain.http.ReadableHttpRequestHeader;
import net.sf.jacclog.api.domain.http.ReadableHttpRequestHeaderField;
import net.sf.jacclog.persistence.jpa.entity.HttpRequestHeaderField;
import net.sf.jacclog.persistence.jpa.entity.HttpRequestHeaderType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HttpRequestHeaderFieldRepository {
private static final Logger LOG = LoggerFactory.getLogger(HttpRequestHeaderFieldRepository.class);
private static final String PERSISTENCE_UNIT_NAME = "jacclogPU";
private final EntityManagerFactory entityManagerFactory;
private final HttpRequestHeaderTypeRepository requestHeaderTypeRepository;
public HttpRequestHeaderFieldRepository() {
entityManagerFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
requestHeaderTypeRepository = new HttpRequestHeaderTypeRepository(entityManagerFactory);
}
public HttpRequestHeaderFieldRepository(final EntityManagerFactory entityManagerFactory) {
if (entityManagerFactory == null) {
throw new IllegalArgumentException("Argument 'entityManagerFactory' can not be null.");
}
this.entityManagerFactory = entityManagerFactory;
requestHeaderTypeRepository = new HttpRequestHeaderTypeRepository(entityManagerFactory);
}
public HttpRequestHeaderFieldRepository(final Map<String, String> properties) {
if (properties == null) {
throw new IllegalArgumentException("Argument 'properties' can not be null.");
}
entityManagerFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME, properties);
requestHeaderTypeRepository = new HttpRequestHeaderTypeRepository(entityManagerFactory);
}
/**
* Counts all HTTP request headers of a specific type.
*
* @param type
* the type of a HTTP request header field
* @return number of HTTP request headers
*/
public long count(final ReadableHttpRequestHeader type) {
if (type == null) {
throw new IllegalArgumentException("Argument 'type' can not be null.");
}
final EntityManager entityManager = entityManagerFactory.createEntityManager();
final Long count = entityManager
.createQuery("SELECT count(o) FROM HttpRequestHeaderField o LEFT JOIN o.type t WHERE t.name = :type",
Long.class).setParameter("type", type.getName()).getSingleResult();
entityManager.close();
return count;
}
public long countAll() {
final EntityManager entityManager = entityManagerFactory.createEntityManager();
final Long count = entityManager.createQuery("SELECT count(o) FROM HttpRequestHeaderField o", Long.class)
.getSingleResult();
entityManager.close();
return count;
}
/**
* Finds all HTTP request headers by specifying a starting position and a maximum number of results.
*
* @param startPosition
* Position of the first result, numbered from 0
* @param maxResults
* Maximum number of results to retrieve
* @return a list of HTTP request header fields
*/
public List<HttpRequestHeaderField> find(final int startPosition, final int maxResults) {
final EntityManager entityManager = entityManagerFactory.createEntityManager();
final List<HttpRequestHeaderField> entries = entityManager
.createQuery("SELECT o FROM HttpRequestHeaderField o", HttpRequestHeaderField.class)
.setFirstResult(startPosition).setMaxResults(maxResults).getResultList();
entityManager.close();
return entries;
}
/**
* Finds a HTTP request header field by primary key.
*
* @param id
* the primary key (ID) of a HTTP request header field
* @return the found request header field or <code>null</code> if the field does not exist
*/
public HttpRequestHeaderField find(final Long id) {
if (id == null) {
throw new IllegalArgumentException("Argument 'id' can not be null.");
}
final EntityManager entityManager = entityManagerFactory.createEntityManager();
final HttpRequestHeaderField field = entityManager.find(HttpRequestHeaderField.class, id);
entityManager.close();
return field;
}
/**
* Find all HTTP request header fields within a start and end date.
*
* @param type
* the type of a HTTP request header field
* @return a list of HTTP request header fields
*/
public List<HttpRequestHeaderField> find(final ReadableHttpRequestHeader type) {
if (type == null) {
throw new IllegalArgumentException("Argument 'type' can not be null.");
}
final EntityManager entityManager = entityManagerFactory.createEntityManager();
final List<HttpRequestHeaderField> entries = entityManager
.createQuery("SELECT o FROM HttpRequestHeaderField o LEFT JOIN o.type t WHERE t.name = :type",
HttpRequestHeaderField.class).setParameter("type", type.getName()).getResultList();
entityManager.close();
return entries;
}
/**
* Finds all HTTP request headers of a specific type ordered by ID. In addition by specifying a starting position
* and maximum number of results it restricts the size of the result set.
*
* @param type
* the type of a HTTP request header field
* @param startPosition
* Position of the first result, numbered from 0
* @param maxResults
* Maximum number of results to retrieve
* @throws IllegalArgumentException
* if the given type is <code>null</code>
* @return a list of HTTP request header fields
*/
public List<HttpRequestHeaderField> find(final ReadableHttpRequestHeader type, final int startPosition,
final int maxResults) {
if (type == null) {
throw new IllegalArgumentException("Argument 'type' can not be null.");
}
final EntityManager entityManager = entityManagerFactory.createEntityManager();
final List<HttpRequestHeaderField> fields = entityManager
.createQuery(
"SELECT o FROM HttpRequestHeaderField o LEFT JOIN o.type t WHERE t.name = :type ORDER BY o.id",
HttpRequestHeaderField.class).setParameter("type", type.getName())
.setFirstResult(startPosition).setMaxResults(maxResults).getResultList();
entityManager.close();
return fields;
}
/**
* Finds a HTTP request header field by type and value.
*
* @param type
* the type of a HTTP request header field
* @param value
* the value of a HTTP request header field
* @throws IllegalArgumentException
* if the given arguments are <code>null</code>
* @return the HTTP request header field or <code>null</code>, if nothing is found
*/
public HttpRequestHeaderField find(final ReadableHttpRequestHeader type, final String value) {
if (type == null) {
throw new IllegalArgumentException("Argument 'type' can not be null.");
}
if (value == null) {
throw new IllegalArgumentException("Argument 'value' can not be null.");
}
final EntityManager entityManager = entityManagerFactory.createEntityManager();
HttpRequestHeaderField entry = null;
try {
entry = entityManager
.createQuery(
"SELECT o FROM HttpRequestHeaderField o LEFT JOIN o.type t WHERE t.name = :type AND o.value = :value",
HttpRequestHeaderField.class).setParameter("type", type.getName())
.setParameter("value", value).getSingleResult();
} catch (final NoResultException e) {
LOG.debug("The HTTP request header field with the type '" + type.getName() + "' and value '" + value
+ "' does not exist. (" + e.getLocalizedMessage() + ")");
} finally {
entityManager.close();
}
return entry;
}
/**
* Finds a HTTP request header field by the type and value of the given (readable) field.
*
* @param field
* the readable HTTP request header field
* @throws IllegalArgumentException
* if the given argument is <code>null</code>
* @return the HTTP request header field or <code>null</code>, if nothing is found
*/
public HttpRequestHeaderField find(final ReadableHttpRequestHeaderField field) {
if (field == null) {
throw new IllegalArgumentException("Argument 'field' can not be null.");
}
return find(field.getType(), field.getValue());
}
/**
* Reads all HTTP request header fields within the repository.
*
* @return a list of all HTTP request header fields
*/
public List<HttpRequestHeaderField> findAll() {
final EntityManager entityManager = entityManagerFactory.createEntityManager();
final List<HttpRequestHeaderField> fields = entityManager.createQuery("SELECT o FROM HttpRequestHeaderField o",
HttpRequestHeaderField.class).getResultList();
entityManager.close();
return fields;
}
/**
* Updates the given field within the persisted one in the repository.
*
* @param field
* the HTTP request header field to be updated
* @return the updated HTTP request header field or <code>null</code> if the merge process failed
*/
public HttpRequestHeaderField merge(final HttpRequestHeaderField field) {
if (field == null) {
throw new IllegalArgumentException("Argument 'field' must be set.");
}
HttpRequestHeaderField merged = null;
final EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
try {
merged = entityManager.merge(field);
entityManager.getTransaction().commit();
} catch (final RuntimeException e1) {
if (entityManager.getTransaction().isActive()) {
try {
entityManager.getTransaction().rollback();
} catch (final RuntimeException e2) {
// Log rollback failure or something
throw e2;
}
}
throw e1;
} finally {
if (entityManager != null) {
entityManager.clear();
entityManager.close();
}
}
return merged;
}
public void persist(final Collection<HttpRequestHeaderField> fields) {
if (fields == null) {
throw new IllegalArgumentException("Argument 'fields' can not be null.");
}
final EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
try {
for (final HttpRequestHeaderField field : fields) {
persistType(field);
entityManager.persist(field);
}
entityManager.getTransaction().commit();
} catch (final RuntimeException e1) {
if (entityManager.getTransaction().isActive()) {
try {
entityManager.getTransaction().rollback();
} catch (final RuntimeException e2) {
// Log rollback failure or something
throw e2;
}
}
throw e1;
} finally {
if (entityManager != null) {
entityManager.clear();
entityManager.close();
}
}
}
public void persist(final HttpRequestHeaderField field) {
if (field == null) {
throw new IllegalArgumentException("Argument 'field' must be set.");
}
if (field.getType() == null) {
throw new IllegalArgumentException("The type of an header field can not be null.");
}
if (field.getValue() == null) {
throw new IllegalArgumentException("The value of an header field can not be null.");
}
final EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
try {
persistType(field);
entityManager.persist(field);
entityManager.getTransaction().commit();
} catch (final RuntimeException e1) {
if (entityManager.getTransaction().isActive()) {
try {
entityManager.getTransaction().rollback();
} catch (final RuntimeException e2) {
// Log rollback failure or something
throw e2;
}
}
throw e1;
} finally {
if (entityManager != null) {
entityManager.clear();
entityManager.close();
}
}
}
private void persistType(final HttpRequestHeaderField field) {
final HttpRequestHeaderType attached = requestHeaderTypeRepository.find(field.getType());
if (attached == null) {
final HttpRequestHeaderType entity = field.getHttpRequestHeaderType();
try {
requestHeaderTypeRepository.persist(entity);
} catch (final RuntimeException e) {
LOG.info(e.getLocalizedMessage() + ": " + entity, e);
}
} else {
field.setHttpRequestHeaderType(attached);
}
}
public void remove(final HttpRequestHeaderField entry) {
if (entry == null) {
throw new IllegalArgumentException("Argument 'entry' can not be null.");
}
if (entry.getId() == null) {
throw new IllegalArgumentException("The ID for an log entry can not be null.");
}
final EntityManager entityManager = entityManagerFactory.createEntityManager();
final HttpRequestHeaderField attached = entityManager.find(HttpRequestHeaderField.class, entry.getId());
entityManager.getTransaction().begin();
try {
entityManager.remove(attached);
entityManager.getTransaction().commit();
} catch (final RuntimeException e1) {
if (entityManager.getTransaction().isActive()) {
try {
entityManager.getTransaction().rollback();
} catch (final RuntimeException e2) {
// Log rollback failure or something
throw e2;
}
}
throw e1;
} finally {
if (entityManager != null) {
entityManager.clear();
entityManager.close();
}
}
}
public void remove(final List<HttpRequestHeaderField> types) {
if (types == null || types.isEmpty()) {
throw new IllegalArgumentException("Argument 'entries' can not be null or empty.");
}
final EntityManager entityManager = entityManagerFactory.createEntityManager();
final List<HttpRequestHeaderField> attached = new ArrayList<HttpRequestHeaderField>(types.size());
for (final HttpRequestHeaderField type : types) {
attached.add(entityManager.find(HttpRequestHeaderField.class, type.getId()));
}
entityManager.getTransaction().begin();
try {
for (final HttpRequestHeaderField type : attached) {
entityManager.remove(type);
}
entityManager.getTransaction().commit();
} catch (final RuntimeException e1) {
if (entityManager.getTransaction().isActive()) {
try {
entityManager.getTransaction().rollback();
} catch (final RuntimeException e2) {
// Log rollback failure or something
throw e2;
}
}
throw e1;
} finally {
if (entityManager != null) {
entityManager.clear();
entityManager.close();
}
}
}
public void start() {
LOG.debug("Starting HttpRequestHeaderFieldRepository...");
}
public void stop() {
LOG.debug("Closing EntityManagerFactory of HttpRequestHeaderFieldRepository...");
if (entityManagerFactory != null) {
entityManagerFactory.close();
}
}
}