org.pentaho.di.resource.ResourceUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of kettle-engine Show documentation
Show all versions of kettle-engine Show documentation
Container pom for Pentaho Data Integration modules
The newest version!
/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2017 by Hitachi Vantara : 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.resource;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.commons.vfs2.FileObject;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.variables.VariableSpace;
import org.pentaho.di.core.vfs.KettleVFS;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.metastore.api.IMetaStore;
public class ResourceUtil {
private static Class> PKG = ResourceUtil.class; // for i18n purposes, needed by Translator2!!
/**
* Serializes the referenced resource export interface (Job, Transformation, Mapping, Step, Job Entry, etc) to a ZIP
* file.
*
* @param zipFilename
* The ZIP file to put the content in
* @param resourceExportInterface
* the interface to serialize
* @param space
* the space to use for variable replacement
* @param repository
* the repository to load objects from (or null if not used)
* @param metaStore
* the metaStore to load from
* @return The full VFS filename reference to the serialized export interface XML file in the ZIP archive.
* @throws KettleException
* in case anything goes wrong during serialization
*/
public static final TopLevelResource serializeResourceExportInterface( String zipFilename,
ResourceExportInterface resourceExportInterface, VariableSpace space, Repository repository,
IMetaStore metaStore ) throws KettleException {
return serializeResourceExportInterface(
zipFilename, resourceExportInterface, space, repository, metaStore, null, null );
}
/**
* Serializes the referenced resource export interface (Job, Transformation, Mapping, Step, Job Entry, etc) to a ZIP
* file.
*
* @param zipFilename
* The ZIP file to put the content in
* @param resourceExportInterface
* the interface to serialize
* @param space
* the space to use for variable replacement
* @param repository
* the repository to load objects from (or null if not used)
* @param injectXML
* The XML to inject into the resulting ZIP archive (optional, can be null)
* @param injectFilename
* The name of the file for the XML to inject in the ZIP archive (optional, can be null)
* @return The full VFS filename reference to the serialized export interface XML file in the ZIP archive.
* @throws KettleException
* in case anything goes wrong during serialization
*/
public static final TopLevelResource serializeResourceExportInterface( String zipFilename,
ResourceExportInterface resourceExportInterface, VariableSpace space, Repository repository,
IMetaStore metaStore, String injectXML, String injectFilename ) throws KettleException {
ZipOutputStream out = null;
try {
Map definitions = new HashMap();
// In case we want to add an extra pay-load to the exported ZIP file...
//
if ( injectXML != null ) {
ResourceDefinition resourceDefinition = new ResourceDefinition( injectFilename, injectXML );
definitions.put( injectFilename, resourceDefinition );
}
ResourceNamingInterface namingInterface = new SequenceResourceNaming();
String topLevelResource =
resourceExportInterface.exportResources( space, definitions, namingInterface, repository, metaStore );
if ( topLevelResource != null && !definitions.isEmpty() ) {
// Create the ZIP file...
//
FileObject fileObject = KettleVFS.getFileObject( zipFilename, space );
// Store the XML in the definitions in a ZIP file...
//
out = new ZipOutputStream( KettleVFS.getOutputStream( fileObject, false ) );
for ( String filename : definitions.keySet() ) {
ResourceDefinition resourceDefinition = definitions.get( filename );
ZipEntry zipEntry = new ZipEntry( resourceDefinition.getFilename() );
String comment =
BaseMessages.getString(
PKG, "ResourceUtil.SerializeResourceExportInterface.ZipEntryComment.OriginatingFile", filename,
Const.NVL( resourceDefinition.getOrigin(), "-" ) );
zipEntry.setComment( comment );
out.putNextEntry( zipEntry );
out.write( resourceDefinition.getContent().getBytes() );
out.closeEntry();
}
String zipURL = fileObject.getName().toString();
return new TopLevelResource( topLevelResource, zipURL, "zip:" + zipURL + "!" + topLevelResource );
} else {
throw new KettleException( BaseMessages.getString( PKG, "ResourceUtil.Exception.NoResourcesFoundToExport" ) );
}
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString(
PKG, "ResourceUtil.Exception.ErrorSerializingExportInterface", resourceExportInterface.toString() ), e );
} finally {
if ( out != null ) {
try {
out.close();
} catch ( IOException e ) {
throw new KettleException( BaseMessages.getString(
PKG, "ResourceUtil.Exception.ErrorClosingZipStream", zipFilename ) );
}
}
}
}
public static String getExplanation( String zipFilename, String launchFile,
ResourceExportInterface resourceExportInterface ) {
String commandString = "";
if ( Const.isWindows() ) {
if ( resourceExportInterface instanceof TransMeta ) {
commandString += "Pan.bat /file:\"";
} else {
commandString += "Kitchen.bat /file:\"";
}
} else {
if ( resourceExportInterface instanceof TransMeta ) {
commandString += "sh pan.sh -file='";
} else {
commandString += "sh kitchen.sh -file='";
}
}
commandString += launchFile;
if ( Const.isWindows() ) {
commandString += "\"";
} else {
commandString += "'";
}
String message =
BaseMessages.getString(
PKG, "ResourceUtil.ExportResourcesExplanation", zipFilename, commandString, launchFile, Const.CR );
return message;
}
}