/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.directory.studio.schemaeditor.view.wizards; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.naming.NamingException; import org.apache.directory.api.ldap.schema.converter.AttributeTypeHolder; import org.apache.directory.api.ldap.schema.converter.ObjectClassHolder; import org.apache.directory.api.ldap.model.constants.SchemaConstants; import org.apache.directory.api.ldap.model.exception.LdapException; import org.apache.directory.api.ldap.model.name.Rdn; import org.apache.directory.api.ldap.model.schema.AttributeType; import org.apache.directory.api.ldap.model.schema.ObjectClass; import org.apache.directory.api.ldap.model.schema.SchemaObjectSorter; import org.apache.directory.api.util.Strings; import org.apache.directory.studio.schemaeditor.Activator; import org.apache.directory.studio.schemaeditor.PluginUtils; import org.apache.directory.studio.schemaeditor.controller.SchemaHandler; import org.apache.directory.studio.schemaeditor.model.Schema; import org.apache.directory.studio.schemaeditor.view.ViewUtils; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.Wizard; import org.eclipse.osgi.util.NLS; import org.eclipse.ui.IExportWizard; import org.eclipse.ui.IWorkbench; /** * This class represents the wizard to export schemas for ApacheDS. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class ExportSchemasForADSWizard extends Wizard implements IExportWizard { /** The selected schemas */ private Schema[] selectedSchemas = new Schema[0]; // The pages of the wizard private ExportSchemasForADSWizardPage page; /** * {@inheritDoc} */ public void addPages() { // Creating pages page = new ExportSchemasForADSWizardPage(); page.setSelectedSchemas( selectedSchemas ); // Adding pages addPage( page ); } /** * {@inheritDoc} */ public boolean performFinish() { // Saving the dialog settings page.saveDialogSettings(); // Getting the schemas to be exported and where to export them final Schema[] selectedSchemas = page.getSelectedSchemas(); int exportType = page.getExportType(); if ( exportType == ExportSchemasAsXmlWizardPage.EXPORT_MULTIPLE_FILES ) { final String exportDirectory = page.getExportDirectory(); try { getContainer().run( false, true, new IRunnableWithProgress() { public void run( IProgressMonitor monitor ) { monitor.beginTask( Messages.getString( "ExportSchemasForADSWizard.ExportingSchemas" ), selectedSchemas.length ); //$NON-NLS-1$ for ( Schema schema : selectedSchemas ) { monitor.subTask( schema.getSchemaName() ); StringBuffer sb = new StringBuffer(); DateFormat format = DateFormat.getDateTimeInstance( DateFormat.LONG, DateFormat.MEDIUM ); Date date = new Date(); sb .append( NLS .bind( Messages.getString( "ExportSchemasForADSWizard.GeneratedByApacheComment" ), new String[] { format.format( date ) } ) ); //$NON-NLS-1$ try { toLdif( schema, sb ); BufferedWriter buffWriter = new BufferedWriter( new FileWriter( exportDirectory + "/" //$NON-NLS-1$ + schema.getSchemaName() + ".ldif" ) ); //$NON-NLS-1$ buffWriter.write( sb.toString() ); buffWriter.close(); } catch ( Exception e ) { PluginUtils .logError( NLS .bind( Messages.getString( "ExportSchemasForADSWizard.ErrorSavingSchema" ), new String[] { schema.getSchemaName() } ), e ); //$NON-NLS-1$ ViewUtils .displayErrorMessageDialog( Messages.getString( "ExportSchemasForADSWizard.Error" ), NLS.bind( Messages.getString( "ExportSchemasForADSWizard.ErrorSavingSchema" ), new String[] { schema.getSchemaName() } ) ); //$NON-NLS-1$ //$NON-NLS-2$ } monitor.worked( 1 ); } monitor.done(); } } ); } catch ( InvocationTargetException e ) { // Nothing to do (it will never occur) } catch ( InterruptedException e ) { // Nothing to do. } } else if ( exportType == ExportSchemasAsXmlWizardPage.EXPORT_SINGLE_FILE ) { final String exportFile = page.getExportFile(); try { getContainer().run( false, true, new IRunnableWithProgress() { public void run( IProgressMonitor monitor ) { monitor.beginTask( Messages.getString( "ExportSchemasForADSWizard.ExportingSchemas" ), 1 ); //$NON-NLS-1$ StringBuffer sb = new StringBuffer(); DateFormat format = DateFormat.getDateTimeInstance( DateFormat.LONG, DateFormat.MEDIUM ); Date date = new Date(); sb .append( NLS .bind( Messages.getString( "ExportSchemasForADSWizard.GeneratedByApacheComment" ), new String[] { format.format( date ) } ) ); //$NON-NLS-1$ for ( Schema schema : selectedSchemas ) { try { toLdif( schema, sb ); } catch ( Exception e ) { PluginUtils .logError( NLS .bind( Messages.getString( "ExportSchemasForADSWizard.ErrorSavingSchema" ), new String[] { schema.getSchemaName() } ), e ); //$NON-NLS-1$ ViewUtils .displayErrorMessageDialog( Messages.getString( "ExportSchemasForADSWizard.Error" ), NLS.bind( Messages.getString( "ExportSchemasForADSWizard.ErrorSavingSchema" ), new String[] { schema.getSchemaName() } ) ); //$NON-NLS-1$ //$NON-NLS-2$ } } try { BufferedWriter buffWriter = new BufferedWriter( new FileWriter( exportFile ) ); buffWriter.write( sb.toString() ); buffWriter.close(); } catch ( IOException e ) { PluginUtils.logError( Messages.getString( "ExportSchemasForADSWizard.ErrorSavingSchemas" ), e ); //$NON-NLS-1$ ViewUtils .displayErrorMessageDialog( Messages.getString( "ExportSchemasForADSWizard.Error" ), Messages.getString( "ExportSchemasForADSWizard.ErrorSavingSchemas" ) ); //$NON-NLS-1$ //$NON-NLS-2$ } monitor.worked( 1 ); monitor.done(); } } ); } catch ( InvocationTargetException e ) { // Nothing to do (it will never occur) } catch ( InterruptedException e ) { // Nothing to do. } } return true; } /** * Converts the given schema as its LDIF for ApacheDS representation and stores it into the given StringBuffer. * * @param schema * the schema * @param sb * the StringBuffer * @throws NamingException * if an error occurs during the conversion * @throws LdapException */ private void toLdif( Schema schema, StringBuffer sb ) throws NamingException, LdapException { sb .append( NLS .bind( Messages.getString( "ExportSchemasForADSWizard.SchemaComment" ), new String[] { schema.getSchemaName().toUpperCase() } ) ); //$NON-NLS-1$ sb.append( "dn: cn=" + Rdn.escapeValue( schema.getSchemaName() ) + ", ou=schema\n" ); //$NON-NLS-1$ //$NON-NLS-2$ sb.append( "objectclass: metaSchema\n" ); //$NON-NLS-1$ sb.append( "objectclass: top\n" ); //$NON-NLS-1$ sb.append( "cn: " + schema.getSchemaName() + "\n" ); //$NON-NLS-1$ //$NON-NLS-2$ String[] schemaDependencies = getSchemaDependencies( schema ); for ( String schemaName : schemaDependencies ) { sb.append( "m-dependencies: " + schemaName + "\n" ); //$NON-NLS-1$ //$NON-NLS-2$ } sb.append( "\n" ); //$NON-NLS-1$ // Generation the Attribute Types Node sb.append( "dn: " + SchemaConstants.ATTRIBUTE_TYPES_PATH + ", cn=" + Rdn.escapeValue( schema.getSchemaName() ) + ", ou=schema\n" ); //$NON-NLS-1$ //$NON-NLS-2$ sb.append( "objectclass: organizationalUnit\n" ); //$NON-NLS-1$ sb.append( "objectclass: top\n" ); //$NON-NLS-1$ sb.append( "ou: attributetypes\n" ); //$NON-NLS-1$ sb.append( "\n" ); //$NON-NLS-1$ // Generating LDIF for Attributes Types for ( AttributeType at : schema.getAttributeTypes() ) { AttributeTypeHolder holder = new AttributeTypeHolder( at.getOid() ); holder.setCollective( at.isCollective() ); holder.setDescription( at.getDescription() ); holder.setEquality( at.getEqualityOid() ); List<String> names = new ArrayList<String>(); for ( String name : at.getNames() ) { names.add( name ); } holder.setNames( names ); holder.setNoUserModification( !at.isUserModifiable() ); holder.setObsolete( at.isObsolete() ); holder.setOrdering( at.getOrderingOid() ); holder.setSingleValue( at.isSingleValued() ); holder.setSubstr( at.getSubstringOid() ); holder.setSuperior( at.getSuperiorOid() ); holder.setSyntax( at.getSyntaxOid() ); if ( at.getSyntaxLength() > 0 ) { holder.setOidLen( at.getSyntaxLength() ); } holder.setUsage( at.getUsage() ); sb.append( holder.toLdif( schema.getSchemaName() ) + "\n" ); //$NON-NLS-1$ } // Generation the Comparators Node sb.append( "dn: " + SchemaConstants.COMPARATORS_PATH + ", cn=" + Rdn.escapeValue( schema.getSchemaName() ) + ", ou=schema\n" ); //$NON-NLS-1$ //$NON-NLS-2$ sb.append( "objectclass: organizationalUnit\n" ); //$NON-NLS-1$ sb.append( "objectclass: top\n" ); //$NON-NLS-1$ sb.append( "ou: comparators\n" ); //$NON-NLS-1$ sb.append( "\n" ); //$NON-NLS-1$ // Generation the DIT Content Rules Node sb.append( "dn: " + SchemaConstants.DIT_CONTENT_RULES_PATH + ", cn=" + Rdn.escapeValue( schema.getSchemaName() ) + ", ou=schema\n" ); //$NON-NLS-1$ //$NON-NLS-2$ sb.append( "objectclass: organizationalUnit\n" ); //$NON-NLS-1$ sb.append( "objectclass: top\n" ); //$NON-NLS-1$ sb.append( "ou: ditcontentrules\n" ); //$NON-NLS-1$ sb.append( "\n" ); //$NON-NLS-1$ // Generation the DIT Structure RulesNode sb.append( "dn: " + SchemaConstants.DIT_STRUCTURE_RULES_PATH + ", cn=" + Rdn.escapeValue( schema.getSchemaName() ) + ", ou=schema\n" ); //$NON-NLS-1$ //$NON-NLS-2$ sb.append( "objectclass: organizationalUnit\n" ); //$NON-NLS-1$ sb.append( "objectclass: top\n" ); //$NON-NLS-1$ sb.append( "ou: ditstructurerules\n" ); //$NON-NLS-1$ sb.append( "\n" ); //$NON-NLS-1$ // Generation the Matching Rules Node sb.append( "dn: " + SchemaConstants.MATCHING_RULES_PATH + ", cn=" + Rdn.escapeValue( schema.getSchemaName() ) + ", ou=schema\n" ); //$NON-NLS-1$ //$NON-NLS-2$ sb.append( "objectclass: organizationalUnit\n" ); //$NON-NLS-1$ sb.append( "objectclass: top\n" ); //$NON-NLS-1$ sb.append( "ou: matchingrules\n" ); //$NON-NLS-1$ sb.append( "\n" ); //$NON-NLS-1$ // Generation the Matching Rule Use Node sb.append( "dn: " + SchemaConstants.MATCHING_RULE_USE_PATH + ", cn=" + Rdn.escapeValue( schema.getSchemaName() ) + ", ou=schema\n" ); //$NON-NLS-1$ //$NON-NLS-2$ sb.append( "objectclass: organizationalUnit\n" ); //$NON-NLS-1$ sb.append( "objectclass: top\n" ); //$NON-NLS-1$ sb.append( "ou: matchingruleuse\n" ); //$NON-NLS-1$ sb.append( "\n" ); //$NON-NLS-1$ // Generation the Name Forms Node sb.append( "dn: " + SchemaConstants.NAME_FORMS_PATH + ", cn=" + Rdn.escapeValue( schema.getSchemaName() ) + ", ou=schema\n" ); //$NON-NLS-1$ //$NON-NLS-2$ sb.append( "objectclass: organizationalUnit\n" ); //$NON-NLS-1$ sb.append( "objectclass: top\n" ); //$NON-NLS-1$ sb.append( "ou: nameforms\n" ); //$NON-NLS-1$ sb.append( "\n" ); //$NON-NLS-1$ // Generation the Normalizers Node sb.append( "dn: " + SchemaConstants.NORMALIZERS_PATH + ", cn=" + Rdn.escapeValue( schema.getSchemaName() ) + ", ou=schema\n" ); //$NON-NLS-1$ //$NON-NLS-2$ sb.append( "objectclass: organizationalUnit\n" ); //$NON-NLS-1$ sb.append( "objectclass: top\n" ); //$NON-NLS-1$ sb.append( "ou: normalizers\n" ); //$NON-NLS-1$ sb.append( "\n" ); //$NON-NLS-1$ // Generation the Object Classes Node sb.append( "dn: " + SchemaConstants.OBJECT_CLASSES_PATH + ", cn=" + Rdn.escapeValue( schema.getSchemaName() ) + ", ou=schema\n" ); //$NON-NLS-1$ //$NON-NLS-2$ sb.append( "objectclass: organizationalUnit\n" ); //$NON-NLS-1$ sb.append( "objectclass: top\n" ); //$NON-NLS-1$ sb.append( "ou: objectClasses\n" ); //$NON-NLS-1$ sb.append( "\n" ); //$NON-NLS-1$ // Generating LDIF for Object Classes Iterable<ObjectClass> sortedObjectClasses = SchemaObjectSorter.sortObjectClasses( schema.getObjectClasses() ); for ( ObjectClass oc : sortedObjectClasses ) { ObjectClassHolder holder = new ObjectClassHolder( oc.getOid() ); holder.setClassType( oc.getType() ); holder.setDescription( oc.getDescription() ); List<String> mayList = new ArrayList<String>(); for ( String may : oc.getMayAttributeTypeOids() ) { mayList.add( may ); } holder.setMay( mayList ); List<String> mustList = new ArrayList<String>(); for ( String must : oc.getMustAttributeTypeOids() ) { mustList.add( must ); } holder.setMust( mustList ); List<String> names = new ArrayList<String>(); for ( String name : oc.getNames() ) { names.add( name ); } holder.setNames( names ); List<String> superiorList = new ArrayList<String>(); for ( String superior : oc.getSuperiorOids() ) { superiorList.add( superior ); } holder.setSuperiors( superiorList ); holder.setObsolete( oc.isObsolete() ); sb.append( holder.toLdif( schema.getSchemaName() ) + "\n" ); //$NON-NLS-1$ } // Generation the Syntax Checkers Node sb.append( "dn: " + SchemaConstants.SYNTAX_CHECKERS_PATH + ", cn=" + Rdn.escapeValue( schema.getSchemaName() ) + ", ou=schema\n" ); //$NON-NLS-1$ //$NON-NLS-2$ sb.append( "objectclass: organizationalUnit\n" ); //$NON-NLS-1$ sb.append( "objectclass: top\n" ); //$NON-NLS-1$ sb.append( "ou: syntaxcheckers\n" ); //$NON-NLS-1$ sb.append( "\n" ); //$NON-NLS-1$ // Generation the Syntaxes Node sb.append( "dn: " + SchemaConstants.SYNTAXES_PATH + ", cn=" + Rdn.escapeValue( schema.getSchemaName() ) + ", ou=schema\n" ); //$NON-NLS-1$ //$NON-NLS-2$ sb.append( "objectclass: organizationalUnit\n" ); //$NON-NLS-1$ sb.append( "objectclass: top\n" ); //$NON-NLS-1$ sb.append( "ou: syntaxes\n" ); //$NON-NLS-1$ sb.append( "\n" ); //$NON-NLS-1$ } /** * Gets the schema dependencies. * * @param schema * the schema * @return * an array containing the names of all the schemas which the given * schema depends on */ private String[] getSchemaDependencies( Schema schema ) { Set<String> schemaNames = new HashSet<String>(); SchemaHandler schemaHandler = Activator.getDefault().getSchemaHandler(); // Looping on Attribute Types for ( AttributeType at : schema.getAttributeTypes() ) { // Superior String supName = at.getSuperiorOid(); if ( supName != null ) { AttributeType sup = schemaHandler.getAttributeType( supName ); if ( sup != null ) { if ( !Strings.toLowerCase( schema.getSchemaName() ).equals( Strings.toLowerCase( sup.getSchemaName() ) ) ) { schemaNames.add( sup.getSchemaName() ); } } } } // Looping on Object Classes for ( ObjectClass oc : schema.getObjectClasses() ) { // Superiors List<String> supNames = oc.getSuperiorOids(); if ( supNames != null ) { for ( String supName : oc.getSuperiorOids() ) { ObjectClass sup = schemaHandler.getObjectClass( supName ); if ( sup != null ) { if ( !Strings.toLowerCase( schema.getSchemaName() ).equals( Strings.toLowerCase( sup.getSchemaName() ) ) ) { schemaNames.add( sup.getSchemaName() ); } } } } // Mays List<String> mayNames = oc.getMayAttributeTypeOids(); if ( mayNames != null ) { for ( String mayName : mayNames ) { AttributeType may = schemaHandler.getAttributeType( mayName ); if ( may != null ) { if ( !Strings.toLowerCase( schema.getSchemaName() ).equals( Strings.toLowerCase( may.getSchemaName() ) ) ) { schemaNames.add( may.getSchemaName() ); } } } } // Musts List<String> mustNames = oc.getMustAttributeTypeOids(); if ( mustNames != null ) { for ( String mustName : oc.getMustAttributeTypeOids() ) { AttributeType must = schemaHandler.getAttributeType( mustName ); if ( must != null ) { if ( !Strings.toLowerCase( schema.getSchemaName() ).equals( Strings.toLowerCase( must.getSchemaName() ) ) ) { schemaNames.add( must.getSchemaName() ); } } } } } return schemaNames.toArray( new String[0] ); } /** * {@inheritDoc} */ public void init( IWorkbench workbench, IStructuredSelection selection ) { setNeedsProgressMonitor( true ); } /** * Sets the selected projects. * * @param schemas * the schemas */ public void setSelectedSchemas( Schema[] schemas ) { selectedSchemas = schemas; } }