/*
* 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.net.URL;
import java.net.URLClassLoader;
import java.sql.Driver;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import javax.inject.Named;
import org.guvnor.common.services.backend.exceptions.ExceptionUtilities;
import org.guvnor.common.services.backend.util.CommentedOptionFactory;
import org.guvnor.common.services.project.model.Project;
import org.guvnor.common.services.shared.message.Level;
import org.guvnor.common.services.shared.validation.model.ValidationMessage;
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.DeleteDriverEvent;
import org.kie.workbench.common.screens.datasource.management.events.NewDriverEvent;
import org.kie.workbench.common.screens.datasource.management.events.UpdateDriverEvent;
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.DriverDeploymentInfo;
import org.kie.workbench.common.screens.datasource.management.service.DriverDefEditorService;
import org.kie.workbench.common.screens.datasource.management.util.DriverDefSerializer;
import org.kie.workbench.common.screens.datasource.management.util.MavenArtifactResolver;
import org.kie.workbench.common.services.shared.project.KieProjectService;
import org.uberfire.backend.vfs.Path;
import org.uberfire.ext.editor.commons.service.PathNamingService;
import org.uberfire.ext.editor.commons.service.RenameService;
import org.uberfire.io.IOService;
@Service
@ApplicationScoped
public class DriverDefEditorServiceImpl
extends AbstractDefEditorService<DriverDefEditorContent, DriverDef, DriverDeploymentInfo>
implements DriverDefEditorService {
private Event<NewDriverEvent> newDriverEvent;
private Event<UpdateDriverEvent> updateDriverEvent;
private Event<DeleteDriverEvent> deleteDriverEvent;
public DriverDefEditorServiceImpl() {
}
@Inject
public DriverDefEditorServiceImpl( DataSourceRuntimeManager runtimeManager,
DataSourceServicesHelper serviceHelper,
@Named("ioStrategy") IOService ioService,
KieProjectService projectService,
CommentedOptionFactory optionsFactory,
PathNamingService pathNamingService,
MavenArtifactResolver artifactResolver,
Event<NewDriverEvent> newDriverEvent,
Event<UpdateDriverEvent> updateDriverEvent,
Event<DeleteDriverEvent> deleteDriverEvent ) {
super( runtimeManager, serviceHelper, ioService, projectService, optionsFactory, pathNamingService, artifactResolver );
this.newDriverEvent = newDriverEvent;
this.updateDriverEvent = updateDriverEvent;
this.deleteDriverEvent = deleteDriverEvent;
}
@Override
protected DriverDefEditorContent newContent() {
return new DriverDefEditorContent();
}
@Override
protected DriverDef deserializeDef( String source ) {
return DriverDefSerializer.deserialize( source );
}
@Override
protected DriverDeploymentInfo readDeploymentInfo( String uuid ) throws Exception {
return runtimeManager.getDriverDeploymentInfo( uuid );
}
@Override
protected String serializeDef( DriverDef def ) {
return DriverDefSerializer.serialize( def );
}
@Override
protected void unDeploy( DriverDeploymentInfo deploymentInfo, UnDeploymentOptions options ) throws Exception {
runtimeManager.unDeployDriver( deploymentInfo, options );
}
@Override
protected void deploy( DriverDef def, DeploymentOptions options ) throws Exception {
runtimeManager.deployDriver( def, options );
}
@Override
protected void fireCreateEvent( DriverDef def, Project project ) {
newDriverEvent.fire( new NewDriverEvent( def,
project,
optionsFactory.getSafeSessionId(),
optionsFactory.getSafeIdentityName() ) );
}
@Override
protected void fireCreateEvent( DriverDef def ) {
newDriverEvent.fire( new NewDriverEvent( def,
optionsFactory.getSafeSessionId(),
optionsFactory.getSafeIdentityName() ) );
}
@Override
protected void fireUpdateEvent( DriverDef def, Project project, DriverDef originalDef ) {
updateDriverEvent.fire( new UpdateDriverEvent( def,
project,
optionsFactory.getSafeSessionId(),
optionsFactory.getSafeIdentityName(),
originalDef ) );
}
@Override
protected void fireDeleteEvent( DriverDef def, Project project ) {
deleteDriverEvent.fire( new DeleteDriverEvent( def,
project, optionsFactory.getSafeSessionId(), optionsFactory.getSafeIdentityName() ) );
}
@Override
protected String buildFileName( DriverDef def ) {
return def.getName() + ".driver";
}
@Override
protected Path create( final DriverDef driverDef, final Path context ) {
try {
validateDriver( driverDef );
} catch ( Exception e ) {
throw ExceptionUtilities.handleException( e );
}
return super.create( driverDef, context );
}
@Override
public List<ValidationMessage> validate( DriverDef driverDef ) {
List<ValidationMessage> messages = new ArrayList<>( );
ValidationMessage message;
try {
validateDriver( driverDef );
} catch ( Exception e ) {
message = new ValidationMessage();
message.setLevel( Level.ERROR );
message.setText( e.getMessage() );
messages.add( message );
}
return messages;
}
private void validateDriver( DriverDef driverDef ) throws Exception {
final URI uri = artifactResolver.resolve( driverDef.getGroupId(),
driverDef.getArtifactId(), driverDef.getVersion() );
if ( uri == null ) {
throw new Exception( "maven artifact was not found: " + driverDef.getGroupId() + ":"
+ driverDef.getArtifactId() + ":" + driverDef.getVersion() );
}
final URL[] urls = {uri.toURL()};
final URLClassLoader classLoader = new URLClassLoader( urls );
try {
Class driverClass = classLoader.loadClass( driverDef.getDriverClass() );
if ( !Driver.class.isAssignableFrom( driverClass ) ) {
throw new Exception( "class: " + driverDef.getDriverClass() + " do not extend from: " + Driver.class.getName() );
}
} catch ( ClassNotFoundException e ) {
throw new Exception( "driver class: " + driverDef.getDriverClass() + " was not found in current gav" );
}
}
}