/* * 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 * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * 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 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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); } } }