1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.portals.graffito.jcr.persistence.collectionconverter.impl;
18
19 import java.util.Map;
20
21 import javax.jcr.ItemExistsException;
22 import javax.jcr.Node;
23 import javax.jcr.PathNotFoundException;
24 import javax.jcr.RepositoryException;
25 import javax.jcr.Session;
26 import javax.jcr.lock.LockException;
27 import javax.jcr.nodetype.ConstraintViolationException;
28 import javax.jcr.version.VersionException;
29
30 import org.apache.portals.graffito.jcr.exception.JcrMappingException;
31 import org.apache.portals.graffito.jcr.exception.PersistenceException;
32 import org.apache.portals.graffito.jcr.mapper.Mapper;
33 import org.apache.portals.graffito.jcr.mapper.model.CollectionDescriptor;
34 import org.apache.portals.graffito.jcr.persistence.collectionconverter.CollectionConverter;
35 import org.apache.portals.graffito.jcr.persistence.collectionconverter.ManageableCollection;
36 import org.apache.portals.graffito.jcr.persistence.objectconverter.ObjectConverter;
37 import org.apache.portals.graffito.jcr.reflection.ReflectionUtils;
38
39 /***
40 * Abstract class used for all CollectionConverter
41 *
42 * @author <a href="mailto:christophe.lombart@gmail.com">Christophe Lombart</a>
43 * @author <a href='mailto:the_mindstorm[at]evolva[dot]ro'>Alexandru Popescu</a>
44 */
45 public abstract class AbstractCollectionConverterImpl implements CollectionConverter {
46 protected Map atomicTypeConverters;
47 protected ObjectConverter objectConverter;
48
49 protected Mapper mapper;
50
51 /***
52 * Constructor
53 *
54 * @param atomicTypeConverters The atomic type converter to used
55 * @param objectConverter The object converter to used
56 * @param mapper The mapper to used
57 */
58 public AbstractCollectionConverterImpl(Map atomicTypeConverters, ObjectConverter objectConverter, Mapper mapper) {
59 this.atomicTypeConverters = atomicTypeConverters;
60 this.objectConverter = objectConverter;
61 this.mapper = mapper;
62 }
63
64 protected abstract void doInsertCollection(Session session, Node parentNode, CollectionDescriptor descriptor,
65 ManageableCollection collection) throws RepositoryException;
66
67 protected abstract void doUpdateCollection(Session session, Node parentNode, CollectionDescriptor descriptor,
68 ManageableCollection collection) throws RepositoryException;
69
70 protected abstract ManageableCollection doGetCollection(Session session, Node parentNode,
71 CollectionDescriptor collectionDescriptor, Class collectionFieldClass) throws RepositoryException;
72
73 protected abstract boolean doIsNull(Session session, Node parentNode, CollectionDescriptor collectionDescriptor,
74 Class collectionFieldClass) throws RepositoryException;
75
76 /***
77 * @see org.apache.portals.graffito.jcr.persistence.collectionconverter.CollectionConverter#insertCollection(javax.jcr.Session, javax.jcr.Node, org.apache.portals.graffito.jcr.mapper.model.CollectionDescriptor, org.apache.portals.graffito.jcr.persistence.collectionconverter.ManageableCollection)
78 */
79 public void insertCollection(Session session, Node parentNode, CollectionDescriptor collectionDescriptor,
80 ManageableCollection collection) {
81 try {
82 doInsertCollection(session, parentNode, collectionDescriptor, collection);
83 } catch (ItemExistsException iee) {
84 throw new PersistenceException("Cannot insert collection field : " + collectionDescriptor.getFieldName()
85 + " of class " + collectionDescriptor.getClassDescriptor().getClassName() + ". An item already exists.", iee);
86 } catch (PathNotFoundException pnfe) {
87 throw new PersistenceException("Cannot insert collection field : " + collectionDescriptor.getFieldName()
88 + " of class " + collectionDescriptor.getClassDescriptor().getClassName(), pnfe);
89 } catch (VersionException ve) {
90 throw new PersistenceException("Cannot insert collection field : " + collectionDescriptor.getFieldName()
91 + " of class " + collectionDescriptor.getClassDescriptor().getClassName(), ve);
92 } catch (ConstraintViolationException cve) {
93 throw new PersistenceException("Cannot insert collection field : " + collectionDescriptor.getFieldName()
94 + " of class " + collectionDescriptor.getClassDescriptor().getClassName() + ". Constraint violation.", cve);
95 } catch (LockException le) {
96 throw new PersistenceException("Cannot insert collection field : " + collectionDescriptor.getFieldName()
97 + " of class " + collectionDescriptor.getClassDescriptor().getClassName() + " on locked parent.", le);
98 } catch (RepositoryException re) {
99 throw new org.apache.portals.graffito.jcr.exception.RepositoryException("Cannot insert collection field : "
100 + collectionDescriptor.getFieldName() + " of class "
101 + collectionDescriptor.getClassDescriptor().getClassName(), re);
102 }
103 }
104
105 /***
106 *
107 * @see org.apache.portals.graffito.jcr.persistence.collectionconverter.CollectionConverter#updateCollection(javax.jcr.Session, javax.jcr.Node, org.apache.portals.graffito.jcr.mapper.model.CollectionDescriptor, org.apache.portals.graffito.jcr.persistence.collectionconverter.ManageableCollection)
108 */
109 public void updateCollection(Session session, Node parentNode, CollectionDescriptor collectionDescriptor,
110 ManageableCollection collection) {
111 try {
112
113 doUpdateCollection(session, parentNode, collectionDescriptor, collection);
114 } catch (VersionException ve) {
115 throw new PersistenceException("Cannot insert collection field : " + collectionDescriptor.getFieldName()
116 + " of class " + collectionDescriptor.getClassDescriptor().getClassName(), ve);
117 } catch (LockException le) {
118 throw new PersistenceException("Cannot insert collection field : " + collectionDescriptor.getFieldName()
119 + " of class " + collectionDescriptor.getClassDescriptor().getClassName() + " on locked node", le);
120 } catch (ConstraintViolationException cve) {
121 throw new PersistenceException("Cannot insert collection field : " + collectionDescriptor.getFieldName()
122 + " of class " + collectionDescriptor.getClassDescriptor().getClassName() + " Constraint violation.", cve);
123 } catch (RepositoryException re) {
124 throw new org.apache.portals.graffito.jcr.exception.RepositoryException("Cannot insert collection field : "
125 + collectionDescriptor.getFieldName() + " of class "
126 + collectionDescriptor.getClassDescriptor().getClassName(), re);
127 }
128 }
129
130 /***
131 * @see org.apache.portals.graffito.jcr.persistence.collectionconverter.CollectionConverter#getCollection(javax.jcr.Session, javax.jcr.Node, org.apache.portals.graffito.jcr.mapper.model.CollectionDescriptor, java.lang.Class)
132 */
133 public ManageableCollection getCollection(Session session, Node parentNode, CollectionDescriptor collectionDescriptor,
134 Class collectionFieldClass) {
135 try {
136 return doGetCollection(session, parentNode, collectionDescriptor, collectionFieldClass);
137 } catch (RepositoryException re) {
138 throw new org.apache.portals.graffito.jcr.exception.RepositoryException("Cannot get collection field : "
139 + collectionDescriptor.getFieldName() + "for " + collectionDescriptor.getClassDescriptor().getClassName(), re);
140 }
141 }
142
143 /***
144 * @see org.apache.portals.graffito.jcr.persistence.collectionconverter.CollectionConverter#isNull(Session, Node, CollectionDescriptor, Class)
145 */
146 public boolean isNull(Session session, Node parentNode, CollectionDescriptor collectionDescriptor,
147 Class collectionFieldClass) {
148 try {
149 return doIsNull(session, parentNode, collectionDescriptor, collectionFieldClass);
150 } catch (RepositoryException re) {
151 throw new org.apache.portals.graffito.jcr.exception.RepositoryException("Cannot check if the collections has elements : "
152 + collectionDescriptor.getFieldName() + "for " + collectionDescriptor.getClassDescriptor().getClassName(), re);
153 }
154 }
155 protected String getCollectionJcrName(CollectionDescriptor descriptor) {
156 String jcrName = descriptor.getJcrName();
157
158 if (null == jcrName) {
159 throw new JcrMappingException("The JcrName attribute is not defined for the CollectionDescriptor : "
160 + descriptor.getFieldName());
161 }
162
163 return jcrName;
164 }
165 }