View Javadoc

1   /**
2    * Copyright (c) 2009-2010, Elias Gomes. All rights reserved.
3    * 
4    * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
5    * following conditions are met:
6    * 
7    * - Redistributions of source code must retain the above copyright notice, this list of conditions and the following
8    * disclaimer.
9    * 
10   * - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
11   * disclaimer in the documentation and/or other materials provided with the distribution.
12   * 
13   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
14   * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
15   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
16   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
17   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
18   * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
19   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
20   */
21  package net.sourceforge.mystique.infrastructure.persistence;
22  
23  import java.util.List;
24  
25  import javax.persistence.NoResultException;
26  import javax.persistence.Query;
27  
28  import net.sourceforge.mystique.domain.entity.Component;
29  import net.sourceforge.mystique.domain.entity.Project;
30  import net.sourceforge.mystique.domain.repository.ComponentRepository;
31  import net.sourceforge.mystique.domain.repository.RepositoryException;
32  
33  import org.springframework.dao.DataIntegrityViolationException;
34  import org.springframework.stereotype.Repository;
35  import org.springframework.transaction.annotation.Transactional;
36  
37  /**
38   * @author Elias Gomes [eliasgomes@users.sourceforge.net]
39   */
40  @Repository
41  public class ComponentJpaRepository extends JpaRepository<Component, Long> implements ComponentRepository {
42  
43  	@Override
44  	@Transactional(readOnly = true)
45  	public Component findById(Long id) throws RepositoryException {
46  
47  		return entityManager.find(Component.class, id);
48  
49  	}
50  
51  	@Override
52  	@Transactional(readOnly = true)
53  	@SuppressWarnings("unchecked")
54  	public List<Component> findByProject(Project project, int offset, int limit) throws RepositoryException {
55  
56  		Query query = entityManager.createNamedQuery("Component.findByProject");
57  		query.setParameter("project", project);
58  
59  		query.setFirstResult(offset);
60  		query.setMaxResults(limit);
61  
62  		return query.getResultList();
63  
64  	}
65  
66  	@Override
67  	@Transactional(readOnly = true)
68  	public Component findByProjectAndName(Project project, String name) throws RepositoryException {
69  
70  		Query query = entityManager.createNamedQuery("Component.findByProjectAndName");
71  		query.setParameter("project", project);
72  		query.setParameter("name", name);
73  
74  		return (Component) query.getSingleResult();
75  
76  	}
77  
78  	@Override
79  	@Transactional
80  	public void store(Component component) throws RepositoryException {
81  
82  		try {
83  
84  			Component storedComponent = findByProjectAndName(component.getProject(), component.getName());
85  
86  			if (storedComponent != null && !storedComponent.getId().equals(component.getId())) {
87  				throw new DataIntegrityViolationException("exception.componentAlreadyRegistred");
88  			}
89  
90  		} catch (NoResultException e) {
91  
92  			entityManager.persist(component);
93  
94  			if (component.getId() != null) {
95  				entityManager.merge(component);
96  			}
97  
98  			entityManager.flush();
99  
100 		}
101 
102 	}
103 
104 }