You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by se...@apache.org on 2009/07/28 16:46:13 UTC

svn commit: r798544 - in /directory/studio/trunk/schemaeditor: ./ src/main/java/org/apache/directory/studio/schemaeditor/model/io/ src/main/java/org/apache/directory/studio/schemaeditor/view/preferences/ src/main/java/org/apache/directory/studio/schema...

Author: seelmann
Date: Tue Jul 28 14:46:13 2009
New Revision: 798544

URL: http://svn.apache.org/viewvc?rev=798544&view=rev
Log:
DIRSTUDIO-509 (Load schema from the directory server)
o Activated code to load schema from directory server
o Added generic schema connector


Added:
    directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/model/io/GenericSchemaConnector.java
Modified:
    directory/studio/trunk/schemaeditor/plugin.xml
    directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/view/preferences/PluginPreferencePage.java
    directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/view/wizards/NewProjectWizard.java
    directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/view/wizards/NewProjectWizardInformationPage.java
    directory/studio/trunk/schemaeditor/src/main/resources/org.apache.directory.studio.schemaeditor.schemaConnectors.exsd

Modified: directory/studio/trunk/schemaeditor/plugin.xml
URL: http://svn.apache.org/viewvc/directory/studio/trunk/schemaeditor/plugin.xml?rev=798544&r1=798543&r2=798544&view=diff
==============================================================================
--- directory/studio/trunk/schemaeditor/plugin.xml (original)
+++ directory/studio/trunk/schemaeditor/plugin.xml Tue Jul 28 14:46:13 2009
@@ -19,6 +19,7 @@
   under the License.
 -->
 <plugin>
+   <extension-point id="org.apache.directory.studio.schemaeditor.schemaConnectors" name="Schema Connectors" schema="src/main/resources/org.apache.directory.studio.schemaeditor.schemaConnectors.exsd"/>
    	<extension
          point="org.eclipse.ui.perspectives">
       <perspective
@@ -425,5 +426,20 @@
           schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
           sequence="DEL">
     </key>
+ </extension>
+ <extension
+       point="org.apache.directory.studio.schemaeditor.schemaConnectors">
+    <schemaConnector
+          class="org.apache.directory.studio.schemaeditor.model.io.ApacheDsSchemaConnector"
+          description="ApacheDS Schema Connector"
+          id="org.apache.directory.studio.schemaeditor.model.io.ApacheDsSchemaConnector"
+          name="ApacheDS Schema Connector">
+    </schemaConnector>
+    <schemaConnector
+          class="org.apache.directory.studio.schemaeditor.model.io.GenericSchemaConnector"
+          description="Generic Schema Connector"
+          id="org.apache.directory.studio.schemaeditor.model.io.GenericSchemaConnector"
+          name="Generic Schema Connector">
+    </schemaConnector>
  </extension>     
 </plugin>

