/*
* 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.backend.service;
import java.util.List;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import org.dashbuilder.dataset.DataColumn;
import org.dashbuilder.dataset.DataSet;
import org.dashbuilder.dataset.DataSetLookup;
import org.dashbuilder.dataset.DataSetManager;
import org.dashbuilder.dataset.def.DataSetDef;
import org.dashbuilder.dataset.def.DataSetDefRegistry;
import org.dashbuilder.displayer.DisplayerSettings;
import org.dashbuilder.displayer.DisplayerSettingsFactory;
import org.dashbuilder.displayer.TableDisplayerSettingsBuilder;
import org.dashbuilder.renderer.client.DefaultRenderer;
import org.guvnor.common.services.shared.exceptions.GenericPortableException;
import org.jboss.errai.bus.server.annotations.Service;
import org.kie.workbench.common.screens.datasource.management.backend.core.DataSourceRuntimeManager;
import org.kie.workbench.common.screens.datasource.management.metadata.DatabaseMetadata;
import org.kie.workbench.common.screens.datasource.management.model.DataSourceDeploymentInfo;
import org.kie.workbench.common.screens.datasource.management.service.DataManagementService;
import org.kie.workbench.common.screens.datasource.management.service.DatabaseMetadataService;
import org.kie.workbench.common.screens.datasource.management.util.DataSetDefBuilder;
import static org.uberfire.commons.validation.PortablePreconditions.*;
@Service
@ApplicationScoped
public class DataManagementServiceImpl
implements DataManagementService {
private DataSourceRuntimeManager dataSourceRuntimeManager;
private DatabaseMetadataService databaseMetadataService;
private DataSetDefRegistry dataSetDefRegistry;
private DataSetManager dataSetManager;
private static final int COLUMN_WIDTH = 100;
@Inject
public DataManagementServiceImpl( DataSourceRuntimeManager dataSourceRuntimeManager,
DatabaseMetadataService databaseMetadataService,
DataSetDefRegistry dataSetDefRegistry,
DataSetManager dataSetManager ) {
this.dataSourceRuntimeManager = dataSourceRuntimeManager;
this.databaseMetadataService = databaseMetadataService;
this.dataSetDefRegistry = dataSetDefRegistry;
this.dataSetManager = dataSetManager;
}
@Override
public DisplayerSettings getDisplayerSettings( String dataSourceUuid, String schema, String table ) {
checkNotNull( "dataSourceUuid", dataSourceUuid );
checkNotNull( "table", table );
try {
DataSourceDeploymentInfo deploymentInfo = dataSourceRuntimeManager.getDataSourceDeploymentInfo( dataSourceUuid );
DataSetDef dataSetDef = DataSetDefBuilder.newBuilder( )
.dataSetUuid( buildDataSetUuid( dataSourceUuid, schema, table ) )
.dataSetName( buildDataSetName( schema, table ) )
.dataSourceUuid( deploymentInfo.getUuid() )
.schema( schema )
.table( buildDataSetTableName( dataSourceUuid, table ) )
.isPublic( false )
.build( );
dataSetDefRegistry.registerDataSetDef( dataSetDef );
DataSetLookup lookup = new DataSetLookup( );
lookup.setDataSetUUID( dataSetDef.getUUID( ) );
DataSet dataSet = dataSetManager.lookupDataSet( lookup );
TableDisplayerSettingsBuilder settingsBuilder = DisplayerSettingsFactory.newTableSettings( )
.dataset( dataSetDef.getUUID( ) )
.title( table )
.titleVisible( true )
.tablePageSize( 20 )
.tableOrderEnabled( true );
List< DataColumn > columns = dataSet.getColumns( );
for ( DataColumn column : columns ) {
settingsBuilder.column( column.getId( ) );
}
int tableWith = columns.size() * COLUMN_WIDTH;
settingsBuilder.tableWidth( tableWith );
settingsBuilder.renderer( DefaultRenderer.UUID );
return settingsBuilder.buildSettings( );
} catch ( Exception e ) {
throw new GenericPortableException( e.getMessage( ) );
}
}
private String buildDataSetUuid( String dataSourceUuid, String schema, String table ) {
return dataSourceUuid + ":" + schema + ":" + table;
}
private String buildDataSetName( String schema, String table ) {
return schema + "." + table;
}
private String buildDataSetTableName( String dataSourceUuid, String table ) throws Exception {
String result = table;
DatabaseMetadata metadata = databaseMetadataService.getMetadata( dataSourceUuid, false, false );
if ( metadata.getDatabaseType() != null ) {
switch ( metadata.getDatabaseType( ) ) {
case POSTGRESQL:
result = "\"" + table + "\"";
break;
case H2:
case MYSQL:
case MARIADB:
case ORACLE:
case SQLSERVER:
case DB2:
result = table;
}
}
return result;
}
}