com.assemblade.opendj.OpenDJUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.assemblade.opendj.OpenDJUtils.java

Source

/*
 * Copyright 2012 Mike Adamson
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.assemblade.opendj;

import org.apache.commons.io.FileUtils;
import org.opends.server.controls.SubtreeDeleteControl;
import org.opends.server.core.DeleteOperation;
import org.opends.server.core.DirectoryServer;
import org.opends.server.protocols.internal.InternalClientConnection;
import org.opends.server.types.Control;
import org.opends.server.types.DN;
import org.opends.server.types.DirectoryEnvironmentConfig;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.InitializationException;
import org.opends.server.types.LDIFImportConfig;
import org.opends.server.types.ResultCode;
import org.opends.server.util.AddChangeRecordEntry;
import org.opends.server.util.ChangeOperationType;
import org.opends.server.util.ChangeRecordEntry;
import org.opends.server.util.LDIFException;
import org.opends.server.util.LDIFReader;
import org.opends.server.util.ModifyChangeRecordEntry;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class OpenDJUtils {
    public static void initializeDatastore(String rootDirectory) throws IOException {
        File serverRoot = new File(rootDirectory);

        FileUtils.forceMkdir(serverRoot);
        FileUtils.forceMkdir(new File(rootDirectory + "/config"));
        FileUtils.forceMkdir(new File(rootDirectory + "/config/schema"));
        FileUtils.forceMkdir(new File(rootDirectory + "/config/upgrade"));
        FileUtils.forceMkdir(new File(rootDirectory + "/locks"));
        FileUtils.forceMkdir(new File(rootDirectory + "/logs"));
        FileUtils.forceMkdir(new File(rootDirectory + "/db"));

        extractFileIfNeeded("cat-config.ldif", rootDirectory + "/config/config.ldif");
        extractFileIfNeeded("wordlist.txt", rootDirectory + "/config/wordlist.txt");
        extractFileIfNeeded("admin-backend.ldif", rootDirectory + "/config/admin-backend.ldif");
        extractFileIfNeeded("config.ldif.8087", rootDirectory + "/config/upgrade/config.ldif.8087");
        extractFileIfNeeded("schema.ldif.8087", rootDirectory + "/config/upgrade/schema.ldif.8087");
        extractFileIfNeeded("00-core.ldif", rootDirectory + "/config/schema/00-core.ldif");
        extractFileIfNeeded("01-pwpolicy.ldif", rootDirectory + "/config/schema/01-pwpolicy.ldif");
        extractFileIfNeeded("02-config.ldif", rootDirectory + "/config/schema/02-config.ldif");
        extractFileIfNeeded("03-changelog.ldif", rootDirectory + "/config/schema/03-changelog.ldif");
        extractFileIfNeeded("03-rfc2713.ldif", rootDirectory + "/config/schema/03-rfc2713.ldif");
        extractFileIfNeeded("04-rfc2307bis.ldif", rootDirectory + "/config/schema/04-rfc2307bis.ldif");
        extractFileIfNeeded("07-assemblade.ldif", rootDirectory + "/config/schema/07-assemblade.ldif");
    }

    public static DirectoryEnvironmentConfig buildEnvironmentConfig(String rootDirectory)
            throws IOException, InitializationException {
        DirectoryEnvironmentConfig config = new DirectoryEnvironmentConfig();

        File serverRoot = new File(rootDirectory);

        if (!serverRoot.exists()) {
            initializeDatastore(rootDirectory);
        }
        config.setServerRoot(serverRoot);
        config.setMaintainConfigArchive(false);
        config.setDisableConnectionHandlers(true);
        config.setForceDaemonThreads(true);

        if (!config.getLockDirectory().exists()) {
            initializeDatastore(rootDirectory);
        }

        FileUtils.cleanDirectory(config.getLockDirectory());

        return config;
    }

    public static void refreshRootEntry() {
        InternalClientConnection connection = InternalClientConnection.getRootConnection();
        List<Control> controls = new ArrayList<Control>();
        controls.add(new SubtreeDeleteControl(true));
        DeleteOperation result = connection.processDelete("dc=assemblade,dc=com", controls);
        if (result.getResultCode() == ResultCode.SUCCESS) {
            performFirstTimeInitialization();
        }
    }

    public static void performFirstTimeInitialization() {
        try {
            if (!DirectoryServer.entryExists(DN.decode("dc=assemblade,dc=com"))) {
                importLdifFile("cat-layout.ldif");
            }
        } catch (DirectoryException e) {
            e.printStackTrace();
        }
    }

    public static void importLdifFile(String fileName) {
        InternalClientConnection connection = InternalClientConnection.getRootConnection();
        try {
            LDIFImportConfig config = new LDIFImportConfig(
                    OpenDJUtils.class.getClassLoader().getResourceAsStream(fileName));
            LDIFReader ldifReader = new LDIFReader(config);
            ChangeRecordEntry entry = ldifReader.readChangeRecord(true);

            while (entry != null) {
                if (entry.getChangeOperationType() == ChangeOperationType.ADD) {
                    connection.processAdd((AddChangeRecordEntry) entry);
                } else if (entry.getChangeOperationType() == ChangeOperationType.MODIFY) {
                    connection.processModify((ModifyChangeRecordEntry) entry);
                }
                entry = ldifReader.readChangeRecord(true);
            }
        } catch (LDIFException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void extractFileIfNeeded(String file, String destination) throws IOException {
        File destinationFile = new File(destination);
        if (!destinationFile.exists()) {
            FileUtils.copyURLToFile(OpenDJUtils.class.getClassLoader().getResource(file), destinationFile);
        }
    }

}