static String getDistinguishingField(AnnotatedConfigurableProperty property) { LDAP propLdapAnno = property.getAnnotation(LDAP.class); String distinguishingField; if (propLdapAnno != null) distinguishingField = propLdapAnno.distinguishingField(); else distinguishingField = LDAP.DEFAULT_DISTINGUISHING_FIELD; if (distinguishingField.equals(LDAP.DEFAULT_DISTINGUISHING_FIELD)) { Annotation classLdapAnno = property.getRawClass().getAnnotation(LDAP.class); if (classLdapAnno != null) distinguishingField = ((LDAP) classLdapAnno).distinguishingField(); } return distinguishingField; }
protected static NamingEnumeration<SearchResult> searchForCollectionElements( LdapConfigurationStorage ldapConfigurationStorage, String dn, AnnotatedConfigurableProperty property) throws NamingException, ConfigurationException { NamingEnumeration<SearchResult> enumeration; AnnotatedConfigurableProperty elemProperty = property.getPseudoPropertyForConfigClassCollectionElement(); // figure out the objectClass String childObjClass; if (elemProperty == null) childObjClass = property.getAnnotation(LDAP.class).mapEntryObjectClass(); else childObjClass = extractObjectClasses(elemProperty.getRawClass()).get(0); try { enumeration = searchSubcontextWithClass(ldapConfigurationStorage, childObjClass, dn); } catch (IndexOutOfBoundsException e) { throw new ConfigurationException( "No object class defined for class " + elemProperty.getRawClass(), e); } return enumeration; }
static boolean isNoContainerNode(AnnotatedConfigurableProperty property) { LDAP propLdapAnno = property.getAnnotation(LDAP.class); LDAP classLdapAnno = null; if (property.isConfObject()) classLdapAnno = propLdapAnno; else { AnnotatedConfigurableProperty pseudoProperty = property.getPseudoPropertyForConfigClassCollectionElement(); if (pseudoProperty != null) classLdapAnno = (LDAP) pseudoProperty.getRawClass().getAnnotation(LDAP.class); } if (propLdapAnno == null || classLdapAnno == null) return false; return propLdapAnno.noContainerNode() || classLdapAnno.noContainerNode(); }
static String refToLdapDN( String ref, LdapConfigurationStorage ldapStorage, BooleanContainer dnIsKillableWrapper) { boolean dnIsKillable = true; try { Iterator<Map<String, Object>> pathItemIter = ConfigNodeUtil.parseReference(ref).iterator(); // first pathitem is always dicomconfigroot if (!pathItemIter.next().get("$name").equals("dicomConfigurationRoot")) throw new IllegalArgumentException("No dicom config root"); String dn = "cn=DICOM Configuration," + ldapStorage.getBaseDN(); Class currentClass = CommonDicomConfiguration.DicomConfigurationRootNode.class; while (pathItemIter.hasNext()) { List<AnnotatedConfigurableProperty> properties = ConfigIterators.getAllConfigurableFieldsAndSetterParameters(currentClass); Map<String, Object> pathItem = pathItemIter.next(); Object name = pathItem.get("$name"); for (AnnotatedConfigurableProperty property : properties) { if (name.equals(property.getAnnotatedName())) { // in any case if (!isNoContainerNode(property)) { dn = dnOf(dn, "cn", getLDAPPropertyName(property)); dnIsKillable = true; } else dnIsKillable = false; // for collections/maps, analyze predicates if (property.isCollectionOfConfObjects() || property.isMapOfConfObjects() || property.isArrayOfConfObjects()) { // remove $name, because it is the collection name in this pathitem pathItem.remove("$name"); // add rdn List<String> rdnItems = new ArrayList<String>(); while (true) { // collect rdn pieces for (Map.Entry<String, Object> entry : pathItem.entrySet()) { // skip wildcard - expect predicates if (entry.getKey().equals("$name") && entry.getValue().equals("*")) { if (pathItem.size() == 1) throw new IllegalArgumentException( "Wildcard without predicates is not allowed in references"); continue; } // add the rest of predicates to rdn String df = null; if (entry.getKey().equals("@name") || entry.getKey().equals("$name")) df = getDistinguishingFieldForCollectionElement(property); else df = entry.getKey(); rdnItems.add(df + "=" + escapeStringToLdap(entry.getValue())); } if (!rdnItems.isEmpty()) { // if rdn found, proceed dn = StringUtils.join(rdnItems, "+") + "," + dn; dnIsKillable = true; break; } else if (!pathItemIter.hasNext()) { // rdn not found, path is over,.. nothing to look for break; } else { // get next path item and collect the rdn there pathItem = pathItemIter.next(); } } currentClass = property.getPseudoPropertyForConfigClassCollectionElement().getRawClass(); } // ConfObject if (property.isConfObject()) currentClass = property.getRawClass(); } } // handle extensions if (currentClass.equals(Device.class)) { if (name.equals("deviceExtensions") || name.equals("aeExtensions") || name.equals("hl7AppExtensions")) { dnIsKillable = false; String extName; if (pathItem.containsKey("@name")) { extName = pathItem.get("@name").toString(); } else { pathItem = pathItemIter.next(); extName = pathItem.get("$name").toString(); } currentClass = getExtensionClassBySimpleName(ldapStorage, extName); LDAP ldapanno = (LDAP) currentClass.getAnnotation(LDAP.class); if (ldapanno == null || !ldapanno.noContainerNode()) { dn = dnOf(dn, "cn", currentClass.getSimpleName()); dnIsKillable = true; } } } } dnIsKillableWrapper.setKillable(dnIsKillable); return dn; } catch (Exception e) { throw new RuntimeException("Cannot transform reference " + ref + " to LDAP dn", e); } }