Added: directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/model/io/GenericSchemaConnector.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/model/io/GenericSchemaConnector.java?rev=798544&view=auto
==============================================================================
--- directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/model/io/GenericSchemaConnector.java (added)
+++ directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/model/io/GenericSchemaConnector.java Tue Jul 28 14:46:13 2009
@@ -0,0 +1,357 @@
+/*
+ *  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.model.io;
+
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+
+import org.apache.directory.shared.ldap.schema.parsers.AttributeTypeDescription;
+import org.apache.directory.shared.ldap.schema.parsers.AttributeTypeDescriptionSchemaParser;
+import org.apache.directory.shared.ldap.schema.parsers.LdapSyntaxDescription;
+import org.apache.directory.shared.ldap.schema.parsers.LdapSyntaxDescriptionSchemaParser;
+import org.apache.directory.shared.ldap.schema.parsers.MatchingRuleDescription;
+import org.apache.directory.shared.ldap.schema.parsers.MatchingRuleDescriptionSchemaParser;
+import org.apache.directory.shared.ldap.schema.parsers.ObjectClassDescription;
+import org.apache.directory.shared.ldap.schema.parsers.ObjectClassDescriptionSchemaParser;
+import org.apache.directory.studio.connection.core.Connection;
+import org.apache.directory.studio.connection.core.Connection.AliasDereferencingMethod;
+import org.apache.directory.studio.connection.core.Connection.ReferralHandlingMethod;
+import org.apache.directory.studio.connection.core.io.jndi.JNDIConnectionWrapper;
+import org.apache.directory.studio.connection.core.jobs.StudioProgressMonitor;
+import org.apache.directory.studio.schemaeditor.model.AttributeTypeImpl;
+import org.apache.directory.studio.schemaeditor.model.MatchingRuleImpl;
+import org.apache.directory.studio.schemaeditor.model.ObjectClassImpl;
+import org.apache.directory.studio.schemaeditor.model.Schema;
+import org.apache.directory.studio.schemaeditor.model.SchemaImpl;
+import org.apache.directory.studio.schemaeditor.model.SyntaxImpl;
+
+
+/**
+ * A Generic Schema Connector, suitable for all LDAP servers.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class GenericSchemaConnector extends AbstractSchemaConnector implements SchemaConnector
+{
+
+    private static final AliasDereferencingMethod DEREF_ALIAS_METHOD = AliasDereferencingMethod.ALWAYS;
+    private static final ReferralHandlingMethod HANDLE_REFERALS_METHOD = ReferralHandlingMethod.FOLLOW;
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.studio.schemaeditor.model.io.SchemaConnector#exportSchema(org.apache.directory.studio.connection.core.Connection, org.apache.directory.studio.connection.core.StudioProgressMonitor)
+     */
+    public void exportSchema( Connection connection, StudioProgressMonitor monitor )
+    {
+        // TODO Auto-generated method stub
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.studio.schemaeditor.model.io.SchemaConnector#importSchema(org.apache.directory.studio.connection.core.Connection, org.apache.directory.studio.connection.core.StudioProgressMonitor)
+     */
+    public List<Schema> importSchema( Connection connection, StudioProgressMonitor monitor )
+    {
+        List<Schema> schemas = new ArrayList<Schema>();
+
+        JNDIConnectionWrapper wrapper = connection.getJNDIConnectionWrapper();
+
+        monitor.beginTask( "Fetching Schema: ", 1 );
+
+        SearchControls constraintSearch = new SearchControls();
+        constraintSearch.setSearchScope( SearchControls.OBJECT_SCOPE );
+        constraintSearch.setReturningAttributes( new String[]
+            { "attributeTypes", "objectClasses", "ldapSyntaxes", "matchingRules" } );
+        String schemaDn = getSubschemaSubentry( connection, monitor );
+        NamingEnumeration<SearchResult> answer = wrapper.search( schemaDn, "(objectclass=subschema)", constraintSearch,
+            DEREF_ALIAS_METHOD, HANDLE_REFERALS_METHOD, null, ( StudioProgressMonitor ) monitor, null );
+        if ( answer != null )
+        {
+            while ( answer.hasMoreElements() )
+            {
+                SearchResult searchResult = ( SearchResult ) answer.nextElement();
+                try
+                {
+                    schemas.add( getSchema( wrapper, searchResult, monitor ) );
+                }
+                catch ( Exception e )
+                {
+                    monitor.reportError( e );
+                }
+            }
+        }
+
+        monitor.worked( 1 );
+
+        return schemas;
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.studio.schemaeditor.model.io.AbstractSchemaConnector#isSuitableConnector(org.apache.directory.studio.connection.core.Connection, org.apache.directory.studio.connection.core.StudioProgressMonitor)
+     */
+    public boolean isSuitableConnector( Connection connection, StudioProgressMonitor monitor )
+    {
+        return getSubschemaSubentry( connection, monitor ) != null;
+    }
+
+
+    private static String getSubschemaSubentry( Connection connection, StudioProgressMonitor monitor )
+    {
+        JNDIConnectionWrapper wrapper = connection.getJNDIConnectionWrapper();
+
+        SearchControls constraintSearch = new SearchControls();
+        constraintSearch.setSearchScope( SearchControls.OBJECT_SCOPE );
+        constraintSearch.setReturningAttributes( new String[]
+            { "subschemaSubentry" } );
+
+        NamingEnumeration<SearchResult> answer = wrapper.search( "", "(objectclass=*)", constraintSearch,
+            DEREF_ALIAS_METHOD, HANDLE_REFERALS_METHOD, null, monitor, null );
+
+        if ( answer != null )
+        {
+            if ( answer.hasMoreElements() )
+            {
+                SearchResult searchResult = ( SearchResult ) answer.nextElement();
+
+                Attribute subschemaSubentryAttribute = searchResult.getAttributes().get( "subschemaSubentry" );
+                if ( subschemaSubentryAttribute == null )
+                {
+                    return null;
+                }
+
+                if ( subschemaSubentryAttribute.size() != 1 )
+                {
+                    return null;
+                }
+
+                String subschemaSubentry = null;
+                try
+                {
+                    subschemaSubentry = ( String ) subschemaSubentryAttribute.get();
+                }
+                catch ( NamingException e )
+                {
+                    return null;
+                }
+
+                return subschemaSubentry;
+            }
+        }
+
+        return null;
+    }
+
+
+    private static Schema getSchema( JNDIConnectionWrapper wrapper, SearchResult searchResult,
+        StudioProgressMonitor monitor ) throws NamingException, ParseException
+    {
+        monitor.subTask( "Reading schema" );
+
+        // Creating the schema
+        Schema schema = new SchemaImpl( "schema" );
+
+        Attribute attributeTypesAttribute = searchResult.getAttributes().get( "attributeTypes" );
+        if ( attributeTypesAttribute != null )
+        {
+            NamingEnumeration<?> ne = attributeTypesAttribute.getAll();
+            if ( ne != null )
+            {
+                while ( ne.hasMoreElements() )
+                {
+                    String value = ( String ) ne.nextElement();
+                    AttributeTypeDescriptionSchemaParser parser = new AttributeTypeDescriptionSchemaParser();
+                    parser.setQuirksMode( true );
+                    AttributeTypeDescription atd = parser.parseAttributeTypeDescription( value );
+
+                    AttributeTypeImpl impl = new AttributeTypeImpl( atd.getNumericOid() );
+                    impl.setOid( atd.getNumericOid() );
+                    impl.setNames( atd.getNames().toArray( new String[0] ) );
+                    impl.setDescription( atd.getDescription() );
+                    impl.setSuperiorName( atd.getSuperType() );
+                    impl.setUsage( atd.getUsage() );
+                    impl.setSyntaxOid( atd.getSyntax() );
+                    impl.setLength( atd.getSyntaxLength() );
+                    impl.setObsolete( atd.isObsolete() );
+                    impl.setCollective( atd.isCollective() );
+                    impl.setSingleValue( atd.isSingleValued() );
+                    impl.setCanUserModify( atd.isUserModifiable() );
+                    impl.setEqualityName( atd.getEqualityMatchingRule() );
+                    impl.setOrderingName( atd.getOrderingMatchingRule() );
+                    impl.setSubstrName( atd.getSubstringsMatchingRule() );
+                    impl.setSchema( schema.getName() );
+
+                    schema.addAttributeType( impl );
+                }
+            }
+        }
+
+        Attribute objectClassesAttribute = searchResult.getAttributes().get( "objectClasses" );
+        if ( objectClassesAttribute != null )
+        {
+            NamingEnumeration<?> ne = objectClassesAttribute.getAll();
+            if ( ne != null )
+            {
+                while ( ne.hasMoreElements() )
+                {
+                    String value = ( String ) ne.nextElement();
+                    ObjectClassDescriptionSchemaParser parser = new ObjectClassDescriptionSchemaParser();
+                    parser.setQuirksMode( true );
+                    ObjectClassDescription ocd = parser.parseObjectClassDescription( value );
+
+                    ObjectClassImpl impl = new ObjectClassImpl( ocd.getNumericOid() );
+                    impl.setOid( ocd.getNumericOid() );
+                    impl.setNames( ocd.getNames().toArray( new String[0] ) );
+                    impl.setDescription( ocd.getDescription() );
+                    impl.setSuperClassesNames( ocd.getSuperiorObjectClasses().toArray( new String[0] ) );
+                    impl.setType( ocd.getKind() );
+                    impl.setObsolete( ocd.isObsolete() );
+                    impl.setMustNamesList( ocd.getMustAttributeTypes().toArray( new String[0] ) );
+                    impl.setMayNamesList( ocd.getMayAttributeTypes().toArray( new String[0] ) );
+                    impl.setSchema( schema.getName() );
+
+                    schema.addObjectClass( impl );
+                }
+            }
+        }
+
+        Attribute ldapSyntaxesAttribute = searchResult.getAttributes().get( "ldapSyntaxes" );
+        if ( ldapSyntaxesAttribute != null )
+        {
+            NamingEnumeration<?> ne = ldapSyntaxesAttribute.getAll();
+            if ( ne != null )
+            {
+                while ( ne.hasMoreElements() )
+                {
+                    String value = ( String ) ne.nextElement();
+                    LdapSyntaxDescriptionSchemaParser parser = new LdapSyntaxDescriptionSchemaParser();
+                    parser.setQuirksMode( true );
+                    LdapSyntaxDescription lsd = parser.parseLdapSyntaxDescription( value );
+
+                    SyntaxImpl impl = new SyntaxImpl( lsd.getNumericOid() );
+                    impl.setDescription( lsd.getDescription() );
+                    impl.setNames( new String[]
+                        { lsd.getDescription() } );
+                    //impl.setObsolete( lsd.isObsolete() );
+                    impl.setHumanReadable( true );
+                    impl.setSchema( schema.getName() );
+
+                    schema.addSyntax( impl );
+                }
+            }
+        }
+        // TODO: if online -> all received syntaxes in attributes are valid -> create dummy syntaxes if missing
+        try
+        {
+            for ( AttributeTypeImpl at : schema.getAttributeTypes() )
+            {
+                String syntaxOid = at.getSyntaxOid();
+
+                if ( syntaxOid != null && schema.getSyntax( syntaxOid ) == null )
+                {
+                    SyntaxImpl impl = new SyntaxImpl( syntaxOid );
+                    impl.setSchema( schema.getName() );
+                    // TODO: lookup description/name
+                    impl.setDescription( "Dummy" );
+                    impl.setNames( new String[]
+                        { "Dummy" } );
+                    schema.addSyntax( impl );
+                }
+            }
+        }
+        catch ( Exception e1 )
+        {
+            // TODO Auto-generated catch block
+            e1.printStackTrace();
+        }
+
+        Attribute matchingRulesAttribute = searchResult.getAttributes().get( "matchingRules" );
+        if ( matchingRulesAttribute != null )
+        {
+            NamingEnumeration<?> ne = matchingRulesAttribute.getAll();
+            if ( ne != null )
+            {
+                while ( ne.hasMoreElements() )
+                {
+                    String value = ( String ) ne.nextElement();
+                    MatchingRuleDescriptionSchemaParser parser = new MatchingRuleDescriptionSchemaParser();
+                    parser.setQuirksMode( true );
+                    MatchingRuleDescription mrd = parser.parseMatchingRuleDescription( value );
+
+                    MatchingRuleImpl impl = new MatchingRuleImpl( mrd.getNumericOid() );
+                    impl.setDescription( mrd.getDescription() );
+                    impl.setNames( mrd.getNames().toArray( new String[0] ) );
+                    impl.setObsolete( mrd.isObsolete() );
+                    impl.setSyntaxOid( mrd.getSyntax() );
+                    impl.setSchema( schema.getName() );
+
+                    schema.addMatchingRule( impl );
+                }
+            }
+        }
+        // TODO: if online -> all received matching rules in attributes are valid -> create dummy matching rules if missing
+        try
+        {
+            for ( AttributeTypeImpl at : schema.getAttributeTypes() )
+            {
+                String equalityName = at.getEqualityName();
+                String orderingName = at.getOrderingName();
+                String substrName = at.getSubstrName();
+                checkMatchingRules( schema, equalityName, orderingName, substrName );
+            }
+        }
+        catch ( Exception e )
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+        return schema;
+    }
+
+
+    private static void checkMatchingRules( Schema schema, String... matchingRuleNames )
+    {
+        for ( String matchingRuleName : matchingRuleNames )
+        {
+            if ( matchingRuleName != null && schema.getMatchingRule( matchingRuleName ) == null )
+            {
+                MatchingRuleImpl impl = new MatchingRuleImpl( matchingRuleName );
+                impl.setSchema( schema.getName() );
+                // TODO: lookup description/name
+                impl.setDescription( "Dummy" );
+                impl.setNames( new String[]
+                    { matchingRuleName } );
+                schema.addMatchingRule( impl );
+            }
+
+        }
+
+    }
+}

Modified: directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/view/preferences/PluginPreferencePage.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/view/preferences/PluginPreferencePage.java?rev=798544&r1=798543&r2=798544&view=diff
==============================================================================
--- directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/view/preferences/PluginPreferencePage.java (original)
+++ directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/view/preferences/PluginPreferencePage.java Tue Jul 28 14:46:13 2009
@@ -76,89 +76,89 @@
         composite.setLayout( new GridLayout() );
         composite.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
 
-        //        // SchemaConnectors Group
-        //        Group schemaConnectorsGroup = new Group( composite, SWT.NONE );
-        //        schemaConnectorsGroup.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
-        //        schemaConnectorsGroup.setLayout( new GridLayout( 2, true ) );
-        //        schemaConnectorsGroup.setText( "Schema Connectors" );
-        //
-        //        // Available Schema Connectors Label
-        //        Label availableSchemaConnectorsLabel = new Label( schemaConnectorsGroup, SWT.NONE );
-        //        availableSchemaConnectorsLabel.setText( "Available Connectors:" );
-        //
-        //        // Description Label
-        //        Label descriptionLabel = new Label( schemaConnectorsGroup, SWT.NONE );
-        //        descriptionLabel.setText( "Description:" );
-        //        // SchemaConnectors TableViewer
-        //        final TableViewer schemaConnectorsTableViewer = new TableViewer( schemaConnectorsGroup, SWT.BORDER | SWT.SINGLE
-        //            | SWT.FULL_SELECTION );
-        //        GridData gridData = new GridData( SWT.FILL, SWT.NONE, true, false );
-        //        gridData.heightHint = 125;
-        //        schemaConnectorsTableViewer.getTable().setLayoutData( gridData );
-        //        schemaConnectorsTableViewer.setContentProvider( new ArrayContentProvider() );
-        //        schemaConnectorsTableViewer.setLabelProvider( new LabelProvider()
-        //        {
-        //            public String getText( Object element )
-        //            {
-        //                return ( ( SchemaConnector ) element ).getName();
-        //            }
-        //
-        //
-        //            public Image getImage( Object element )
-        //            {
-        //                return Activator.getDefault().getImage( PluginConstants.IMG_SCHEMA_CONNECTOR );
-        //            }
-        //        } );
-        //
-        //        schemaConnectorsTableViewer.setComparator( new ViewerComparator( new Comparator<String>()
-        //        {
-        //            public int compare( String o1, String o2 )
-        //            {
-        //                if ( ( o1 != null ) && ( o2 != null ) )
-        //                {
-        //                    return o1.compareToIgnoreCase( o2 );
-        //                }
-        //
-        //                // Default
-        //                return 0;
-        //            }
-        //        } ) );
-        //
-        //        //      schemaConnectorsTableViewer.setComparator( new ViewerComparator( new Comparator<SchemaConnector>()
-        //        //      {
-        //        //          public int compare( SchemaConnector o1, SchemaConnector o2 )
-        //        //          {
-        //        //              String name1 = o1.getName();
-        //        //              String name2 = o2.getName();
-        //        //
-        //        //              if ( ( name1 != null ) && ( name2 != null ) )
-        //        //              {
-        //        //                  return name1.compareToIgnoreCase( name2 );
-        //        //              }
-        //        //
-        //        //              // Default
-        //        //              return 0;
-        //        //          }
-        //        //      } ) );
-        //        schemaConnectorsTableViewer.setInput( PluginUtils.getSchemaConnectors() );
-        //
-        //        // Description Text
-        //        final Text descriptionText = new Text( schemaConnectorsGroup, SWT.BORDER | SWT.MULTI | SWT.READ_ONLY );
-        //        descriptionText.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
-        //
-        //        schemaConnectorsTableViewer.addSelectionChangedListener( new ISelectionChangedListener()
-        //        {
-        //            public void selectionChanged( SelectionChangedEvent event )
-        //            {
-        //                SchemaConnector schemaConnector = ( SchemaConnector ) ( ( StructuredSelection ) schemaConnectorsTableViewer
-        //                    .getSelection() ).getFirstElement();
-        //
-        //                if ( schemaConnector != null )
-        //                {
-        //                    descriptionText.setText( schemaConnector.getDescription() );
-        //                }
-        //            }
-        //        } );
+        // SchemaConnectors Group
+        Group schemaConnectorsGroup = new Group( composite, SWT.NONE );
+        schemaConnectorsGroup.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
+        schemaConnectorsGroup.setLayout( new GridLayout( 2, true ) );
+        schemaConnectorsGroup.setText( "Schema Connectors" );
+
+        // Available Schema Connectors Label
+        Label availableSchemaConnectorsLabel = new Label( schemaConnectorsGroup, SWT.NONE );
+        availableSchemaConnectorsLabel.setText( "Available Connectors:" );
+
+        // Description Label
+        Label descriptionLabel = new Label( schemaConnectorsGroup, SWT.NONE );
+        descriptionLabel.setText( "Description:" );
+        // SchemaConnectors TableViewer
+        final TableViewer schemaConnectorsTableViewer = new TableViewer( schemaConnectorsGroup, SWT.BORDER | SWT.SINGLE
+            | SWT.FULL_SELECTION );
+        GridData gridData = new GridData( SWT.FILL, SWT.NONE, true, false );
+        gridData.heightHint = 125;
+        schemaConnectorsTableViewer.getTable().setLayoutData( gridData );
+        schemaConnectorsTableViewer.setContentProvider( new ArrayContentProvider() );
+        schemaConnectorsTableViewer.setLabelProvider( new LabelProvider()
+        {
+            public String getText( Object element )
+            {
+                return ( ( SchemaConnector ) element ).getName();
+            }
+
+
+            public Image getImage( Object element )
+            {
+                return Activator.getDefault().getImage( PluginConstants.IMG_SCHEMA_CONNECTOR );
+            }
+        } );
+
+        schemaConnectorsTableViewer.setComparator( new ViewerComparator( new Comparator<String>()
+            {
+            public int compare( String o1, String o2 )
+            {
+                if ( ( o1 != null ) && ( o2 != null ) )
+                {
+                    return o1.compareToIgnoreCase( o2 );
+                }
+
+                // Default
+                return 0;
+            }
+            } ) );
+
+        //      schemaConnectorsTableViewer.setComparator( new ViewerComparator( new Comparator<SchemaConnector>()
+        //      {
+        //          public int compare( SchemaConnector o1, SchemaConnector o2 )
+        //          {
+        //              String name1 = o1.getName();
+        //              String name2 = o2.getName();
+        //
+        //              if ( ( name1 != null ) && ( name2 != null ) )
+        //              {
+        //                  return name1.compareToIgnoreCase( name2 );
+        //              }
+        //
+        //              // Default
+        //              return 0;
+        //          }
+        //      } ) );
+        schemaConnectorsTableViewer.setInput( PluginUtils.getSchemaConnectors() );
+
+        // Description Text
+        final Text descriptionText = new Text( schemaConnectorsGroup, SWT.BORDER | SWT.MULTI | SWT.READ_ONLY );
+        descriptionText.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
+
+        schemaConnectorsTableViewer.addSelectionChangedListener( new ISelectionChangedListener()
+        {
+            public void selectionChanged( SelectionChangedEvent event )
+            {
+                SchemaConnector schemaConnector = ( SchemaConnector ) ( ( StructuredSelection ) schemaConnectorsTableViewer
+                    .getSelection() ).getFirstElement();
+
+                if ( schemaConnector != null )
+                {
+                    descriptionText.setText( schemaConnector.getDescription() );
+                }
+            }
+        } );
 
         return parent;
     }

