/*
* 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 Sun Microsystems, Inc.
* Portions Copyright 2011 ForgeRock AS
*/
package org.opends.build.tools;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.LinkedList;
import java.util.TreeSet;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
/**
* This class provides an implementation of an Ant task that concatenates the
* contents of the files in the schema directory to create a base schema that
* may be used during the upgrade process. Each element will also include the
* X-SCHEMA-FILE extension to indicate the source schema file.
*/
public class ConcatSchema
extends Task
{
// The path to the directory containing the schema files.
private String schemaDirectory;
// The path to the concatenated schema file to create.
private String toFile;
/**
* Specifies the path to the directory containing the schema files.
*
* @param schemaDirectory The path to the directory containing the schema
* files.
*/
public void setSchemaDirectory(String schemaDirectory)
{
this.schemaDirectory = schemaDirectory;
}
/**
* Specifies the path to the file to create containing the concatenated schema
* elements.
*
* @param toFile The path to the file containing the concatenated schema
* elements.
*/
public void setToFile(String toFile)
{
this.toFile = toFile;
}
/**
* Performs the appropriate processing needed for this task. In this case,
* it uses SVNKit to identify all modified files in the current workspace.
* For all source files, look for comment lines containing the word
* "copyright" and make sure at least one of them contains the current year.
*/
@Override()
public void execute()
{
// Get a sorted list of the files in the schema directory.
TreeSet<String> schemaFileNames = new TreeSet<String>();
for (File f : new File(schemaDirectory).listFiles())
{
if (f.isFile())
{
schemaFileNames.add(f.getName());
}
}
// Create a set of lists that will hold the schema elements read from the
// files.
LinkedList<String> attributeTypes = new LinkedList<String>();
LinkedList<String> objectClasses = new LinkedList<String>();
LinkedList<String> nameForms = new LinkedList<String>();
LinkedList<String> ditContentRules = new LinkedList<String>();
LinkedList<String> ditStructureRules = new LinkedList<String>();
LinkedList<String> matchingRuleUses = new LinkedList<String>();
LinkedList<String> ldapSyntaxes = new LinkedList<String>();
// Open each of the files in order and read the elements that they contain,
// appending them to the appropriate lists.
for (String name : schemaFileNames)
{
// Read the contents of the file into a list with one schema element per
// list element.
LinkedList<StringBuilder> lines = new LinkedList<StringBuilder>();
try
{
BufferedReader reader = new BufferedReader(new FileReader(
new File(schemaDirectory, name)));
while (true)
{
String line = reader.readLine();
if (line == null)
{
break;
}
else if (line.startsWith("#") || (line.length() == 0))
{
continue;
}
else if (line.startsWith(" "))
{
lines.getLast().append(line.substring(1));
}
else
{
lines.add(new StringBuilder(line));
}
}
reader.close();
}
catch (Exception e)
{
throw new BuildException("Error while reading schema file " + name +
": " + e, e);
}
// Iterate through each line in the list. Find the colon and get the
// attribute name at the beginning. If it's someting that we don't
// recognize, then skip it. Otherwise, add the X-SCHEMA-FILE extension
// and add it to the appropriate schema element list.
for (StringBuilder buffer : lines)
{
// Get the line and add the X-SCHEMA-FILE extension to the end of it.
// All of them should end with " )" but some might have the parenthesis
// crammed up against the last character so deal with that as well.
String line = buffer.toString().trim();
if (line.endsWith(" )"))
{
line = line.substring(0, line.length()-1) + "X-SCHEMA-FILE '" + name +
"' )";
}
else if (line.endsWith(")"))
{
line = line.substring(0, line.length()-1) + " X-SCHEMA-FILE '" + name +
"' )";
}
else
{
continue;
}
String lowerLine = line.toLowerCase();
if (lowerLine.startsWith("attributetypes:"))
{
attributeTypes.add(line);
}
else if (lowerLine.startsWith("objectclasses:"))
{
objectClasses.add(line);
}
else if (lowerLine.startsWith("nameforms:"))
{
nameForms.add(line);
}
else if (lowerLine.startsWith("ditcontentrules:"))
{
ditContentRules.add(line);
}
else if (lowerLine.startsWith("ditstructurerules:"))
{
ditStructureRules.add(line);
}
else if (lowerLine.startsWith("matchingruleuse:"))
{
matchingRuleUses.add(line);
}
else if (lowerLine.startsWith("ldapsyntaxes:"))
{
ldapSyntaxes.add(line);
}
}
}
// Write the resulting output to the merged schema file.
try
{
BufferedWriter writer = new BufferedWriter(new FileWriter(toFile));
writer.write("dn: cn=schema");
writer.newLine();
writer.write("objectClass: top");
writer.newLine();
writer.write("objectClass: ldapSubentry");
writer.newLine();
writer.write("objectClass: subschema");
writer.newLine();
for (String line : ldapSyntaxes)
{
writer.write(line);
writer.newLine();
}
for (String line : attributeTypes)
{
writer.write(line);
writer.newLine();
}
for (String line : objectClasses)
{
writer.write(line);
writer.newLine();
}
for (String line : nameForms)
{
writer.write(line);
writer.newLine();
}
for (String line : ditContentRules)
{
writer.write(line);
writer.newLine();
}
for (String line : ditStructureRules)
{
writer.write(line);
writer.newLine();
}
for (String line : matchingRuleUses)
{
writer.write(line);
writer.newLine();
}
writer.close();
}
catch (Exception e)
{
throw new BuildException("Error while writing concatenated schema file " +
toFile + ": " + e, e);
}
}
}