/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed 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.kie.workbench.common.screens.datasource.management.client.dbexplorer; import javax.annotation.PostConstruct; import javax.enterprise.context.Dependent; import javax.inject.Inject; import org.jboss.errai.common.client.api.IsElement; import org.jboss.errai.common.client.dom.HTMLElement; import org.jboss.errai.ioc.client.api.ManagedInstance; import org.jboss.errai.ui.client.local.spi.TranslationService; import org.kie.workbench.common.screens.datasource.management.client.dbexplorer.dbobjects.DatabaseObjectExplorer; import org.kie.workbench.common.screens.datasource.management.client.dbexplorer.dbobjects.DatabaseObjectExplorerView; import org.kie.workbench.common.screens.datasource.management.client.dbexplorer.schemas.DatabaseSchemaExplorer; import org.kie.workbench.common.screens.datasource.management.client.dbexplorer.schemas.DatabaseSchemaExplorerView; import org.kie.workbench.common.screens.datasource.management.client.dbexplorer.tblviewer.TableObjectViewer; import org.kie.workbench.common.screens.datasource.management.client.resources.i18n.DataSourceManagementConstants; import org.kie.workbench.common.screens.datasource.management.client.util.InitializeCallback; import org.kie.workbench.common.screens.datasource.management.client.widgets.BreadcrumbItem; import org.uberfire.mvp.Command; @Dependent public class DatabaseStructureExplorer implements DatabaseStructureExplorerView.Presenter, IsElement { private DatabaseStructureExplorerView view; private DatabaseSchemaExplorer schemaExplorer; private DatabaseObjectExplorer objectExplorer; private TableObjectViewer objectViewer; private ManagedInstance< BreadcrumbItem > itemInstance; private BreadcrumbItem dataSourceBreadcrumbItem; private BreadcrumbItem schemasBreadcrumbItem; private BreadcrumbItem objectsBreadcrumbItem; private BreadcrumbItem objectViewerBreadcrumbItem; private TranslationService translationService; private Settings settings; private DatabaseStructureExplorerView.Handler handler; public DatabaseStructureExplorer( ) { } @Inject public DatabaseStructureExplorer( DatabaseStructureExplorerView view, DatabaseSchemaExplorer schemaExplorer, DatabaseObjectExplorer objectExplorer, TableObjectViewer objectViewer, ManagedInstance< BreadcrumbItem > itemInstance, TranslationService translationService ) { this.view = view; view.init( this ); this.schemaExplorer = schemaExplorer; this.objectExplorer = objectExplorer; this.objectViewer = objectViewer; this.itemInstance = itemInstance; this.translationService = translationService; } @Override public HTMLElement getElement( ) { return view.getElement( ); } @PostConstruct protected void init( ) { dataSourceBreadcrumbItem = createDataSourceBreadcrumbItem(); schemasBreadcrumbItem = createSchemasBreadcrumbItem(); objectsBreadcrumbItem = createObjectsBreadcrumbItem(); objectViewerBreadcrumbItem = createObjectViewerBreadcrumbItem(); schemaExplorer.addHandler( new DatabaseSchemaExplorerView.Handler( ) { @Override public void onOpen( String schemaName ) { onSchemaSelected( schemaName ); } } ); objectExplorer.addHandler( new DatabaseObjectExplorerView.Handler( ) { @Override public void onOpen( String schemaName, String objectName ) { onDataBaseObjectSelected( schemaName, objectName ); } } ); } public void initialize( Settings settings ) { initialize( settings, null ); } public void initialize( Settings settings, InitializeCallback callback ) { this.settings = settings; dataSourceBreadcrumbItem.setName( settings.dataSourceName( ) ); schemaExplorer.initialize( new DatabaseSchemaExplorer.Settings( ) .dataSourceUuid( settings.dataSourceUuid( ) ), new InitializeCallback( ) { @Override public void onInitializeError( Throwable throwable ) { if ( callback != null ) { callback.onInitializeError( throwable ); } } @Override public void onInitializeSuccess( ) { showSchemas( ); if ( callback != null ) { callback.onInitializeSuccess( ); } } } ); } public void addHandler( DatabaseStructureExplorerView.Handler handler ) { this.handler = handler; } protected void showSchemas( ) { if ( schemaExplorer.hasItems( ) ) { clearBreadcrumbs( ); setBreadcrumbs( dataSourceBreadcrumbItem, schemasBreadcrumbItem ); view.clearContent( ); view.setContent( schemaExplorer ); } else { onSchemaSelected( null ); } } protected void onSchemaSelected( String schemaName ) { view.clearContent( ); view.setContent( objectExplorer ); objectExplorer.initialize( new DatabaseObjectExplorer.Settings( ) .dataSourceUuid( settings.dataSourceUuid( ) ) .schemaName( schemaName ) ); objectsBreadcrumbItem.setName( schemaName != null ? schemaName : translationService.getTranslation( DataSourceManagementConstants.DatabaseStructureExplorerViewImpl_defaultSchema ) ); clearBreadcrumbs( ); if ( schemaExplorer.hasItems( ) ) { setBreadcrumbs( dataSourceBreadcrumbItem, schemasBreadcrumbItem, objectsBreadcrumbItem ); } else { setBreadcrumbs( dataSourceBreadcrumbItem, objectsBreadcrumbItem ); } } protected void onDataBaseObjectSelected( String schemaName, String objectName ) { view.clearContent( ); view.setContent( objectViewer ); objectViewer.initialize( new TableObjectViewer.Settings( ) .dataSourceUuid( settings.dataSourceUuid( ) ) .schemaName( schemaName ) .tableName( objectName ) ); objectViewerBreadcrumbItem.setName( objectName ); clearBreadcrumbs( ); if ( schemaExplorer.hasItems( ) ) { setBreadcrumbs( dataSourceBreadcrumbItem, schemasBreadcrumbItem, objectsBreadcrumbItem, objectViewerBreadcrumbItem ); } else { setBreadcrumbs( dataSourceBreadcrumbItem, objectsBreadcrumbItem, objectViewerBreadcrumbItem ); } } private void onDataSourceBreacrumbItemSelected( ) { if ( handler != null ) { handler.onDataSourceSelected( ); } } private void onShemasBreadcrumbItemSelected( ) { view.clearContent( ); view.setContent( schemaExplorer ); clearBreadcrumbs( ); setBreadcrumbs( dataSourceBreadcrumbItem, schemasBreadcrumbItem ); } private void onObjectsBreadcrumbItemSelected( ) { view.clearContent( ); view.setContent( objectExplorer ); clearBreadcrumbs( ); if ( schemaExplorer.hasItems( ) ) { setBreadcrumbs( dataSourceBreadcrumbItem, schemasBreadcrumbItem, objectsBreadcrumbItem ); } else { setBreadcrumbs( dataSourceBreadcrumbItem, objectsBreadcrumbItem ); } } private void onObjectViewerBreadcrumbItemSelected( ) { // do nothing, the object viewer breadcrumb is always the active breadcrumb when added. } private void clearBreadcrumbs( ) { view.clearBreadcrumbs( ); dataSourceBreadcrumbItem.setActive( false ); schemasBreadcrumbItem.setActive( false ); objectsBreadcrumbItem.setActive( false ); objectViewerBreadcrumbItem.setActive( false ); } private void setBreadcrumbs( BreadcrumbItem... items ) { BreadcrumbItem lastItem = null; for ( BreadcrumbItem item : items ) { view.addBreadcrumbItem( item ); lastItem = item; } if ( lastItem != null && lastItem != dataSourceBreadcrumbItem ) { lastItem.setActive( true ); } } protected BreadcrumbItem createDataSourceBreadcrumbItem() { return createItem( buildDisplayableName( DataSourceManagementConstants.DatabaseStructureExplorerViewImpl_dataSourceTitle ), new Command( ) { @Override public void execute( ) { onDataSourceBreacrumbItemSelected( ); } } ); } protected BreadcrumbItem createSchemasBreadcrumbItem() { return createItem( translationService.getTranslation( DataSourceManagementConstants.DatabaseStructureExplorerViewImpl_schemasTitle ), new Command( ) { @Override public void execute( ) { onShemasBreadcrumbItemSelected( ); } } ); } protected BreadcrumbItem createObjectsBreadcrumbItem() { return createItem( "", new Command( ) { @Override public void execute( ) { onObjectsBreadcrumbItemSelected( ); } } ); } protected BreadcrumbItem createObjectViewerBreadcrumbItem() { return createItem( "", new Command( ) { @Override public void execute( ) { onObjectViewerBreadcrumbItemSelected( ); } } ); } private BreadcrumbItem createItem( String name, Command command ) { BreadcrumbItem item = itemInstance.get( ); item.setName( name ); item.setCommand( command ); return item; } private String buildDisplayableName( String dataSourceName ) { return "<<" + dataSourceName; } public static class Settings { /** * Configures the data source name that will be displayed as label for the initial navigation breadcrumb. */ private String dataSourceName; /** * Configures the data source that will be explored. */ private String dataSourceUuid; public Settings( ) { } public String dataSourceName( ) { return dataSourceName; } public Settings dataSourceName( String dataSourceName ) { this.dataSourceName = dataSourceName; return this; } public String dataSourceUuid( ) { return dataSourceUuid; } public Settings dataSourceUuid( String selectedDataSourceUuid ) { this.dataSourceUuid = selectedDataSourceUuid; return this; } @Override public boolean equals( Object o ) { if ( this == o ) return true; if ( o == null || getClass( ) != o.getClass( ) ) return false; Settings settings = ( Settings ) o; if ( dataSourceName != null ? !dataSourceName.equals( settings.dataSourceName ) : settings.dataSourceName != null ) return false; return dataSourceUuid != null ? dataSourceUuid.equals( settings.dataSourceUuid ) : settings.dataSourceUuid == null; } @Override public int hashCode( ) { int result = dataSourceName != null ? dataSourceName.hashCode( ) : 0; result = ~~result; result = 31 * result + ( dataSourceUuid != null ? dataSourceUuid.hashCode( ) : 0 ); result = ~~result; return result; } } }