Modified: directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/view/wizards/NewProjectWizard.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/view/wizards/NewProjectWizard.java?rev=798544&r1=798543&r2=798544&view=diff
==============================================================================
--- directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/view/wizards/NewProjectWizard.java (original)
+++ directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/view/wizards/NewProjectWizard.java Tue Jul 28 14:46:13 2009
@@ -20,6 +20,12 @@
 package org.apache.directory.studio.schemaeditor.view.wizards;
 
 
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.directory.studio.connection.core.Connection;
+import org.apache.directory.studio.connection.core.jobs.StudioProgressMonitor;
 import org.apache.directory.studio.schemaeditor.Activator;
 import org.apache.directory.studio.schemaeditor.PluginConstants;
 import org.apache.directory.studio.schemaeditor.PluginUtils;
@@ -28,7 +34,12 @@
 import org.apache.directory.studio.schemaeditor.model.Project;
 import org.apache.directory.studio.schemaeditor.model.ProjectType;
 import org.apache.directory.studio.schemaeditor.model.Schema;
+import org.apache.directory.studio.schemaeditor.model.io.GenericSchemaConnector;
+import org.apache.directory.studio.schemaeditor.model.io.SchemaConnector;
+import org.apache.directory.studio.schemaeditor.view.ViewUtils;
 import org.apache.directory.studio.schemaeditor.view.widget.CoreSchemasSelectionWidget.ServerTypeEnum;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.wizard.IWizardPage;
 import org.eclipse.jface.wizard.Wizard;
