| | |
| | | * |
| | | * |
| | | * Copyright 2009-2010 Sun Microsystems, Inc. |
| | | * Portions Copyright 2013-2014 ForgeRock AS |
| | | * Portions Copyright 2013-2015 ForgeRock AS |
| | | */ |
| | | |
| | | package org.opends.guitools.controlpanel.util; |
| | | |
| | | import java.util.HashSet; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | import javax.naming.NamingEnumeration; |
| | |
| | | import javax.naming.directory.SearchResult; |
| | | import javax.naming.ldap.InitialLdapContext; |
| | | |
| | | import org.forgerock.opendj.config.server.ConfigException; |
| | | import org.forgerock.opendj.ldap.ByteStringBuilder; |
| | | import org.opends.guitools.controlpanel.browser.BrowserController; |
| | | import org.opends.guitools.controlpanel.datamodel.CustomSearchResult; |
| | | import org.opends.server.config.ConfigConstants; |
| | | import org.forgerock.opendj.config.server.ConfigException; |
| | | import org.opends.server.schema.AttributeTypeSyntax; |
| | | import org.opends.server.schema.ObjectClassSyntax; |
| | | import org.opends.server.types.AttributeType; |
| | | import org.forgerock.opendj.ldap.ByteStringBuilder; |
| | | import org.opends.server.types.DirectoryException; |
| | | import org.opends.server.types.InitializationException; |
| | | import org.opends.server.types.ObjectClass; |
| | | import org.opends.server.types.Schema; |
| | | |
| | | /** |
| | | * Class used to retrieve the schema from the schema files. |
| | | */ |
| | | /** Class used to retrieve the schema from the schema files. */ |
| | | public class RemoteSchemaLoader extends SchemaLoader |
| | | { |
| | | private Schema schema; |
| | | |
| | | /** |
| | | * Constructor. |
| | | */ |
| | | public RemoteSchemaLoader() |
| | | { |
| | | super(); |
| | | } |
| | | |
| | | /** |
| | | * Reads the schema. |
| | | * |
| | | * @param ctx |
| | |
| | | * if an error occurs loading the configuration required to use the |
| | | * schema classes. |
| | | */ |
| | | public void readSchema(InitialLdapContext ctx) throws NamingException, |
| | | DirectoryException, InitializationException, ConfigException |
| | | public void readSchema(InitialLdapContext ctx) throws NamingException, DirectoryException, InitializationException, |
| | | ConfigException |
| | | { |
| | | final String[] schemaAttrs = |
| | | { ConfigConstants.ATTR_ATTRIBUTE_TYPES_LC, |
| | | ConfigConstants.ATTR_OBJECTCLASSES_LC }; |
| | | final String[] schemaAttrs = { ConfigConstants.ATTR_ATTRIBUTE_TYPES_LC, ConfigConstants.ATTR_OBJECTCLASSES_LC }; |
| | | |
| | | final SearchControls searchControls = new SearchControls(); |
| | | searchControls.setSearchScope(SearchControls.OBJECT_SCOPE); |
| | | searchControls.setReturningAttributes(schemaAttrs); |
| | | |
| | | final String filter = BrowserController.ALL_OBJECTS_FILTER; |
| | | final NamingEnumeration<SearchResult> srs = |
| | | ctx.search(ConfigConstants.DN_DEFAULT_SCHEMA_ROOT, filter, |
| | | searchControls); |
| | | final NamingEnumeration<SearchResult> srs = ctx.search( |
| | | ConfigConstants.DN_DEFAULT_SCHEMA_ROOT, BrowserController.ALL_OBJECTS_FILTER, searchControls); |
| | | SearchResult sr = null; |
| | | try |
| | | { |
| | |
| | | { |
| | | srs.close(); |
| | | } |
| | | final CustomSearchResult csr = |
| | | new CustomSearchResult(sr, ConfigConstants.DN_DEFAULT_SCHEMA_ROOT); |
| | | |
| | | final CustomSearchResult csr = new CustomSearchResult(sr, ConfigConstants.DN_DEFAULT_SCHEMA_ROOT); |
| | | schema = getBaseSchema(); |
| | | |
| | | for (final String str : schemaAttrs) |
| | | { |
| | | registerSchemaAttr(csr, str); |
| | | } |
| | | } |
| | | |
| | | private void registerSchemaAttr(final CustomSearchResult csr, |
| | | final String schemaAttr) throws DirectoryException |
| | | private void registerSchemaAttr(final CustomSearchResult csr, final String schemaAttr) throws DirectoryException |
| | | { |
| | | @SuppressWarnings({ "unchecked", "rawtypes" }) |
| | | final Set<String> remainingAttrs = |
| | | new HashSet<String>((List) csr.getAttributeValues(schemaAttr)); |
| | | final Set<Object> remainingAttrs = new HashSet<>(csr.getAttributeValues(schemaAttr)); |
| | | |
| | | while (!remainingAttrs.isEmpty()) |
| | | { |
| | | DirectoryException lastException = null; |
| | | boolean oneRegistered = false; |
| | | Set<String> registered = new HashSet<String>(); |
| | | for (final String definition : remainingAttrs) |
| | | final Set<Object> registered = new HashSet<>(); |
| | | for (final Object definition : remainingAttrs) |
| | | { |
| | | final ByteStringBuilder sb = new ByteStringBuilder(); |
| | | sb.append(definition); |
| | | try |
| | | { |
| | | if (schemaAttr.equals(ConfigConstants.ATTR_ATTRIBUTE_TYPES_LC)) |
| | | switch (schemaAttr) |
| | | { |
| | | final AttributeType attrType = |
| | | AttributeTypeSyntax.decodeAttributeType(sb, schema, false); |
| | | schema.registerAttributeType(attrType, true); |
| | | case ConfigConstants.ATTR_ATTRIBUTE_TYPES_LC: |
| | | schema.registerAttributeType(AttributeTypeSyntax.decodeAttributeType(sb, schema, false), true); |
| | | break; |
| | | case ConfigConstants.ATTR_OBJECTCLASSES_LC: |
| | | schema.registerObjectClass(ObjectClassSyntax.decodeObjectClass(sb, schema, false), true); |
| | | break; |
| | | } |
| | | else if (schemaAttr.equals(ConfigConstants.ATTR_OBJECTCLASSES_LC)) |
| | | { |
| | | final ObjectClass oc = |
| | | ObjectClassSyntax.decodeObjectClass(sb, schema, false); |
| | | schema.registerObjectClass(oc, true); |
| | | } |
| | | oneRegistered = true; |
| | | registered.add(definition); |
| | | } |
| | | catch (DirectoryException de) |
| | |
| | | lastException = de; |
| | | } |
| | | } |
| | | if (!oneRegistered) |
| | | if (registered.isEmpty()) |
| | | { |
| | | throw lastException; |
| | | } |