/*!
* Copyright 2010 - 2015 Pentaho Corporation. All rights reserved.
*
* 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.pur;
import java.util.List;
import org.pentaho.di.cluster.ClusterSchema;
import org.pentaho.di.cluster.SlaveServer;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.repository.ObjectId;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.repository.RepositoryElementInterface;
import org.pentaho.di.repository.StringObjectId;
import org.pentaho.platform.api.repository2.unified.RepositoryFile;
import org.pentaho.platform.api.repository2.unified.VersionSummary;
import org.pentaho.platform.api.repository2.unified.data.node.DataNode;
import org.pentaho.platform.api.repository2.unified.data.node.DataNodeRef;
import org.pentaho.platform.api.repository2.unified.data.node.NodeRepositoryFileData;
public class ClusterDelegate extends AbstractDelegate implements ITransformer, SharedObjectAssembler<ClusterSchema>,
java.io.Serializable {
private static final long serialVersionUID = -4350522899150054287L; /* EESOURCE: UPDATE SERIALVERUID */
private static final String NODE_ROOT = "Slave"; //$NON-NLS-1$
private static final String PROP_BASE_PORT = "BASE_PORT"; //$NON-NLS-1$
private static final String PROP_SOCKETS_BUFFER_SIZE = "SOCKETS_BUFFER_SIZE"; //$NON-NLS-1$
private static final String PROP_SOCKETS_FLUSH_INTERVAL = "SOCKETS_FLUSH_INTERVAL"; //$NON-NLS-1$
private static final String PROP_SOCKETS_COMPRESSED = "SOCKETS_COMPRESSED"; //$NON-NLS-1$
private static final String PROP_DYNAMIC = "DYNAMIC"; //$NON-NLS-1$
private static final String NODE_ATTRIBUTES = "attributes"; //$NON-NLS-1$
private static final String PROP_NB_SLAVE_SERVERS = "NB_SLAVE_SERVERS"; //$NON-NLS-1$
// ~ Instance fields =================================================================================================
private PurRepository repo;
// ~ Constructors ====================================================================================================
public ClusterDelegate( final PurRepository repo ) {
super();
this.repo = repo;
}
public RepositoryElementInterface dataNodeToElement( DataNode rootNode ) throws KettleException {
ClusterSchema clusterSchema = new ClusterSchema();
dataNodeToElement( rootNode, clusterSchema );
return clusterSchema;
}
public void dataNodeToElement( DataNode rootNode, RepositoryElementInterface element ) throws KettleException {
ClusterSchema clusterSchema = (ClusterSchema) element;
// The metadata...
clusterSchema.setBasePort( getString( rootNode, PROP_BASE_PORT ) );
clusterSchema.setSocketsBufferSize( getString( rootNode, PROP_SOCKETS_BUFFER_SIZE ) );
clusterSchema.setSocketsFlushInterval( getString( rootNode, PROP_SOCKETS_FLUSH_INTERVAL ) );
clusterSchema.setSocketsCompressed( rootNode.getProperty( PROP_SOCKETS_COMPRESSED ).getBoolean() );
clusterSchema.setDynamic( rootNode.getProperty( PROP_DYNAMIC ).getBoolean() );
DataNode attrNode = rootNode.getNode( NODE_ATTRIBUTES );
// The slaves...
long nrSlaves = attrNode.getProperty( PROP_NB_SLAVE_SERVERS ).getLong();
for ( int i = 0; i < nrSlaves; i++ ) {
if ( attrNode.hasProperty( String.valueOf( i ) ) ) {
DataNodeRef slaveNodeRef = attrNode.getProperty( String.valueOf( i ) ).getRef();
clusterSchema.getSlaveServers().add( findSlaveServer( new StringObjectId( slaveNodeRef.toString() ) ) );
}
}
}
public DataNode elementToDataNode( RepositoryElementInterface element ) throws KettleException {
ClusterSchema clusterSchema = (ClusterSchema) element;
DataNode rootNode = new DataNode( NODE_ROOT );
// save the properties...
rootNode.setProperty( PROP_BASE_PORT, clusterSchema.getBasePort() );
rootNode.setProperty( PROP_SOCKETS_BUFFER_SIZE, clusterSchema.getSocketsBufferSize() );
rootNode.setProperty( PROP_SOCKETS_FLUSH_INTERVAL, clusterSchema.getSocketsFlushInterval() );
rootNode.setProperty( PROP_SOCKETS_COMPRESSED, clusterSchema.isSocketsCompressed() );
rootNode.setProperty( PROP_DYNAMIC, clusterSchema.isDynamic() );
DataNode attrNode = rootNode.addNode( NODE_ATTRIBUTES );
// Also save the used slave server references.
attrNode.setProperty( PROP_NB_SLAVE_SERVERS, clusterSchema.getSlaveServers().size() );
for ( int i = 0; i < clusterSchema.getSlaveServers().size(); i++ ) {
SlaveServer slaveServer = clusterSchema.getSlaveServers().get( i );
DataNodeRef slaveNodeRef = new DataNodeRef( slaveServer.getObjectId().getId() );
// Save the slave server by reference, this way it becomes impossible to delete the slave by accident when still
// in use.
attrNode.setProperty( String.valueOf( i ), slaveNodeRef );
}
return rootNode;
}
private SlaveServer findSlaveServer( ObjectId slaveServerId ) {
List<SlaveServer> slaveServers;
try {
slaveServers = repo.getSlaveServers();
for ( SlaveServer slaveServer : slaveServers ) {
if ( slaveServer.getObjectId().equals( slaveServerId ) ) {
return slaveServer;
}
}
} catch ( KettleException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
protected Repository getRepository() {
return repo;
}
public ClusterSchema assemble( RepositoryFile file, NodeRepositoryFileData data, VersionSummary version )
throws KettleException {
ClusterSchema clusterSchema = (ClusterSchema) dataNodeToElement( data.getNode() );
clusterSchema.setName( file.getTitle() );
clusterSchema.setObjectId( new StringObjectId( file.getId().toString() ) );
clusterSchema.setObjectRevision( repo.createObjectRevision( version ) );
clusterSchema.clearChanged();
return clusterSchema;
}
}