Project

General

Profile

1
package eu.dnetlib.enabling.is.sn.resourcestate.hib;
2

    
3
import java.util.Collection;
4
import java.util.List;
5

    
6
import org.apache.commons.lang.StringUtils;
7
import org.apache.commons.logging.Log;
8
import org.apache.commons.logging.LogFactory;
9
import org.hibernate.Criteria;
10
import org.hibernate.SessionFactory;
11
import org.hibernate.criterion.Example;
12
import org.springframework.beans.factory.annotation.Required;
13
import org.springframework.cache.annotation.CacheEvict;
14
import org.springframework.cache.annotation.Cacheable;
15
import org.springframework.transaction.annotation.Transactional;
16

    
17
import com.google.common.base.Function;
18
import com.google.common.collect.Collections2;
19

    
20
import eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateSubscription;
21
import eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateSubscriptionDAO;
22

    
23
/**
24
 * Hibernate storage for resource state subscriptions.
25
 * 
26
 * @author marko
27
 * 
28
 */
29
public class HibernateResourceStateSubscriptionDAOImpl implements ResourceStateSubscriptionDAO {
30

    
31
	private static final Log log = LogFactory.getLog(HibernateResourceStateSubscriptionDAOImpl.class);
32

    
33
	private SessionFactory sessionFactory;
34

    
35
	private Collection<ResourceStateSubscription> transformToSubscription(final List<Object> inputList) {
36
		return Collections2.transform(inputList, new Function<Object, ResourceStateSubscription>() {
37

    
38
			@Override
39
			public ResourceStateSubscription apply(final Object input) {
40

    
41
				return (ResourceStateSubscription) input;
42
			}
43

    
44
		});
45
	}
46

    
47
	/**
48
	 * {@inheritDoc}
49
	 * 
50
	 * @see eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateSubscriptionDAO#listSubscriptions(java.lang.String, java.lang.String,
51
	 *      java.lang.String)
52
	 */
53
	@Override
54
	@Cacheable("subscriptions")
55
	@Transactional(readOnly = true)
56
	public Collection<ResourceStateSubscription> listSubscriptions(final String prefix, final String resourceType, final String resourceId) {
57

    
58
		log.info(String.format("uncached list subscriptions [prefix: %s, resourceType: %s, resourceId: %s]", prefix, resourceType, resourceId));
59

    
60
		final ResourceStateSubscription exampleEntity = new ResourceStateSubscription();
61
		exampleEntity.setPrefix(prefix);
62
		exampleEntity.setType(resourceType);
63
		exampleEntity.setResourceId(resourceId);
64

    
65
		return transformToSubscription(queryByCriteria(exampleEntity));
66
	}
67

    
68
	/**
69
	 * {@inheritDoc}
70
	 * 
71
	 * @see eu.dnetlib.enabling.is.sn.SubscriptionDAO#addSubscription(java.lang.Object)
72
	 */
73
	@Override
74
	@CacheEvict(value = "subscriptions", allEntries = true)
75
	@Transactional
76
	public void addSubscription(final ResourceStateSubscription subscription) {
77

    
78
		log.info("evict cached subscriptions");
79

    
80
		getSessionFactory().getCurrentSession().save(subscription);
81
	}
82

    
83
	/**
84
	 * {@inheritDoc}
85
	 * 
86
	 * @see eu.dnetlib.enabling.is.sn.SubscriptionDAO#getSubscription(java.lang.String)
87
	 */
88
	@Override
89
	@Transactional(readOnly = true)
90
	public ResourceStateSubscription getSubscription(final String subscriptionId) {
91
		return (ResourceStateSubscription) getSessionFactory().getCurrentSession().get(ResourceStateSubscription.class, subscriptionId);
92
	}
93

    
94
	/**
95
	 * {@inheritDoc}
96
	 * 
97
	 * @see eu.dnetlib.enabling.is.sn.SubscriptionDAO#listSubscriptions()
98
	 */
99
	@Override
100
	@SuppressWarnings("unchecked")
101
	@Cacheable("subscriptions")
102
	@Transactional(readOnly = true)
103
	public Collection<ResourceStateSubscription> listSubscriptions() {
104
		return getSessionFactory().getCurrentSession().createQuery("from subscriptions").list();
105
	}
106

    
107
	/**
108
	 * {@inheritDoc}
109
	 * 
110
	 * @see eu.dnetlib.enabling.is.sn.SubscriptionDAO#listSubscriptions(java.lang.String)
111
	 */
112
	@Override
113
	@Cacheable("subscriptions")
114
	@Transactional(readOnly = true)
115
	public Collection<ResourceStateSubscription> listSubscriptions(final String prefix) {
116
		final ResourceStateSubscription exampleEntity = new ResourceStateSubscription();
117
		exampleEntity.setPrefix(prefix);
118

    
119
		return transformToSubscription(queryByCriteria(exampleEntity));
120
	}
121

    
122
	/**
123
	 * {@inheritDoc}
124
	 * 
125
	 * @see eu.dnetlib.enabling.is.sn.SubscriptionDAO#removeSubscription(java.lang.String)
126
	 */
127
	@Override
128
	@CacheEvict(value = "subscriptions", allEntries = true)
129
	@Transactional
130
	public boolean removeSubscription(final String subscriptionId) {
131

    
132
		if (StringUtils.isBlank(subscriptionId)) return false;
133

    
134
		final ResourceStateSubscription entity = getSubscription(subscriptionId);
135

    
136
		if (entity == null) return false;
137

    
138
		log.info("evict cached subscriptions");
139

    
140
		getSessionFactory().getCurrentSession().delete(entity);
141
		return true;
142
	}
143

    
144
	@SuppressWarnings("unchecked")
145
	private List<Object> queryByCriteria(final ResourceStateSubscription exampleEntity) {
146
		Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(ResourceStateSubscription.class).add(Example.create(exampleEntity));
147
		return criteria.list();
148
	}
149

    
150
	public SessionFactory getSessionFactory() {
151
		return sessionFactory;
152
	}
153

    
154
	@Required
155
	public void setSessionFactory(SessionFactory sessionFactory) {
156
		this.sessionFactory = sessionFactory;
157
	}
158
}
(2-2/2)