@@ -48,11 +59,11 @@
 
     // The pages of the wizard
     private NewProjectWizardInformationPage informationPage;
-    //    private NewProjectWizardConnectionSelectionPage connectionSelectionPage;
+    private NewProjectWizardConnectionSelectionPage connectionSelectionPage;
     private NewProjectWizardSchemasSelectionPage schemasSelectionPage;
 
 
-    //    private Throwable exceptionThrown = null;
+    private Throwable exceptionThrown = null;
 
     /* (non-Javadoc)
      * @see org.eclipse.jface.wizard.Wizard#addPages()
@@ -61,12 +72,12 @@
     {
         // Creating pages
         informationPage = new NewProjectWizardInformationPage();
-        //        connectionSelectionPage = new NewProjectWizardConnectionSelectionPage();
+        connectionSelectionPage = new NewProjectWizardConnectionSelectionPage();
         schemasSelectionPage = new NewProjectWizardSchemasSelectionPage();
 
         // Adding pages
         addPage( informationPage );
-        //        addPage( connectionSelectionPage );
+        addPage( connectionSelectionPage );
         addPage( schemasSelectionPage );
     }
 
@@ -82,108 +93,121 @@
         // Creating the project
         final Project project = new Project( projectType, projectName );
 
-        //        if ( projectType.equals( ProjectType.ONLINE ) )
-        //        // Project is an "Online Project"
-        //        {
-        //            // Setting the connection to use
-        //            project.setConnection( connectionSelectionPage.getSelectedConnection() );
-        //
-        //            // Reseting the Exception Thrown
-        //            exceptionThrown = null;
-        //
-        //            try
-        //            {
-        //                getContainer().run( false, false, new IRunnableWithProgress()
-        //                {
-        //                    public void run( IProgressMonitor monitor )
-        //                    {
-        //                        StudioProgressMonitor studioProgressMonitor = new StudioProgressMonitor( monitor );
-        //
-        //                        // Getting the correct SchemaConnector for this connection
-        //                        List<SchemaConnector> correctSchemaConnectors = getCorrectSchemaConnectors( project
-        //                            .getConnection(), studioProgressMonitor );
-        //
-        //                        // If no suitable SchemaConnector has been found, we display an
-        //                        // error message and return false;
-        //                        if ( correctSchemaConnectors.size() == 0 )
-        //                        {
-        //                            studioProgressMonitor.reportError(
-        //                                "No suitable SchemaConnector has been found for the choosen Directory Server.",
-        //                                new NoSuitableSchemaConnectorException() );
-        //                        }
-        //
-        //                        // Getting the correct SchemaConnector
-        //                        SchemaConnector correctSchemaConnector = null;
-        //                        if ( correctSchemaConnectors.size() == 1 )
-        //                        {
-        //                            correctSchemaConnector = correctSchemaConnectors.get( 0 );
-        //                        }
-        //                        else
-        //                        {
-        //                            // TODO display a dialog in which the user can select the correct schema connector
-        //                        }
-        //
-        //                        project.setSchemaConnector( correctSchemaConnector );
-        //
-        //                        // Fetching the Online Schema
-        //                        project.fetchOnlineSchema( new StudioProgressMonitor( monitor ) );
-        //
-        //                        // Checking if an error has occured
-        //                        if ( studioProgressMonitor.errorsReported() )
-        //                        {
-        //                            exceptionThrown = studioProgressMonitor.getException();
-        //                            return;
-        //                        }
-        //                    }
-        //                } );
-        //            }
-        //            catch ( InvocationTargetException e )
-        //            {
-        //                // Nothing to do (it will never occur)
-        //            }
-        //            catch ( InterruptedException e )
-        //            {
-        //                // Nothing to do.
-        //            }
-        //
-        //            if ( exceptionThrown != null )
-        //            {
-        //                if ( exceptionThrown instanceof NoSuitableSchemaConnectorException )
-        //                // Special case for the 'NoSuitableSchemaConnectorException'
-        //                {
-        //                    PluginUtils.logError( "No suitable SchemaConnector has been found for the selected connection.",
-        //                        exceptionThrown );
-        //                    ViewUtils.displayErrorMessageBox( "Error", "An error occured when creating the project.\n"
-        //                        + "No suitable SchemaConnector has been found for the selected connection." );
-        //                }
-        //                else
-        //                // Standard case
-        //                {
-        //                    PluginUtils.logError( "An error occured when creating the project.", exceptionThrown );
-        //                    ViewUtils.displayErrorMessageBox( "Error", "An error occured when creating the project." );
-        //                }
-        //                return false;
-        //            }
-        //        }
-        //        else if ( projectType.equals( ProjectType.OFFLINE ) )
-        //        // Project is an "Offline Project"
-        //        {
-        // Getting the selected 'core' schemas
-        String[] selectedSchemas = schemasSelectionPage.getSelectedSchemas();
-        ServerTypeEnum serverType = schemasSelectionPage.getServerType();
-        if ( ( selectedSchemas != null ) && ( serverType != null ) )
+        if ( projectType.equals( ProjectType.ONLINE ) )
+            // Project is an "Online Project"
         {
-            SchemaHandler schemaHandler = project.getSchemaHandler();
-            for ( String selectedSchema : selectedSchemas )
+            // Setting the connection to use
+            project.setConnection( connectionSelectionPage.getSelectedConnection() );
+
+            // Reseting the Exception Thrown
+            exceptionThrown = null;
+
+            try
             {
-                Schema schema = PluginUtils.loadCoreSchema( serverType, selectedSchema );
-                if ( schema != null )
+                getContainer().run( false, false, new IRunnableWithProgress()
+                {
+                    public void run( IProgressMonitor monitor )
+                    {
+                        StudioProgressMonitor studioProgressMonitor = new StudioProgressMonitor( monitor );
+
+                        // Getting the correct SchemaConnector for this connection
+                        List<SchemaConnector> correctSchemaConnectors = getCorrectSchemaConnectors( project
+                            .getConnection(), studioProgressMonitor );
+
+                        // If no suitable SchemaConnector has been found, we display an
+                        // error message and return false;
+                        if ( correctSchemaConnectors.size() == 0 )
+                        {
+                            studioProgressMonitor.reportError(
+                                "No suitable SchemaConnector has been found for the choosen Directory Server.",
+                                new NoSuitableSchemaConnectorException() );
+                        }
+
+                        // Check if generic schema connector is included, then remove it to use a specific one
+                        if ( correctSchemaConnectors.size() > 1 )
+                        {
+                            for ( SchemaConnector schemaConnector : correctSchemaConnectors )
+                            {
+                                if ( schemaConnector instanceof GenericSchemaConnector )
+                                {
+                                    correctSchemaConnectors.remove( schemaConnector );
+                                    break;
+                                }
+                            }
+                        }
+
+                        // Getting the correct SchemaConnector
+                        SchemaConnector correctSchemaConnector = null;
+                        if ( correctSchemaConnectors.size() == 1 )
+                        {
+                            correctSchemaConnector = correctSchemaConnectors.get( 0 );
+                        }
+                        else
+                        {
+                            // TODO display a dialog in which the user can select the correct schema connector
+                        }
+
+                        project.setSchemaConnector( correctSchemaConnector );
+
+                        // Fetching the Online Schema
+                        project.fetchOnlineSchema( new StudioProgressMonitor( monitor ) );
+
+                        // Checking if an error has occured
+                        if ( studioProgressMonitor.errorsReported() )
+                        {
+                            exceptionThrown = studioProgressMonitor.getException();
+                            return;
+                        }
+                    }
+                } );
+            }
+            catch ( InvocationTargetException e )
+            {
+                // Nothing to do (it will never occur)
+            }
+            catch ( InterruptedException e )
+            {
+                // Nothing to do.
+            }
+
+            if ( exceptionThrown != null )
+            {
+                if ( exceptionThrown instanceof NoSuitableSchemaConnectorException )
+                    // Special case for the 'NoSuitableSchemaConnectorException'
+                {
+                    PluginUtils.logError( "No suitable SchemaConnector has been found for the selected connection.",
+                        exceptionThrown );
+                    ViewUtils.displayErrorMessageBox( "Error", "An error occured when creating the project.\n"
+                        + "No suitable SchemaConnector has been found for the selected connection." );
+                }
+                else
+                    // Standard case
                 {
-                    schemaHandler.addSchema( schema );
+                    PluginUtils.logError( "An error occured when creating the project.", exceptionThrown );
+                    ViewUtils.displayErrorMessageBox( "Error", "An error occured when creating the project." );
+                }
+                return false;
+            }
+        }
+        else if ( projectType.equals( ProjectType.OFFLINE ) )
+            // Project is an "Offline Project"
+        {
+            // Getting the selected 'core' schemas
+            String[] selectedSchemas = schemasSelectionPage.getSelectedSchemas();
+            ServerTypeEnum serverType = schemasSelectionPage.getServerType();
+            if ( ( selectedSchemas != null ) && ( serverType != null ) )
+            {
+                SchemaHandler schemaHandler = project.getSchemaHandler();
+                for ( String selectedSchema : selectedSchemas )
+                {
+                    Schema schema = PluginUtils.loadCoreSchema( serverType, selectedSchema );
+                    if ( schema != null )
+                    {
+                        schemaHandler.addSchema( schema );
+                    }
                 }
             }
         }
-        //        }
 
         ProjectsHandler projectsHandler = Activator.getDefault().getProjectsHandler();
         projectsHandler.addProject( project );
@@ -193,66 +217,66 @@
     }
 
 
-    //    /**
-    //     * Gets the List of suitable SchemaConnectors
-    //     *
-    //     * @param connection
-    //     *      the connection to test the SchemaConnectors with
-    //     * @return
-    //     *      the List of suitable SchemaConnectors
-    //     */
-    //    private List<SchemaConnector> getCorrectSchemaConnectors( Connection connection, StudioProgressMonitor monitor )
-    //    {
-    //        List<SchemaConnector> suitableSchemaConnectors = new ArrayList<SchemaConnector>();
-    //
-    //        // Looping on the SchemaConnectors
-    //        List<SchemaConnector> schemaConectors = PluginUtils.getSchemaConnectors();
-    //        for ( SchemaConnector schemaConnector : schemaConectors )
-    //        {
-    //            // Testing if the SchemaConnector is suitable for this connection
-    //            if ( schemaConnector.isSuitableConnector( connection, monitor ) )
-    //            {
-    //                suitableSchemaConnectors.add( schemaConnector );
-    //            }
-    //        }
-    //
-    //        return suitableSchemaConnectors;
-    //    }
-
-    //    /* (non-Javadoc)
-    //     * @see org.eclipse.jface.wizard.Wizard#getNextPage(org.eclipse.jface.wizard.IWizardPage)
-    //     */
-    //    public IWizardPage getNextPage( IWizardPage page )
-    //    {
-    //        if ( page.equals( informationPage ) )
-    //        {
-    //            if ( informationPage.getProjectType().equals( ProjectType.ONLINE ) )
-    //            {
-    //                return connectionSelectionPage;
-    //            }
-    //            else if ( informationPage.getProjectType().equals( ProjectType.OFFLINE ) )
-    //            {
-    //                return schemasSelectionPage;
-    //            }
-    //        }
-    //
-    //        // Default
-    //        return null;
-    //    }
-
-    //    /* (non-Javadoc)
-    //     * @see org.eclipse.jface.wizard.Wizard#getPreviousPage(org.eclipse.jface.wizard.IWizardPage)
-    //     */
-    //    public IWizardPage getPreviousPage( IWizardPage page )
-    //    {
-    //        if ( ( page.equals( connectionSelectionPage ) ) || ( page.equals( schemasSelectionPage ) ) )
-    //        {
-    //            return informationPage;
-    //        }
-    //
-    //        // Default
-    //        return null;
-    //    }
+    /**
+     * Gets the List of suitable SchemaConnectors
+     *
+     * @param connection
+     *      the connection to test the SchemaConnectors with
+     * @return
+     *      the List of suitable SchemaConnectors
+     */
+    private List<SchemaConnector> getCorrectSchemaConnectors( Connection connection, StudioProgressMonitor monitor )
+    {
+        List<SchemaConnector> suitableSchemaConnectors = new ArrayList<SchemaConnector>();
+
+        // Looping on the SchemaConnectors
+        List<SchemaConnector> schemaConectors = PluginUtils.getSchemaConnectors();
+        for ( SchemaConnector schemaConnector : schemaConectors )
+        {
+            // Testing if the SchemaConnector is suitable for this connection
+            if ( schemaConnector.isSuitableConnector( connection, monitor ) )
+            {
+                suitableSchemaConnectors.add( schemaConnector );
+            }
+        }
+
+        return suitableSchemaConnectors;
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.wizard.Wizard#getNextPage(org.eclipse.jface.wizard.IWizardPage)
+     */
+    public IWizardPage getNextPage( IWizardPage page )
+    {
+        if ( page.equals( informationPage ) )
+        {
+            if ( informationPage.getProjectType().equals( ProjectType.ONLINE ) )
+            {
+                return connectionSelectionPage;
+            }
+            else if ( informationPage.getProjectType().equals( ProjectType.OFFLINE ) )
+            {
+                return schemasSelectionPage;
+            }
+        }
+
+        // Default
+        return null;
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.wizard.Wizard#getPreviousPage(org.eclipse.jface.wizard.IWizardPage)
+     */
+    public IWizardPage getPreviousPage( IWizardPage page )
+    {
+        if ( ( page.equals( connectionSelectionPage ) ) || ( page.equals( schemasSelectionPage ) ) )
+        {
+            return informationPage;
+        }
+
+        // Default
+        return null;
+    }
 
     /* (non-Javadoc)
      * @see org.eclipse.jface.wizard.Wizard#canFinish()
@@ -269,10 +293,10 @@
         {
             return true;
         }
-        //        else if ( currentPage.equals( connectionSelectionPage ) )
-        //        {
-        //            return connectionSelectionPage.isPageComplete();
-        //        }
+        else if ( currentPage.equals( connectionSelectionPage ) )
+        {
+            return connectionSelectionPage.isPageComplete();
+        }
         else
         {
             return false;

Modified: directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/view/wizards/NewProjectWizardInformationPage.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/view/wizards/NewProjectWizardInformationPage.java?rev=798544&r1=798543&r2=798544&view=diff
==============================================================================
--- directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/view/wizards/NewProjectWizardInformationPage.java (original)
+++ directory/studio/trunk/schemaeditor/src/main/java/org/apache/directory/studio/schemaeditor/view/wizards/NewProjectWizardInformationPage.java Tue Jul 28 14:46:13 2009
@@ -22,6 +22,7 @@
 
 import org.apache.directory.studio.schemaeditor.Activator;
 import org.apache.directory.studio.schemaeditor.PluginConstants;
+import org.apache.directory.studio.schemaeditor.PluginUtils;
 import org.apache.directory.studio.schemaeditor.controller.ProjectsHandler;
 import org.apache.directory.studio.schemaeditor.model.ProjectType;
 import org.eclipse.swt.SWT;
@@ -31,6 +32,7 @@
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
 
@@ -89,41 +91,41 @@
             }
         } );
 
-        //        if ( PluginUtils.getSchemaConnectors().size() > 0 )
-        //        {
-        //            // Type Group
-        //            Group typeGroup = new Group( composite, SWT.NONE );
-        //            typeGroup.setText( "Type" );
-        //            typeGroup.setLayout( new GridLayout() );
-        //            typeGroup.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false, 2, 1 ) );
-        //
-        //            typeOfflineRadio = new Button( typeGroup, SWT.RADIO );
-        //            typeOfflineRadio.setText( "Offline Schema" );
-        //            typeOfflineRadio.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
-        //            typeOnlineRadio = new Button( typeGroup, SWT.RADIO );
-        //            typeOnlineRadio.setText( "Online Schema from a Directory Server" );
-        //            typeOnlineRadio.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
-        //        }
+        if ( PluginUtils.getSchemaConnectors().size() > 0 )
+        {
+            // Type Group
+            Group typeGroup = new Group( composite, SWT.NONE );
+            typeGroup.setText( "Type" );
+            typeGroup.setLayout( new GridLayout() );
+            typeGroup.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false, 2, 1 ) );
+
+            typeOfflineRadio = new Button( typeGroup, SWT.RADIO );
+            typeOfflineRadio.setText( "Offline Schema" );
+            typeOfflineRadio.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
+            typeOnlineRadio = new Button( typeGroup, SWT.RADIO );
+            typeOnlineRadio.setText( "Online Schema from a Directory Server" );
+            typeOnlineRadio.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
+        }
 
-        //        initFields();
+        initFields();
 
         setControl( composite );
     }
 
 
-    //    /**
-    //     * Initializes the UI Fields.
-    //     */
-    //    private void initFields()
-    //    {
-    //        if ( typeOfflineRadio != null )
-    //        {
-    //            typeOfflineRadio.setSelection( true );
-    //        }
-    //
-    //        displayErrorMessage( null );
-    //        setPageComplete( false );
-    //    }
+    /**
+     * Initializes the UI Fields.
+     */
+    private void initFields()
+    {
+        if ( typeOfflineRadio != null )
+        {
+            typeOfflineRadio.setSelection( true );
+        }
+
+        displayErrorMessage( null );
+        setPageComplete( false );
+    }
 
     /**
      * This method is called when the user modifies something in the UI.

Modified: directory/studio/trunk/schemaeditor/src/main/resources/org.apache.directory.studio.schemaeditor.schemaConnectors.exsd
URL: http://svn.apache.org/viewvc/directory/studio/trunk/schemaeditor/src/main/resources/org.apache.directory.studio.schemaeditor.schemaConnectors.exsd?rev=798544&r1=798543&r2=798544&view=diff
==============================================================================
--- directory/studio/trunk/schemaeditor/src/main/resources/org.apache.directory.studio.schemaeditor.schemaConnectors.exsd (original)
+++ directory/studio/trunk/schemaeditor/src/main/resources/org.apache.directory.studio.schemaeditor.schemaConnectors.exsd Tue Jul 28 14:46:13 2009
@@ -14,6 +14,9 @@
 
    <element name="extension">
       <complexType>
+         <sequence>
+            <element ref="schemaConnector" minOccurs="1" maxOccurs="unbounded"/>
+         </sequence>
          <attribute name="point" type="string" use="required">
             <annotation>
                <documentation>