001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 * 019 */ 020 package org.apache.directory.shared.converter.schema; 021 022 import java.io.InputStream; 023 import java.io.Writer; 024 import java.util.List; 025 026 import org.apache.directory.shared.i18n.I18n; 027 import org.slf4j.Logger; 028 import org.slf4j.LoggerFactory; 029 030 /** 031 * A class used to translate a OpenLdap schema file to a Ldif file compatible 032 * with the Apache DS meta schema format 033 * 034 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> 035 * @version $Rev$, $Date$ 036 */ 037 public class SchemaToLdif 038 { 039 private static final String HEADER = 040 "#\n" + 041 "# Licensed to the Apache Software Foundation (ASF) under one\n" + 042 "# or more contributor license agreements. See the NOTICE file\n" + 043 "# distributed with this work for additional information\n" + 044 "# regarding copyright ownership. The ASF licenses this file\n" + 045 "# to you under the Apache License, Version 2.0 (the\n" + 046 "# \"License\"); you may not use this file except in compliance\n" + 047 "# with the License. You may obtain a copy of the License at\n" + 048 "# \n" + 049 "# http://www.apache.org/licenses/LICENSE-2.0\n" + 050 "# \n" + 051 "# Unless required by applicable law or agreed to in writing,\n" + 052 "# software distributed under the License is distributed on an\n" + 053 "# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n" + 054 "# KIND, either express or implied. See the License for the\n" + 055 "# specific language governing permissions and limitations\n" + 056 "# under the License. \n" + 057 "#\n" + 058 "version: 1\n" + 059 "\n"; 060 061 /** The logger */ 062 private static Logger log = LoggerFactory.getLogger( SchemaToLdif.class ); 063 064 /** 065 * This method takes a list of schema and transform them to Ldif files 066 * 067 * @param schemas The list of schema to be transformed 068 * @throws ParserException If we get an error while converting the schemas 069 */ 070 public static void transform( List<Schema> schemas ) throws ParserException 071 { 072 // Bypass if no schemas have yet been defined 073 if ( ( schemas == null ) || ( schemas.size() == 0 ) ) 074 { 075 log.warn( "No schemas defined!" ); 076 return; 077 } 078 079 // Make sure schema configurations have a name field and set defaults 080 // for any other missing properties of the bean: pkg and owner. 081 int i = 1; 082 083 for ( Schema schema:schemas ) 084 { 085 if ( schema.getName() == null ) 086 { 087 String msg = I18n.err( I18n.ERR_06003, i ); 088 log.error( msg ); 089 throw new ParserException( msg ); 090 } 091 092 } 093 094 // Generate for each schema 095 for ( Schema schema:schemas ) 096 { 097 try 098 { 099 log.info( "Generating {} schema.", schema.getName() ); 100 generate( schema ); 101 } 102 catch ( Exception e ) 103 { 104 throw new ParserException( I18n.err( I18n.ERR_06004, schema.getName() ) ); 105 } 106 } 107 } 108 109 /** 110 * Generate the ldif from a schema. The schema contains the inputStream 111 * and Writer. 112 * 113 * @param schema The schema to transfom 114 * @throws Exception If the conversion fails 115 */ 116 private static void generate( Schema schema ) throws Exception 117 { 118 if ( schema == null ) 119 { 120 log.error( I18n.err( I18n.ERR_06005 ) ); 121 throw new NullPointerException( I18n.err( I18n.ERR_06006 ) ); 122 } 123 124 InputStream in = schema.getInput(); 125 Writer out = schema.getOutput(); 126 127 // First parse the schema 128 SchemaParser parser = new SchemaParser(); 129 List<SchemaElement> elements = parser.parse( in, out ); 130 131 // Start with the header (apache licence) 132 out.write( HEADER ); 133 134 // Iterate through each schema elemnts 135 for ( SchemaElement element:elements ) 136 { 137 out.write( element.toLdif( schema.getName() ) ); 138 139 out.write( '\n' ); 140 } 141 142 // Done. Flush the result and close the reader and writer 143 out.flush(); 144 145 out.close(); 146 in.close(); 147 } 148 }