/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt * or http://forgerock.org/license/CDDLv1.0.html. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at legal-notices/CDDLv1_0.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2008-2010 Sun Microsystems, Inc. * Portions Copyright 2013-2015 ForgeRock AS. */ package org.opends.guitools.controlpanel.util; import static org.opends.messages.ConfigMessages.*; import java.io.File; import java.io.FileFilter; import java.util.ArrayList; import java.util.Arrays; import org.forgerock.i18n.LocalizableMessage; import org.forgerock.opendj.ldap.schema.Syntax; import org.forgerock.opendj.ldap.schema.MatchingRule; import org.opends.server.config.ConfigConstants; import org.forgerock.opendj.config.server.ConfigException; import org.opends.server.core.DirectoryServer; import org.opends.server.core.SchemaConfigManager; import org.opends.server.types.AttributeType; import org.opends.server.types.DirectoryException; import org.opends.server.types.InitializationException; import org.opends.server.types.ObjectClass; import org.opends.server.types.Schema; import com.forgerock.opendj.util.OperatingSystem; /** * Class used to retrieve the schema from the schema files. */ public class SchemaLoader { private Schema schema; private final String[] attrsToKeep = { ConfigConstants.ATTR_ATTRIBUTE_TYPES_LC, ConfigConstants.ATTR_OBJECTCLASSES_LC, ConfigConstants.ATTR_NAME_FORMS_LC, ConfigConstants.ATTR_DIT_CONTENT_RULES_LC, ConfigConstants.ATTR_DIT_STRUCTURE_RULES_LC, ConfigConstants.ATTR_MATCHING_RULE_USE_LC }; private final String[] ocsToKeep = { "top" }; private final ArrayList objectclassesToKeep = new ArrayList(); private final ArrayList attributesToKeep = new ArrayList(); private final ArrayList matchingRulesToKeep = new ArrayList(); private final ArrayList syntaxesToKeep = new ArrayList<>(); /** * Constructor. */ public SchemaLoader() { Schema sc = DirectoryServer.getSchema(); for (String name : ocsToKeep) { ObjectClass oc = sc.getObjectClass(name.toLowerCase()); if (oc != null) { objectclassesToKeep.add(oc); } } for (String name : attrsToKeep) { AttributeType attr = sc.getAttributeType(name.toLowerCase()); if (attr != null) { attributesToKeep.add(attr); } } matchingRulesToKeep.addAll(sc.getMatchingRules().values()); syntaxesToKeep.addAll(sc.getSyntaxes().values()); } private static String getSchemaDirectoryPath() { File schemaDir = DirectoryServer.getEnvironmentConfig().getSchemaDirectory(); if (schemaDir != null) { return schemaDir.getAbsolutePath(); } else { return null; } } /** * Reads the schema. * * @throws ConfigException * if an error occurs reading the schema. * @throws InitializationException * if an error occurs trying to find out the schema files. * @throws DirectoryException * if there is an error registering the minimal objectclasses. */ public void readSchema() throws DirectoryException, ConfigException, InitializationException { schema = getBaseSchema(); String[] fileNames; String schemaDirPath = getSchemaDirectoryPath(); try { // Load install directory schema File schemaDir = new File(schemaDirPath); if (schemaDirPath == null || !schemaDir.exists()) { LocalizableMessage message = ERR_CONFIG_SCHEMA_NO_SCHEMA_DIR.get(schemaDirPath); throw new InitializationException(message); } else if (!schemaDir.isDirectory()) { LocalizableMessage message = ERR_CONFIG_SCHEMA_DIR_NOT_DIRECTORY.get(schemaDirPath); throw new InitializationException(message); } FileFilter ldifFiles = new FileFilter() { /** {@inheritDoc} */ @Override public boolean accept(File f) { boolean accept = false; if (f != null) { if (f.isDirectory()) { accept = true; } else if (OperatingSystem.isWindows()) { accept = f.getName().toLowerCase().endsWith(".ldif"); } else { accept = f.getName().endsWith(".ldif"); } } return accept; } }; File[] schemaFiles = schemaDir.listFiles(ldifFiles); int size = schemaFiles.length; ArrayList fileList = new ArrayList(size); for (File f : schemaFiles) { if (f.isFile()) { fileList.add(f.getName()); } } fileNames = new String[fileList.size()]; fileList.toArray(fileNames); Arrays.sort(fileNames); } catch (InitializationException ie) { throw ie; } catch (Exception e) { LocalizableMessage message = ERR_CONFIG_SCHEMA_CANNOT_LIST_FILES .get(schemaDirPath, e.getMessage()); throw new InitializationException(message, e); } // Iterate through the schema files and read them as an LDIF file // containing a single entry. Then get the attributeTypes and // objectClasses attributes from that entry and parse them to // initialize the server schema. for (String schemaFile : fileNames) { // no server context to pass SchemaConfigManager.loadSchemaFile(null, schema, schemaFile); } } /** * Returns a basic version of the schema. The schema is created and contains * enough definitions for the schema to be loaded. * * @return a basic version of the schema. * @throws DirectoryException * if there is an error registering the minimal objectclasses. */ protected Schema getBaseSchema() throws DirectoryException { Schema schema = new Schema(); for (MatchingRule mr : matchingRulesToKeep) { schema.registerMatchingRule(mr, true); } for (Syntax syntax : syntaxesToKeep) { schema.registerSyntax(syntax, true); } for (AttributeType attr : attributesToKeep) { schema.registerAttributeType(attr, true); } for (ObjectClass oc : objectclassesToKeep) { schema.registerObjectClass(oc, true); } return schema; } /** * Returns the schema that was read. * * @return the schema that was read. */ public Schema getSchema() { return schema; } }