/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License, version 2 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*
* Copyright 2006 - 2013 Pentaho Corporation. All rights reserved.
*/
package org.pentaho.platform.engine.services.actionsequence;
import org.apache.commons.io.FilenameUtils;
import org.pentaho.platform.api.engine.IActionSequenceResource;
import org.pentaho.platform.api.repository2.unified.Converter;
import org.pentaho.platform.api.repository2.unified.IRepositoryContentConverterHandler;
import org.pentaho.platform.api.repository2.unified.IUnifiedRepository;
import org.pentaho.platform.api.repository2.unified.RepositoryFile;
import org.pentaho.platform.api.repository2.unified.RepositoryFilePermission;
import org.pentaho.platform.api.repository2.unified.UnifiedRepositoryException;
import org.pentaho.platform.api.repository2.unified.data.simple.SimpleRepositoryFileData;
import org.pentaho.platform.engine.core.system.PentahoSessionHolder;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.util.web.HttpUtil;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Locale;
import java.util.Map;
public class ActionSequenceResource implements org.pentaho.platform.api.engine.IActionSequenceResource {
private String name;
private String mimeType;
private String address;
private int sourceType;
private static IUnifiedRepository repository;
public ActionSequenceResource( final String name, final int sourceType,
final String mimeType, final String address ) {
this.name = name;
this.mimeType = mimeType;
this.sourceType = sourceType;
this.address = address;
}
public ActionSequenceResource( final String name, final int sourceType, final String mimeType,
final String solutionName, final String solutionPath, final String location ) {
this( name, sourceType, mimeType, null );
}
private static IUnifiedRepository getRepository() {
if ( repository == null ) {
repository = PentahoSystem.get( IUnifiedRepository.class, null );
}
return repository;
}
/*
* (non-Javadoc)
*
* @see org.pentaho.core.solution.IActionResource#getName()
*/
public String getName() {
return name;
}
/*
* (non-Javadoc)
*
* @see org.pentaho.core.solution.IActionResource#getMimeType()
*/
public String getMimeType() {
return mimeType;
}
/*
* (non-Javadoc)
*
* @see org.pentaho.core.solution.IActionResource#getSourceType()
*/
public int getSourceType() {
return sourceType;
}
public String getAddress() {
return address;
}
public static int getResourceType( final String sourceTypeName ) {
if ( "solution-file".equals( sourceTypeName ) ) { //$NON-NLS-1$
return IActionSequenceResource.SOLUTION_FILE_RESOURCE;
} else if ( "file".equals( sourceTypeName ) ) { //$NON-NLS-1$
return IActionSequenceResource.FILE_RESOURCE;
} else if ( "url".equals( sourceTypeName ) ) { //$NON-NLS-1$
return IActionSequenceResource.URL_RESOURCE;
} else if ( "xml".equals( sourceTypeName ) ) { //$NON-NLS-1$
return IActionSequenceResource.XML;
} else if ( "string".equals( sourceTypeName ) ) { //$NON-NLS-1$
return IActionSequenceResource.STRING;
} else {
return IActionSequenceResource.UNKNOWN_RESOURCE;
}
}
public static long getLastModifiedDate( String filePath, Locale locale ) {
if ( filePath.startsWith( "system" ) ) {
File file = null;
filePath = PentahoSystem.getApplicationContext().getSolutionPath( filePath );
if ( locale == null ) {
file = new File( filePath );
} else {
String extension = FilenameUtils.getExtension( filePath );
String baseName = FilenameUtils.removeExtension( filePath );
if ( extension.length() > 0 ) {
extension = "." + extension; //$NON-NLS-1$
}
String language = locale.getLanguage();
String country = locale.getCountry();
String variant = locale.getVariant();
if ( !variant.equals( "" ) ) { //$NON-NLS-1$
file = new File( baseName + "_" + language + "_" + country + "_" + variant + extension ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
if ( ( file == null ) || !file.exists() ) {
file = new File( baseName + "_" + language + "_" + country + extension ); //$NON-NLS-1$//$NON-NLS-2$
}
if ( ( file == null ) || !file.exists() ) {
file = new File( baseName + "_" + language + extension ); //$NON-NLS-1$
}
if ( ( file == null ) || !file.exists() ) {
file = new File( filePath );
}
}
if ( file != null ) {
return file.lastModified();
}
} else {
RepositoryFile repositoryFile = null;
if ( locale == null ) {
repositoryFile = getRepository().getFile( filePath );
} else {
String extension = FilenameUtils.getExtension( filePath );
String baseName = FilenameUtils.removeExtension( filePath );
if ( extension.length() > 0 ) {
extension = "." + extension; //$NON-NLS-1$
}
String language = locale.getLanguage();
String country = locale.getCountry();
String variant = locale.getVariant();
if ( !variant.equals( "" ) ) { //$NON-NLS-1$
repositoryFile =
getRepository().getFile( baseName + "_" + language + "_" + country + "_" + variant + extension ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
if ( repositoryFile == null ) {
repositoryFile = getRepository().getFile( baseName + "_" + language + "_" + country + extension ); //$NON-NLS-1$//$NON-NLS-2$
}
if ( repositoryFile == null ) {
repositoryFile = getRepository().getFile( baseName + "_" + language + extension ); //$NON-NLS-1$
}
if ( repositoryFile == null ) {
repositoryFile = getRepository().getFile( filePath );
}
}
if ( repositoryFile != null ) {
return repositoryFile.getLastModifiedDate().getTime();
}
}
return -1L;
}
@SuppressWarnings( { "resource", "deprecation" } )
public static InputStream getInputStream( String filePath, Locale locale ) {
InputStream inputStream = null;
if ( filePath.startsWith( "system" ) ) {
File file = null;
filePath = PentahoSystem.getApplicationContext().getSolutionPath( filePath );
if ( locale == null ) {
file = new File( filePath );
} else {
String extension = FilenameUtils.getExtension( filePath );
String baseName = FilenameUtils.removeExtension( filePath );
if ( extension.length() > 0 ) {
extension = "." + extension; //$NON-NLS-1$
}
String language = locale.getLanguage();
String country = locale.getCountry();
String variant = locale.getVariant();
if ( !variant.equals( "" ) ) { //$NON-NLS-1$
file = new File( baseName + "_" + language + "_" + country + "_" + variant + extension ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
if ( ( file == null ) || !file.exists() ) {
file = new File( baseName + "_" + language + "_" + country + extension ); //$NON-NLS-1$//$NON-NLS-2$
}
if ( ( file == null ) || !file.exists() ) {
file = new File( baseName + "_" + language + extension ); //$NON-NLS-1$
}
if ( ( file == null ) || !file.exists() ) {
file = new File( filePath );
}
}
if ( file != null ) {
try {
inputStream = new FileInputStream( file );
} catch ( FileNotFoundException ex ) {
// Do nothing we'll just return a null input stream;
}
}
} else {
// This is not a file from the system folder. User is trying to access a resource in the repository.
// Get the RepositoryContentConverterHandler
IRepositoryContentConverterHandler converterHandler = PentahoSystem.get( IRepositoryContentConverterHandler.class);
RepositoryFile repositoryFile = null;
if ( locale == null ) {
repositoryFile = getRepository().getFile( filePath );
String extension = FilenameUtils.getExtension( filePath );
try {
// Try to get the converter for the extension. If there is not converter available then we will
//assume simple type and will get the data that way
if(converterHandler != null) {
Converter converter = converterHandler.getConverter( extension );
if(converter != null) {
inputStream = converter.convert( repositoryFile.getId() );
}
}
if(inputStream == null) {
inputStream =
getRepository().getDataForRead( repositoryFile.getId(), SimpleRepositoryFileData.class ).getStream();
}
} catch ( UnifiedRepositoryException ure ) {
//ignored
}
} else {
String extension = FilenameUtils.getExtension( filePath );
String baseName = FilenameUtils.removeExtension( filePath );
if ( extension.length() > 0 ) {
extension = "." + extension; //$NON-NLS-1$
}
String language = locale.getLanguage();
String country = locale.getCountry();
String variant = locale.getVariant();
if ( !variant.equals( "" ) ) { //$NON-NLS-1$
repositoryFile =
getRepository().getFile( baseName + "_" + language + "_" + country + "_" + variant + extension ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
try {
if ( repositoryFile != null ) {
// Try to get the converter for the extension. If there is not converter available then we will
//assume simple type and will get the data that way
if(converterHandler != null) {
Converter converter = converterHandler.getConverter( FilenameUtils.getExtension( filePath ) );
if(converter != null) {
inputStream = converter.convert( repositoryFile.getId() );
}
}
if(inputStream == null) {
inputStream =
getRepository().getDataForRead( repositoryFile.getId(), SimpleRepositoryFileData.class ).getStream();
}
}
} catch ( UnifiedRepositoryException ure ) {
//ignored
}
}
if ( inputStream == null ) {
repositoryFile = getRepository().getFile( baseName + "_" + language + "_" + country + extension ); //$NON-NLS-1$//$NON-NLS-2$
try {
if ( repositoryFile != null ) {
// Try to get the converter for the extension. If there is not converter available then we will
//assume simple type and will get the data that way
if(converterHandler != null) {
Converter converter = converterHandler.getConverter( FilenameUtils.getExtension( filePath ) );
if(converter != null) {
inputStream = converter.convert( repositoryFile.getId() );
}
}
if(inputStream == null) {
inputStream =
getRepository().getDataForRead( repositoryFile.getId(), SimpleRepositoryFileData.class ).getStream();
} }
} catch ( UnifiedRepositoryException ure ) {
//ignored
}
}
if ( inputStream == null ) {
repositoryFile = getRepository().getFile( baseName + "_" + language + extension ); //$NON-NLS-1$
try {
if ( repositoryFile != null ) {
// Try to get the converter for the extension. If there is not converter available then we will
//assume simple type and will get the data that way
if(converterHandler != null) {
Converter converter = converterHandler.getConverter( FilenameUtils.getExtension( filePath ) );
if(converter != null) {
inputStream = converter.convert( repositoryFile.getId() );
}
}
if(inputStream == null) {
inputStream =
getRepository().getDataForRead( repositoryFile.getId(), SimpleRepositoryFileData.class ).getStream();
}
}
} catch ( UnifiedRepositoryException ure ) {
//ignored
}
}
if ( inputStream == null ) {
repositoryFile = getRepository().getFile( filePath );
try {
if ( repositoryFile != null ) {
// Try to get the converter for the extension. If there is not converter available then we will
//assume simple type and will get the data that way
if(converterHandler != null) {
Converter converter = converterHandler.getConverter( FilenameUtils.getExtension( filePath ) );
if(converter != null) {
inputStream = converter.convert( repositoryFile.getId() );
}
}
if(inputStream == null) {
inputStream =
getRepository().getDataForRead( repositoryFile.getId(), SimpleRepositoryFileData.class ).getStream();
}
}
} catch ( UnifiedRepositoryException ure ) {
//ignored
}
}
}
}
return inputStream;
}
public long getLastModifiedDate( Locale locale ) {
int resourceSource = getSourceType();
if ( resourceSource == IActionSequenceResource.URL_RESOURCE ) {
return -1L;
} else if ( ( resourceSource == IActionSequenceResource.SOLUTION_FILE_RESOURCE )
|| ( resourceSource == IActionSequenceResource.FILE_RESOURCE ) ) {
return getLastModifiedDate( getAddress(), locale );
} else if ( ( resourceSource == IActionSequenceResource.STRING )
|| ( resourceSource == IActionSequenceResource.XML ) ) {
return -1L;
}
return -1L;
}
public InputStream getInputStream( RepositoryFilePermission actionoperation, Locale locale ) {
int resourceSource = getSourceType();
InputStream inputStream = null;
if ( resourceSource == IActionSequenceResource.URL_RESOURCE ) {
inputStream = HttpUtil.getURLInputStream( getAddress() );
} else if ( ( resourceSource == IActionSequenceResource.SOLUTION_FILE_RESOURCE )
|| ( resourceSource == IActionSequenceResource.FILE_RESOURCE ) ) {
inputStream = getInputStream( getAddress(), locale );
} else if ( ( resourceSource == IActionSequenceResource.STRING )
|| ( resourceSource == IActionSequenceResource.XML ) ) {
String s = getAddress();
if ( s == null ) {
s = "";
}
inputStream = new ByteArrayInputStream( s.getBytes() );
}
return inputStream;
}
public InputStream getInputStream( RepositoryFilePermission actionOperation ) {
return getInputStream( actionOperation, null );
}
}