1 17 package org.alfresco.jcr.item.property; 18 19 import java.io.Serializable ; 20 import java.util.ArrayList ; 21 import java.util.HashMap ; 22 import java.util.List ; 23 import java.util.Map ; 24 25 import javax.jcr.PathNotFoundException; 26 27 import org.alfresco.jcr.item.NodeImpl; 28 import org.alfresco.jcr.item.PropertyImpl; 29 import org.alfresco.model.ContentModel; 30 import org.alfresco.service.cmr.repository.NodeService; 31 import org.alfresco.service.namespace.QName; 32 import org.alfresco.service.namespace.QNamePattern; 33 34 35 40 public class PropertyResolver 41 { 42 43 private static Map <QName, QName> virtualProperties = new HashMap <QName, QName>(); 44 static 45 { 46 virtualProperties.put(JCRUUIDProperty.PROPERTY_NAME, null); 47 virtualProperties.put(JCRPrimaryTypeProperty.PROPERTY_NAME, null); 48 virtualProperties.put(JCRMixinTypesProperty.PROPERTY_NAME, null); 49 virtualProperties.put(JCRLockOwnerProperty.PROPERTY_NAME, ContentModel.ASPECT_LOCKABLE); 50 virtualProperties.put(JCRLockIsDeepProperty.PROPERTY_NAME, ContentModel.ASPECT_LOCKABLE); 51 52 } 54 55 56 61 public static List <PropertyImpl> createProperties(NodeImpl node, QNamePattern pattern) 62 { 63 NodeService nodeService = node.getSessionImpl().getRepositoryImpl().getServiceRegistry().getNodeService(); 65 Map <QName, Serializable > properties = nodeService.getProperties(node.getNodeRef()); 66 List <PropertyImpl> propertyList = new ArrayList <PropertyImpl>(properties.size()); 67 for (Map.Entry <QName, Serializable > entry : properties.entrySet()) 68 { 69 QName propertyName = entry.getKey(); 70 if (pattern == null || pattern.isMatch(propertyName)) 71 { 72 Serializable value = entry.getValue(); 73 if (value != null) 74 { 75 PropertyImpl property = new PropertyImpl(node, propertyName); 76 propertyList.add(property); 77 } 78 } 79 } 80 81 for (Map.Entry <QName, QName> virtualProperty : virtualProperties.entrySet()) 83 { 84 boolean addJCRProperty = false; 85 if (virtualProperty.getValue() == null) 86 { 87 addJCRProperty = true; 88 } 89 else 90 { 91 addJCRProperty = nodeService.hasAspect(node.getNodeRef(), virtualProperty.getValue()); 92 } 93 94 if (addJCRProperty && (pattern == null || pattern.isMatch(virtualProperty.getKey()))) 95 { 96 propertyList.add(createVirtualProperty(node, virtualProperty.getKey())); 97 } 98 } 99 100 return propertyList; 101 } 102 103 104 112 public static PropertyImpl createProperty(NodeImpl node, QName propertyName) 113 throws PathNotFoundException 114 { 115 if (hasVirtualProperty(node, propertyName)) 117 { 118 return createVirtualProperty(node, propertyName); 119 } 120 121 NodeService nodeService = node.getSessionImpl().getRepositoryImpl().getServiceRegistry().getNodeService(); 123 Serializable value = nodeService.getProperty(node.getNodeRef(), propertyName); 124 if (value == null) 125 { 126 throw new PathNotFoundException("Property path " + propertyName + " not found from node " + node.getNodeRef()); 127 } 128 129 PropertyImpl propertyImpl = new PropertyImpl(node, propertyName); 131 return propertyImpl; 132 } 133 134 135 private static PropertyImpl createVirtualProperty(NodeImpl node, QName propertyName) 136 { 137 if (propertyName.equals(JCRUUIDProperty.PROPERTY_NAME)) 138 { 139 return new JCRUUIDProperty(node); 140 } 141 if (propertyName.equals(JCRPrimaryTypeProperty.PROPERTY_NAME)) 142 { 143 return new JCRPrimaryTypeProperty(node); 144 } 145 if (propertyName.equals(JCRMixinTypesProperty.PROPERTY_NAME)) 146 { 147 return new JCRMixinTypesProperty(node); 148 } 149 if (propertyName.equals(JCRLockOwnerProperty.PROPERTY_NAME)) 150 { 151 return new JCRLockOwnerProperty(node); 152 } 153 if (propertyName.equals(JCRLockIsDeepProperty.PROPERTY_NAME)) 154 { 155 return new JCRLockIsDeepProperty(node); 156 } 157 158 return null; 159 } 160 161 162 169 public static boolean hasProperty(NodeImpl node, QName propertyName) 170 { 171 if (hasVirtualProperty(node, propertyName)) 172 { 173 return true; 174 } 175 176 NodeService nodeService = node.getSessionImpl().getRepositoryImpl().getServiceRegistry().getNodeService(); 177 Serializable value = nodeService.getProperty(node.getNodeRef(), propertyName); 178 return value != null; 179 } 180 181 182 private static boolean hasVirtualProperty(NodeImpl node, QName propertyName) 183 { 184 if (virtualProperties.containsKey(propertyName)) 186 { 187 QName aspect = virtualProperties.get(propertyName); 189 if (aspect == null) 190 { 191 return true; 193 } 194 195 NodeService nodeService = node.getSessionImpl().getRepositoryImpl().getServiceRegistry().getNodeService(); 197 return nodeService.hasAspect(node.getNodeRef(), aspect); 198 } 199 200 return false; 202 } 203 204 } 205 | Popular Tags |