1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  package org.kuali.rice.krms.impl.repository;
18  
19  import java.util.ArrayList;
20  import java.util.Collection;
21  import java.util.Collections;
22  import java.util.HashMap;
23  import java.util.List;
24  import java.util.Map;
25  
26  import org.apache.commons.collections.CollectionUtils;
27  import org.apache.commons.lang.StringUtils;
28  import org.kuali.rice.krad.service.BusinessObjectService;
29  import org.kuali.rice.krad.service.KRADServiceLocator;
30  import org.kuali.rice.krms.api.repository.type.KrmsAttributeDefinition;
31  
32  
33  public final class KrmsAttributeDefinitionServiceImpl implements KrmsAttributeDefinitionService {
34  
35      private BusinessObjectService businessObjectService;
36      private final Map<String,KrmsAttributeDefinitionBo> krmsAttributeDefinitionIdCache = Collections.synchronizedMap( new HashMap<String,KrmsAttributeDefinitionBo>() );
37  
38  	@Override
39  	
40  
41  
42  	public Map<String,String> convertAttributeKeys(Map<String,String> attributesByName, String namespace) {
43  		Map<String,String> attributesById = new HashMap<String,String>();
44  		if(attributesByName != null) {
45  			for(Map.Entry<String, String> attr : attributesByName.entrySet()) {
46  				String newKey = getKrmsAttributeId(attr.getKey(), namespace);
47  				if(StringUtils.isNotEmpty(newKey)) {
48  					attributesById.put(newKey, attr.getValue());
49  				}
50  			}
51  		}
52  		return attributesById;
53  	}
54     
55  	@Override
56  	
57  
58  
59  	public String getKrmsAttributeId( String attributeName, String namespace) {
60  		String returnId = null;
61  		KrmsAttributeDefinitionBo bo = getKrmsAttributeBo(attributeName, namespace);
62  		if (bo != null){
63  			returnId = bo.getId();
64  		}
65  		return returnId;
66  	}
67      
68  	@Override
69  	
70  
71  
72  	public KrmsAttributeDefinitionBo getKrmsAttributeBo( String attributeName, String namespace) {
73  		String key = createKey(namespace, attributeName);
74  		if (krmsAttributeDefinitionIdCache.containsKey(key))
75  			return krmsAttributeDefinitionIdCache.get(key);		
76  
77  		KrmsAttributeDefinitionBo result = null;
78  		Map<String,Object> criteria = new HashMap<String,Object>( 3 );
79  		criteria.put( "name", attributeName );
80  		criteria.put( "namespace", namespace );
81          criteria.put( "active", Boolean.TRUE );
82  		Collection<KrmsAttributeDefinitionBo> defs = getBusinessObjectService().findMatching( KrmsAttributeDefinitionBo.class, criteria );
83  		if(CollectionUtils.isNotEmpty(defs)) {
84  			if (defs.size() > 1){
85  				throw new IllegalStateException("Multiple KrmsAttributeDefinitions found with same name and namespace");
86  			}
87  			result = defs.iterator().next();
88  			krmsAttributeDefinitionIdCache.put(key, result);
89  		}
90  		return result;
91  	}
92      
93  	@Override
94  	
95  
96  
97  	public KrmsAttributeDefinition createAttributeDefinition(KrmsAttributeDefinition attributeDefinition) {
98  		if (attributeDefinition == null){
99  	        throw new IllegalArgumentException("attributeDefinition is null");
100 		}
101 		final String nameKey = attributeDefinition.getName();
102 		final String namespaceKey = attributeDefinition.getNamespace();
103 		final KrmsAttributeDefinition existing = getAttributeDefinitionByNameAndNamespace(nameKey, namespaceKey);
104 		if (existing != null && existing.getName().equals(nameKey) && existing.getNamespace().equals(namespaceKey)){
105             throw new IllegalStateException("the krms attribute definition to create already exists: " + attributeDefinition);			
106 		}
107 		
108 		KrmsAttributeDefinitionBo bo = KrmsAttributeDefinitionBo.from(attributeDefinition);
109 		getBusinessObjectService().save(bo);
110 		updateCache(bo);
111 		return KrmsAttributeDefinitionBo.to(bo);
112 	}
113 
114 	@Override
115 	
116 
117 
118 	public void updateAttributeDefinition(KrmsAttributeDefinition attributeDefinition) {
119 		if (attributeDefinition == null){
120 	        throw new IllegalArgumentException("attributeDefinition is null");
121 		}
122 		final String idKey = attributeDefinition.getId();
123 		final KrmsAttributeDefinitionBo existing = getBusinessObjectService().findBySinglePrimaryKey(KrmsAttributeDefinitionBo.class, idKey);
124 		if (existing == null){
125             throw new IllegalStateException("the krms attribute definition does not exist: " + attributeDefinition);			
126 		}
127 		final KrmsAttributeDefinition toUpdate;
128 		if (!existing.getId().equals(attributeDefinition.getId())){
129 			final KrmsAttributeDefinition.Builder builder = KrmsAttributeDefinition.Builder.create(attributeDefinition);
130 			builder.setId(existing.getId());
131 			toUpdate = builder.build();
132 		} else {
133 			toUpdate = attributeDefinition;
134 		}
135 		KrmsAttributeDefinitionBo bo = KrmsAttributeDefinitionBo.from(toUpdate);
136 		getBusinessObjectService().save(bo);
137 		updateCache(bo);
138 	}
139 
140 	@Override
141 	
142 
143 
144     public KrmsAttributeDefinition getAttributeDefinitionById(final String id) {
145         if (StringUtils.isBlank(id)) {
146             throw new IllegalArgumentException("id is blank");
147         }
148 		if (krmsAttributeDefinitionIdCache.containsKey(id)){
149 			return KrmsAttributeDefinitionBo.to(krmsAttributeDefinitionIdCache.get(id));	
150 		} 
151         KrmsAttributeDefinitionBo bo = getBusinessObjectService().findBySinglePrimaryKey(KrmsAttributeDefinitionBo.class, id);
152         return KrmsAttributeDefinitionBo.to(bo);
153     }
154 
155     @Override
156 	
157 
158 
159     public KrmsAttributeDefinition getAttributeDefinitionByNameAndNamespace(final String name, final String namespace) {
160         if (StringUtils.isBlank(name)) {
161             throw new IllegalArgumentException("name is blank");
162         }
163         if (StringUtils.isBlank(namespace)) {
164             throw new IllegalArgumentException("namespace is blank");
165         }
166         KrmsAttributeDefinitionBo bo = getKrmsAttributeBo(name, namespace);
167         if (bo == null) 
168         	return null;
169        	return KrmsAttributeDefinitionBo.to(bo);
170     }
171 
172     @Override
173 	
174 
175 
176     public List<KrmsAttributeDefinition> findAttributeDefinitionsByNamespace(final String namespace) {
177         final Map<String, Object> map = new HashMap<String, Object>();
178         map.put("namespace", namespace);
179         map.put("active", Boolean.TRUE);
180         Collection<KrmsAttributeDefinitionBo> krmsAttributeDefinitionBos = getBusinessObjectService().findMatching(KrmsAttributeDefinitionBo.class, Collections.unmodifiableMap(map));
181         return convertListOfBosToImmutables(krmsAttributeDefinitionBos);
182     }
183 
184     @Override
185 	
186 
187 
188     public List<KrmsAttributeDefinition> findAllAttributeDefinitions() {
189         final Map<String, Object> map = new HashMap<String, Object>();
190         map.put("active", Boolean.TRUE);
191         
192         Collection<KrmsAttributeDefinitionBo> krmsAttributeDefinitionBos = getBusinessObjectService().findMatching(KrmsAttributeDefinitionBo.class, Collections.unmodifiableMap(map));
193         return convertListOfBosToImmutables(krmsAttributeDefinitionBos);
194     }
195 
196     
197 
198 
199 
200 
201     public void setBusinessObjectService(final BusinessObjectService businessObjectService) {
202         this.businessObjectService = businessObjectService;
203     }
204 
205     
206 
207 
208 
209 
210     protected BusinessObjectService getBusinessObjectService() {
211 		if ( businessObjectService == null ) {
212 			businessObjectService = KRADServiceLocator.getBusinessObjectService();
213 		}
214 		return businessObjectService;
215 	}
216 
217     
218 
219 
220 
221 
222 
223     public List<KrmsAttributeDefinition> convertListOfBosToImmutables(final Collection<KrmsAttributeDefinitionBo> krmsAttributeDefinitionBos) {
224         ArrayList<KrmsAttributeDefinition> krmsAttributeDefinitions = new ArrayList<KrmsAttributeDefinition>();
225         for (KrmsAttributeDefinitionBo bo : krmsAttributeDefinitionBos) {
226             KrmsAttributeDefinition krmsAttributeDefinition = KrmsAttributeDefinitionBo.to(bo);
227             krmsAttributeDefinitions.add(krmsAttributeDefinition);
228         }
229         return Collections.unmodifiableList(krmsAttributeDefinitions);
230     }
231 
232     
233     
234     public void clearCache(){
235     	krmsAttributeDefinitionIdCache.clear();
236     }
237     
238     private String createKey(String namespace, String name){
239     	String key = namespace + ":" + name;
240     	return key;
241     }
242     
243     private void updateCache(KrmsAttributeDefinitionBo bo){
244 		String key = createKey(bo.getNamespace(), bo.getName());
245 		if (bo.isActive()){
246 			krmsAttributeDefinitionIdCache.put(key, bo);
247 		} else {
248 			krmsAttributeDefinitionIdCache.remove(key);
249 		}
250     }
251 }