/*
|
* 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-2014 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.opends.quicksetup.util.Utils;
|
import org.opends.server.api.AttributeSyntax;
|
import org.opends.server.api.MatchingRule;
|
import org.opends.server.config.ConfigConstants;
|
import org.opends.server.config.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;
|
|
/**
|
* 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<ObjectClass> objectclassesToKeep =
|
new ArrayList<ObjectClass>();
|
private final ArrayList<AttributeType> attributesToKeep =
|
new ArrayList<AttributeType>();
|
private final ArrayList<MatchingRule> matchingRulesToKeep =
|
new ArrayList<MatchingRule>();
|
private final ArrayList<AttributeSyntax<?>> syntaxesToKeep =
|
new ArrayList<AttributeSyntax<?>>();
|
|
/**
|
* 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);
|
}
|
}
|
for (MatchingRule mr : sc.getMatchingRules().values())
|
{
|
matchingRulesToKeep.add(mr);
|
}
|
for (AttributeSyntax<?> syntax : sc.getSyntaxes().values())
|
{
|
syntaxesToKeep.add(syntax);
|
}
|
}
|
|
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}
|
*/
|
public boolean accept(File f)
|
{
|
boolean accept = false;
|
if (f != null)
|
{
|
if (f.isDirectory())
|
{
|
accept = true;
|
}
|
else if (Utils.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<String> fileList = new ArrayList<String>(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)
|
{
|
SchemaConfigManager.loadSchemaFile(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 (AttributeSyntax<?> 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;
|
}
|
}
|