/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.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 Lesser General Public License for more details. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.reporting.designer.core.settings; import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.pentaho.reporting.designer.core.ReportDesignerBoot; import org.pentaho.reporting.designer.core.ReportDesignerInfo; import org.pentaho.reporting.engine.classic.core.ClassicEngineBoot; import org.pentaho.reporting.libraries.base.config.Configuration; import org.pentaho.reporting.libraries.base.util.IOUtils; import org.pentaho.reporting.libraries.base.util.ObjectUtilities; import org.pentaho.reporting.libraries.base.util.StringUtils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; import java.net.URLDecoder; public class SettingsUtil { private static Log LOG = LogFactory.getLog( SettingsUtil.class ); private SettingsUtil() { } private static boolean isValidConfiguration( final File configDirectory ) { final File initMarkerFile = new File( configDirectory, ".init-config-marker" ); // NON-NLS if ( initMarkerFile.exists() == false ) { return false; } final ReportDesignerInfo reportDesignerInfo = ReportDesignerInfo.getInstance(); final String currentVersion = reportDesignerInfo.getVersion(); if ( StringUtils.isEmpty( currentVersion ) || currentVersion.startsWith( "TRUNK-SNAPSHOT" ) ) // NON-NLS { return true; } final Integer[] currentVersionArray = ObjectUtilities.parseVersions( currentVersion ); try { final byte[] buffer = new byte[ 500 ]; final FileInputStream fin = new FileInputStream( initMarkerFile ); try { final int length = IOUtils.getInstance().readSafely( fin, buffer, 0, 500 ); final byte[] data = new byte[ length ]; System.arraycopy( buffer, 0, data, 0, length ); final String versionString = new String( data, "ISO-8859-1" ); if ( StringUtils.isEmpty( versionString ) ) { return true; } final Integer[] versionArray = ObjectUtilities.parseVersions( versionString ); if ( ObjectUtilities.compareVersionArrays( versionArray, currentVersionArray ) >= 0 ) { return true; } } finally { fin.close(); } } catch ( IOException e ) { return false; } return false; } private static void writeVersionTag( final File configDirectory ) throws IOException { final File initMarkerFile = new File( configDirectory, ".init-config-marker" ); // NON-NLS final FileOutputStream fout = new FileOutputStream( initMarkerFile ); final ReportDesignerInfo reportDesignerInfo = ReportDesignerInfo.getInstance(); final String currentVersion = reportDesignerInfo.getVersion(); if ( StringUtils.isEmpty( currentVersion ) == false && currentVersion.startsWith( "TRUNK-SNAPSHOT" ) == false ) // NON-NLS { try { fout.write( currentVersion.getBytes( "ISO-8859-1" ) ); } finally { fout.close(); } } else { fout.close(); } } public static void createInitialConfiguration() { try { final Configuration theConfiguration = ReportDesignerBoot.getInstance().getGlobalConfig(); final String homeDirectory = theConfiguration.getConfigProperty( "user.home" ); // NON-NLS final File configDirectory = new File( homeDirectory + File.separatorChar + ".pentaho" ); // NON-NLS if ( configDirectory.exists() == false ) { if ( configDirectory.mkdir() == false ) { return; } } if ( isValidConfiguration( configDirectory ) ) { return; } final File installDirFile = computeInstallationDirectory(); if ( installDirFile != null ) { final File configTemplateDir = new File( installDirFile, "configuration-template" ); // NON-NLS if ( configTemplateDir.exists() == false ) { return; } final File configTemplateJndi = new File( configTemplateDir, "simple-jndi" ); final File configDirJndi = new File( configDirectory, "simple-jndi" ); if ( configDirJndi.exists() == false ) { FileUtils.copyDirectory( configTemplateJndi, configDirJndi ); } final File configTemplateConf = new File( configTemplateDir, "report-designer" ); final File configDirConf = new File( configDirectory, "report-designer" ); if ( configTemplateConf.exists() && configTemplateConf.isDirectory() ) { FileUtils.copyDirectory( configTemplateConf, configDirConf ); } writeVersionTag( configDirectory ); } } catch ( IOException e ) { LOG.debug( "createInitialConfiguration: IO Error", e ); // NON-NLS } } public static File computeInstallationDirectory() throws IOException { final URL location = WorkspaceSettings.class.getProtectionDomain().getCodeSource().getLocation(); LOG.debug( "InstallationDirectory: Protection-Domain: " + location ); // NON-NLS if ( location == null ) { return null; } if ( "file".equals( location.getProtocol() ) == false ) { LOG.debug( "InstallationDirectory: Protection-Domain: Protocol failure." ); // NON-NLS return null; } try { File jarPositon = new File( location.getFile() ); if ( jarPositon.isFile() == false ) { final Configuration configuration = ClassicEngineBoot.getInstance().getGlobalConfig(); final String file = URLDecoder.decode( location.getFile(), configuration.getConfigProperty( "file.encoding", "ISO-8859-1" ) ); // NON-NLS jarPositon = new File( file ); } LOG.debug( "InstallationDirectory: JAR file: " + jarPositon ); // NON-NLS if ( jarPositon.isFile() ) { // secret knowledge here: We know all jars are in the lib-directory. final File libDirectory = jarPositon.getCanonicalFile().getParentFile(); if ( libDirectory == null ) { LOG.debug( "InstallationDirectory: No lib directory." ); // NON-NLS return null; } LOG.debug( "InstallationDirectory: Work directory: " + libDirectory.getParentFile() ); // NON-NLS return libDirectory.getParentFile(); } } catch ( IOException ioe ) { // ignore, but log. LOG.debug( "InstallationDirectory: Failed to decode URL: ", ioe ); // NON-NLS } // a directory, so we are running in an IDE. // hope for the best by using the current working directory. LOG.debug( "InstallationDirectory: Work directory: Defaulting to current work directory." ); // NON-NLS return new File( "." ); } }