/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2016 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * 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.pentaho.di.repository.kdr.delegates; import org.pentaho.di.cluster.SlaveServer; import org.pentaho.di.core.RowMetaAndData; import org.pentaho.di.core.encryption.Encr; import org.pentaho.di.core.exception.KettleDatabaseException; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.exception.KettleObjectExistsException; import org.pentaho.di.core.row.value.ValueMetaBoolean; import org.pentaho.di.core.row.value.ValueMetaInteger; import org.pentaho.di.core.row.value.ValueMetaString; import org.pentaho.di.i18n.BaseMessages; import org.pentaho.di.repository.ObjectId; import org.pentaho.di.repository.kdr.KettleDatabaseRepository; public class KettleDatabaseRepositorySlaveServerDelegate extends KettleDatabaseRepositoryBaseDelegate { private static Class<?> PKG = SlaveServer.class; // for i18n purposes, needed by Translator2!! public KettleDatabaseRepositorySlaveServerDelegate( KettleDatabaseRepository repository ) { super( repository ); } public RowMetaAndData getSlaveServer( ObjectId id_slave ) throws KettleException { return repository.connectionDelegate.getOneRow( quoteTable( KettleDatabaseRepository.TABLE_R_SLAVE ), quote( KettleDatabaseRepository.FIELD_SLAVE_ID_SLAVE ), id_slave ); } public synchronized ObjectId getSlaveID( String name ) throws KettleException { return repository.connectionDelegate.getIDWithValue( quoteTable( KettleDatabaseRepository.TABLE_R_SLAVE ), quote( KettleDatabaseRepository.FIELD_SLAVE_ID_SLAVE ), quote( KettleDatabaseRepository.FIELD_SLAVE_NAME ), name ); } public void saveSlaveServer( SlaveServer slaveServer ) throws KettleException { saveSlaveServer( slaveServer, null, false ); } public void saveSlaveServer( SlaveServer slaveServer, ObjectId id_transformation, boolean isUsedByTransformation ) throws KettleException { try { saveSlaveServer( slaveServer, id_transformation, isUsedByTransformation, false ); } catch ( KettleObjectExistsException e ) { // This is an expected possibility here. Common objects are not going to overwrite database objects log.logBasic( e.getMessage() ); } } public void saveSlaveServer( SlaveServer slaveServer, ObjectId id_transformation, boolean isUsedByTransformation, boolean overwrite ) throws KettleException { if ( slaveServer.getObjectId() == null ) { // See if the slave doesn't exist already (just for safety and PDI-5102 // slaveServer.setObjectId( getSlaveID( slaveServer.getName() ) ); } if ( slaveServer.getObjectId() == null ) { // New Slave Server slaveServer.setObjectId( insertSlave( slaveServer ) ); } else { ObjectId existingSlaveId = slaveServer.getObjectId(); if ( existingSlaveId != null && slaveServer.getObjectId() != null && !slaveServer.getObjectId().equals( existingSlaveId ) ) { // A slave with this name already exists if ( overwrite ) { // Proceed with save, removing the original version from the repository first repository.deleteSlave( existingSlaveId ); updateSlave( slaveServer ); } else { throw new KettleObjectExistsException( "Failed to save object to repository. Object [" + slaveServer.getName() + "] already exists." ); } } else { // There are no naming collisions (either it is the same object or the name is unique) updateSlave( slaveServer ); } } // Save the trans-slave relationship too. if ( id_transformation != null && isUsedByTransformation ) { repository.insertTransformationSlave( id_transformation, slaveServer.getObjectId() ); } } public SlaveServer loadSlaveServer( ObjectId id_slave_server ) throws KettleException { SlaveServer slaveServer = new SlaveServer(); slaveServer.setObjectId( id_slave_server ); RowMetaAndData row = getSlaveServer( id_slave_server ); if ( row == null ) { throw new KettleDatabaseException( BaseMessages.getString( PKG, "SlaveServer.SlaveCouldNotBeFound", id_slave_server.toString() ) ); } slaveServer.setName( row.getString( KettleDatabaseRepository.FIELD_SLAVE_NAME, null ) ); slaveServer.setHostname( row.getString( KettleDatabaseRepository.FIELD_SLAVE_HOST_NAME, null ) ); slaveServer.setPort( row.getString( KettleDatabaseRepository.FIELD_SLAVE_PORT, null ) ); slaveServer.setWebAppName( row.getString( KettleDatabaseRepository.FIELD_SLAVE_WEB_APP_NAME, null ) ); slaveServer.setUsername( row.getString( KettleDatabaseRepository.FIELD_SLAVE_USERNAME, null ) ); slaveServer.setPassword( Encr.decryptPasswordOptionallyEncrypted( row.getString( KettleDatabaseRepository.FIELD_SLAVE_PASSWORD, null ) ) ); slaveServer.setProxyHostname( row.getString( KettleDatabaseRepository.FIELD_SLAVE_PROXY_HOST_NAME, null ) ); slaveServer.setProxyPort( row.getString( KettleDatabaseRepository.FIELD_SLAVE_PROXY_PORT, null ) ); slaveServer.setNonProxyHosts( row.getString( KettleDatabaseRepository.FIELD_SLAVE_NON_PROXY_HOSTS, null ) ); slaveServer.setMaster( row.getBoolean( KettleDatabaseRepository.FIELD_SLAVE_MASTER, false ) ); return slaveServer; } public synchronized ObjectId insertSlave( SlaveServer slaveServer ) throws KettleException { if ( getSlaveID( slaveServer.getName() ) != null ) { // This slave server name is already in use. Throw an exception. throw new KettleObjectExistsException( "Failed to create object in repository. Object [" + slaveServer.getName() + "] already exists." ); } ObjectId id = repository.connectionDelegate.getNextSlaveServerID(); RowMetaAndData table = new RowMetaAndData(); table.addValue( new ValueMetaInteger( KettleDatabaseRepository.FIELD_SLAVE_ID_SLAVE ), id ); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_NAME ), slaveServer .getName() ); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_HOST_NAME ), slaveServer.getHostname() ); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_PORT ), slaveServer .getPort() ); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_WEB_APP_NAME ), slaveServer .getWebAppName() ); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_USERNAME ), slaveServer.getUsername() ); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_PASSWORD ), Encr .encryptPasswordIfNotUsingVariables( slaveServer.getPassword() ) ); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_PROXY_HOST_NAME ), slaveServer .getProxyHostname() ); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_PROXY_PORT ), slaveServer.getProxyPort() ); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_NON_PROXY_HOSTS ), slaveServer .getNonProxyHosts() ); table.addValue( new ValueMetaBoolean( KettleDatabaseRepository.FIELD_SLAVE_MASTER ), Boolean .valueOf( slaveServer.isMaster() ) ); repository.connectionDelegate.getDatabase().prepareInsert( table.getRowMeta(), KettleDatabaseRepository.TABLE_R_SLAVE ); repository.connectionDelegate.getDatabase().setValuesInsert( table ); repository.connectionDelegate.getDatabase().insertRow(); repository.connectionDelegate.getDatabase().closeInsert(); return id; } public synchronized void updateSlave( SlaveServer slaveServer ) throws KettleException { RowMetaAndData table = new RowMetaAndData(); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_NAME ), slaveServer .getName() ); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_HOST_NAME ), slaveServer.getHostname() ); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_PORT ), slaveServer .getPort() ); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_WEB_APP_NAME ), slaveServer .getWebAppName() ); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_USERNAME ), slaveServer.getUsername() ); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_PASSWORD ), Encr .encryptPasswordIfNotUsingVariables( slaveServer.getPassword() ) ); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_PROXY_HOST_NAME ), slaveServer .getProxyHostname() ); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_PROXY_PORT ), slaveServer.getProxyPort() ); table.addValue( new ValueMetaString( KettleDatabaseRepository.FIELD_SLAVE_NON_PROXY_HOSTS ), slaveServer .getNonProxyHosts() ); table.addValue( new ValueMetaBoolean( KettleDatabaseRepository.FIELD_SLAVE_MASTER ), Boolean .valueOf( slaveServer.isMaster() ) ); repository.connectionDelegate.updateTableRow( KettleDatabaseRepository.TABLE_R_SLAVE, KettleDatabaseRepository.FIELD_SLAVE_ID_SLAVE, table, slaveServer .getObjectId() ); } }