/* * 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.util.ArrayList; import java.util.List; import org.apache.directory.studio.common.core.jobs.StudioProgressMonitor; import org.apache.directory.studio.connection.core.Connection; import org.apache.directory.studio.connection.core.jobs.StudioConnectionRunnableWithProgress; import org.apache.directory.studio.connection.ui.RunnableContextRunner; 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.controller.SchemaHandler; 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.widget.CoreSchemasSelectionWidget.ServerTypeEnum; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.Wizard; import org.eclipse.ui.INewWizard; import org.eclipse.ui.IWorkbench; /** * This class represents the wizard to create a new Project. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class NewProjectWizard extends Wizard implements INewWizard { public static final String ID = PluginConstants.NEW_WIZARD_NEW_PROJECT_WIZARD; // The pages of the wizard private NewProjectWizardInformationPage informationPage; private NewProjectWizardConnectionSelectionPage connectionSelectionPage; private NewProjectWizardSchemasSelectionPage schemasSelectionPage; /** * {@inheritDoc} */ public void addPages() { // Creating pages informationPage = new NewProjectWizardInformationPage(); connectionSelectionPage = new NewProjectWizardConnectionSelectionPage(); schemasSelectionPage = new NewProjectWizardSchemasSelectionPage(); // Adding pages addPage( informationPage ); addPage( connectionSelectionPage ); addPage( schemasSelectionPage ); } /** * {@inheritDoc} */ public boolean performFinish() { String projectName = informationPage.getProjectName(); ProjectType projectType = informationPage.getProjectType(); // 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() ); RunnableContextRunner.execute( new StudioConnectionRunnableWithProgress() { public void run( StudioProgressMonitor monitor ) { // Getting the correct SchemaConnector for this connection List<SchemaConnector> correctSchemaConnectors = getCorrectSchemaConnectors( project.getConnection(), monitor ); // If no suitable SchemaConnector has been found, we display an // error message and return false; if ( correctSchemaConnectors.size() == 0 ) { monitor.reportError( "No suitable SchemaConnector has been found for the choosen Directory Server.", //$NON-NLS-1$ 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( monitor ); } public String getName() { return Messages.getString( "NewProjectWizard.FetchingSchema" ); //$NON-NLS-1$; } public Object[] getLockedObjects() { return null; } public String getErrorMessage() { return Messages.getString( "NewProjectWizard.ErrorWhileFetchingSchema" ); //$NON-NLS-1$; } public Connection[] getConnections() { return null; } }, getContainer(), true ); } 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 ) { schema.setProject( project ); schemaHandler.addSchema( schema ); } } } } ProjectsHandler projectsHandler = Activator.getDefault().getProjectsHandler(); projectsHandler.addProject( project ); projectsHandler.openProject( project ); return true; } /** * 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; } /** * {@inheritDoc} */ 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; } /** * {@inheritDoc} */ public IWizardPage getPreviousPage( IWizardPage page ) { if ( ( page.equals( connectionSelectionPage ) ) || ( page.equals( schemasSelectionPage ) ) ) { return informationPage; } // Default return null; } /** * {@inheritDoc} */ public boolean canFinish() { IWizardPage currentPage = getContainer().getCurrentPage(); if ( currentPage.equals( informationPage ) ) { return false; } else if ( currentPage.equals( schemasSelectionPage ) ) { return true; } else if ( currentPage.equals( connectionSelectionPage ) ) { return connectionSelectionPage.isPageComplete(); } else { return false; } } /** * {@inheritDoc} */ public void init( IWorkbench workbench, IStructuredSelection selection ) { setNeedsProgressMonitor( true ); } class NoSuitableSchemaConnectorException extends Exception { private static final long serialVersionUID = 1L; } }