/*!
* 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 org.pentaho.di.core.Const;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.partition.PartitionSchema;
import org.pentaho.di.repository.ObjectId;
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.DataProperty;
import org.pentaho.platform.api.repository2.unified.data.node.NodeRepositoryFileData;
public class PartitionDelegate extends AbstractDelegate implements ITransformer,
SharedObjectAssembler<PartitionSchema>, java.io.Serializable {
private static final long serialVersionUID = -6069812592810099251L; /* EESOURCE: UPDATE SERIALVERUID */
private static final String NODE_ROOT = "partitionSchema"; //$NON-NLS-1$
private static final String PROP_DYNAMIC_DEFINITION = "DYNAMIC_DEFINITION"; //$NON-NLS-1$
private static final String PROP_PARTITIONS_PER_SLAVE = "PARTITIONS_PER_SLAVE"; //$NON-NLS-1$
private static final String NODE_ATTRIBUTES = "attributes"; //$NON-NLS-1$
private static final String PROP_NB_PARTITION_SCHEMA = "NB_PARTITION_SCHEMA"; //$NON-NLS-1$
// ~ Instance fields =================================================================================================
private PurRepository repo;
// ~ Constructors ====================================================================================================
public PartitionDelegate( final PurRepository repo ) {
super();
this.repo = repo;
}
// ~ Methods =========================================================================================================
public RepositoryElementInterface dataNodeToElement( DataNode rootNode ) throws KettleException {
PartitionSchema partitionSchema = new PartitionSchema();
dataNodeToElement( rootNode, partitionSchema );
return partitionSchema;
}
public void dataNodeToElement( DataNode rootNode, RepositoryElementInterface element ) throws KettleException {
PartitionSchema partitionSchema = (PartitionSchema) element;
partitionSchema.setDynamicallyDefined( rootNode.getProperty( PROP_DYNAMIC_DEFINITION ).getBoolean() );
partitionSchema.setNumberOfPartitionsPerSlave( getString( rootNode, PROP_PARTITIONS_PER_SLAVE ) );
// Also, load all the properties we can find...
DataNode attrNode = rootNode.getNode( NODE_ATTRIBUTES );
long partitionSchemaSize = attrNode.getProperty( PROP_NB_PARTITION_SCHEMA ).getLong();
for ( int i = 0; i < partitionSchemaSize; i++ ) {
DataProperty property = attrNode.getProperty( String.valueOf( i ) );
partitionSchema.getPartitionIDs().add( Const.NVL( property.getString(), "" ) );
}
}
public DataNode elementToDataNode( RepositoryElementInterface element ) throws KettleException {
PartitionSchema partitionSchema = (PartitionSchema) element;
DataNode rootNode = new DataNode( NODE_ROOT );
// Check for naming collision
ObjectId partitionId = repo.getPartitionSchemaID( partitionSchema.getName() );
if ( partitionId != null && !partitionSchema.getObjectId().equals( partitionId ) ) {
// We have a naming collision, abort the save
throw new KettleException( "Failed to save object to repository. Object [" + partitionSchema.getName()
+ "] already exists." );
}
rootNode.setProperty( PROP_DYNAMIC_DEFINITION, partitionSchema.isDynamicallyDefined() );
rootNode.setProperty( PROP_PARTITIONS_PER_SLAVE, partitionSchema.getNumberOfPartitionsPerSlave() );
// Save the cluster-partition relationships
DataNode attrNode = rootNode.addNode( NODE_ATTRIBUTES );
attrNode.setProperty( PROP_NB_PARTITION_SCHEMA, partitionSchema.getPartitionIDs().size() );
for ( int i = 0; i < partitionSchema.getPartitionIDs().size(); i++ ) {
attrNode.setProperty( String.valueOf( i ), partitionSchema.getPartitionIDs().get( i ) );
}
return rootNode;
}
public PartitionSchema assemble( RepositoryFile file, NodeRepositoryFileData data, VersionSummary version )
throws KettleException {
PartitionSchema partitionSchema = (PartitionSchema) dataNodeToElement( data.getNode() );
partitionSchema.setName( file.getTitle() );
partitionSchema.setObjectId( new StringObjectId( file.getId().toString() ) );
partitionSchema.setObjectRevision( repo.createObjectRevision( version ) );
partitionSchema.clearChanged();
return partitionSchema;
}
}