View Javadoc

1   /*
2    * Copyright 2000-2005 The Apache Software Foundation.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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  	// NOT USED
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 }