/* * 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.net.URI; import java.sql.Connection; import java.util.Properties; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.event.Event; import javax.inject.Inject; import javax.inject.Named; import org.guvnor.common.services.backend.util.CommentedOptionFactory; import org.guvnor.common.services.project.model.Project; 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.backend.core.DeploymentOptions; import org.kie.workbench.common.screens.datasource.management.backend.core.UnDeploymentOptions; import org.kie.workbench.common.screens.datasource.management.events.DeleteDataSourceEvent; import org.kie.workbench.common.screens.datasource.management.events.NewDataSourceEvent; import org.kie.workbench.common.screens.datasource.management.events.UpdateDataSourceEvent; import org.kie.workbench.common.screens.datasource.management.model.DataSourceDef; import org.kie.workbench.common.screens.datasource.management.model.DataSourceDefEditorContent; import org.kie.workbench.common.screens.datasource.management.model.DataSourceDeploymentInfo; import org.kie.workbench.common.screens.datasource.management.model.DriverDef; import org.kie.workbench.common.screens.datasource.management.model.DriverDefEditorContent; import org.kie.workbench.common.screens.datasource.management.model.DriverDefInfo; import org.kie.workbench.common.screens.datasource.management.model.TestResult; import org.kie.workbench.common.screens.datasource.management.service.DataSourceDefEditorService; import org.kie.workbench.common.screens.datasource.management.service.DataSourceDefQueryService; import org.kie.workbench.common.screens.datasource.management.service.DriverDefEditorService; import org.kie.workbench.common.screens.datasource.management.util.DataSourceDefSerializer; import org.kie.workbench.common.screens.datasource.management.util.MavenArtifactResolver; import org.kie.workbench.common.screens.datasource.management.util.URLConnectionFactory; import org.kie.workbench.common.services.shared.project.KieProjectService; import org.uberfire.ext.editor.commons.service.PathNamingService; import org.uberfire.ext.editor.commons.service.RenameService; import org.uberfire.io.IOService; import static org.kie.workbench.common.screens.datasource.management.util.ServiceUtil.*; @Service @ApplicationScoped public class DataSourceDefEditorServiceImpl extends AbstractDefEditorService<DataSourceDefEditorContent, DataSourceDef, DataSourceDeploymentInfo> implements DataSourceDefEditorService { private DataSourceDefQueryService dataSourceDefQueryService; private DriverDefEditorService driverDefService; private Event<NewDataSourceEvent> newDataSourceEvent; private Event<UpdateDataSourceEvent> updateDataSourceEvent; private Event<DeleteDataSourceEvent> deleteDataSourceEvent; public DataSourceDefEditorServiceImpl() { } @Inject public DataSourceDefEditorServiceImpl( DataSourceRuntimeManager runtimeManager, DataSourceServicesHelper serviceHelper, @Named("ioStrategy") IOService ioService, KieProjectService projectService, CommentedOptionFactory optionsFactory, PathNamingService pathNamingService, MavenArtifactResolver artifactResolver, DataSourceDefQueryService dataSourceDefQueryService, DriverDefEditorService driverDefService, Event<NewDataSourceEvent> newDataSourceEvent, Event<UpdateDataSourceEvent> updateDataSourceEvent, Event<DeleteDataSourceEvent> deleteDataSourceEvent ) { super( runtimeManager, serviceHelper, ioService, projectService, optionsFactory, pathNamingService, artifactResolver ); this.dataSourceDefQueryService = dataSourceDefQueryService; this.driverDefService = driverDefService; this.newDataSourceEvent = newDataSourceEvent; this.updateDataSourceEvent = updateDataSourceEvent; this.deleteDataSourceEvent = deleteDataSourceEvent; } @Override protected DataSourceDefEditorContent newContent() { return new DataSourceDefEditorContent(); } @Override protected String serializeDef( DataSourceDef def ) { return DataSourceDefSerializer.serialize( def ); } @Override protected DataSourceDef deserializeDef( String source ) { return DataSourceDefSerializer.deserialize( source ); } @Override protected DataSourceDeploymentInfo readDeploymentInfo( String uuid ) throws Exception { return runtimeManager.getDataSourceDeploymentInfo( uuid ); } @Override protected void deploy( DataSourceDef def, DeploymentOptions options ) throws Exception { runtimeManager.deployDataSource( def, options ); } @Override protected void unDeploy( DataSourceDeploymentInfo deploymentInfo, UnDeploymentOptions options ) throws Exception { runtimeManager.unDeployDataSource( deploymentInfo, options ); } @Override protected void fireCreateEvent( DataSourceDef def, Project project ) { newDataSourceEvent.fire( new NewDataSourceEvent( def, project, optionsFactory.getSafeSessionId(), optionsFactory.getSafeIdentityName() ) ); } @Override protected void fireCreateEvent( DataSourceDef def ) { newDataSourceEvent.fire( new NewDataSourceEvent( def, optionsFactory.getSafeSessionId(), optionsFactory.getSafeIdentityName() ) ); } @Override protected void fireUpdateEvent( DataSourceDef def, Project project, DataSourceDef originalDef ) { updateDataSourceEvent.fire( new UpdateDataSourceEvent( def, project, optionsFactory.getSafeSessionId(), optionsFactory.getSafeIdentityName(), originalDef ) ); } @Override protected void fireDeleteEvent( DataSourceDef def, Project project ) { deleteDataSourceEvent.fire( new DeleteDataSourceEvent( def, project, optionsFactory.getSafeSessionId(), optionsFactory.getSafeIdentityName() ) ); } @Override protected String buildFileName( DataSourceDef def ) { return def.getName() + ".datasource"; } @Override public TestResult testConnection( DataSourceDef dataSourceDef ) { return testConnection( dataSourceDef, null ); } @Override public TestResult testConnection( DataSourceDef dataSourceDef, Project project ) { TestResult result = new TestResult( false ); if ( isEmpty( dataSourceDef.getConnectionURL() ) ) { result.setMessage( "A valid connection url is required" ); return result; } if ( isEmpty( dataSourceDef.getUser() ) || isEmpty( dataSourceDef.getPassword() ) ) { result.setMessage( "A valid user and password are required" ); return result; } DriverDefInfo driverDefInfo = null; if ( isEmpty( dataSourceDef.getDriverUuid() ) ) { result.setMessage( "A valid driver is required" ); return result; } if ( project != null ) { driverDefInfo = dataSourceDefQueryService.findProjectDriver( dataSourceDef.getDriverUuid(), project.getRootPath() ); } else { driverDefInfo = dataSourceDefQueryService.findGlobalDriver( dataSourceDef.getDriverUuid() ); } if ( driverDefInfo == null ) { result.setMessage( "Data source driver: " + dataSourceDef.getUuid() + " was not found" ); return result; } DriverDefEditorContent driverDefEditorContent = driverDefService.loadContent( driverDefInfo.getPath() ); DriverDef driverDef = driverDefEditorContent.getDef(); URI uri; try { uri = artifactResolver.resolve( driverDef.getGroupId(), driverDef.getArtifactId(), driverDef.getVersion() ); } catch ( Exception e ) { result.setMessage( "Connection could not be tested due to the following error: " + e.getMessage() ); return result; } if ( uri == null ) { result.setMessage( "Driver artifact: " + driverDef.getGroupId() + ":" + driverDef.getArtifactId() + ":" + driverDef.getVersion() + " was not found" ); return result; } try { Properties properties = new Properties( ); properties.put( "user", dataSourceDef.getUser() ); properties.put("password", dataSourceDef.getPassword() ); URLConnectionFactory connectionFactory = new URLConnectionFactory( uri.toURL(), driverDef.getDriverClass(), dataSourceDef.getConnectionURL(), properties ); Connection conn = connectionFactory.createConnection(); if ( conn == null ) { result.setMessage( "It was not possible to open connection" ); } else { StringBuilder stringBuilder = new StringBuilder( ); stringBuilder.append( "Connection was successfully obtained: " + conn ); stringBuilder.append( "\n" ); stringBuilder.append( "*** DatabaseProductName: " + conn.getMetaData().getDatabaseProductName() ); stringBuilder.append( "\n" ); stringBuilder.append( "*** DatabaseProductVersion: " + conn.getMetaData().getDatabaseProductVersion() ); stringBuilder.append( "\n" ); stringBuilder.append( "*** DriverName: " + conn.getMetaData().getDriverName() ); stringBuilder.append( "\n" ); stringBuilder.append( "*** DriverVersion: " + conn.getMetaData().getDriverVersion() ); stringBuilder.append( "\n" ); conn.close(); stringBuilder.append( "Connection was successfully released." ); stringBuilder.append( "\n" ); result.setTestPassed( true ); result.setMessage( stringBuilder.toString() ); } return result; } catch ( Exception e ) { result.setMessage( e.getMessage() ); return result; } } }