/*
* Copyright 2010-2011 Research In Motion Limited.
*
* 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 net.rim.tumbler.session;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Date;
import java.util.Random;
import java.util.zip.ZipFile;
import net.rim.tumbler.OSUtils;
import net.rim.tumbler.WidgetPackager;
import net.rim.tumbler.exception.PackageException;
import net.rim.tumbler.exception.SessionException;
import net.rim.tumbler.exception.ValidationException;
public class SessionManager {
private static SessionManager _instance = null;
// Environment properties
public static String BBWP_JAR_PATH;
private String _bbwpJarFolder;
private String _sessionHome;
private String _tld;
// BlackBerry WebWorks Application info
private String _widgetArchive;
private String _archiveName;
// Command line settings
private boolean _requireSigning;
private String _password;
private String _outputFolder;
private boolean _requireSource;
private String _sourceFolder;
private String _safeSourceFolder;
private boolean _debugMode;
private boolean _isVerbose;
static {
try {
BBWP_JAR_PATH = URLDecoder.decode(
SessionManager.class.getProtectionDomain().getCodeSource().getLocation().getPath(), "UTF-8" );
} catch( UnsupportedEncodingException e ) {
throw new SessionException( e, "Unexpected error decoding BBWP JAR path." );
}
}
public static void createInstance( String archiveName, String widgetArchive, String bbwpInstallFolder, String outputFolder,
boolean requireSigning, String password, boolean requireSource, String sourceFolder, boolean debugMode,
boolean isVerbose ) throws Exception {
_instance = new SessionManager( archiveName, widgetArchive, bbwpInstallFolder, outputFolder, requireSigning, password,
requireSource, sourceFolder, debugMode, isVerbose );
}
public static SessionManager getInstance() {
return _instance;
}
private SessionManager( String archiveName, String widgetArchive, String bbwpInstallFolder, String outputFolder,
boolean requireSigning, String password, boolean requireSource, String sourceFolder, boolean debugMode,
boolean isVerbose ) throws Exception {
_widgetArchive = widgetArchive;
_archiveName = archiveName;
_requireSigning = requireSigning;
_password = password;
_outputFolder = outputFolder;
_requireSource = requireSource;
_sourceFolder = sourceFolder;
if( !isOriginalSourceFolderSafe() ) {
_safeSourceFolder = System.getProperty( "java.io.tmpdir" ) + "widgetGen." + new Random().nextInt( 2147483647 )
+ new Date().getTime() + ".tmp";
}
_debugMode = debugMode;
_isVerbose = isVerbose;
_bbwpJarFolder = bbwpInstallFolder;
// Determine home directory
_sessionHome = determineSessionHome();
// Validate session - check signing keys
if( _requireSigning ) {
checkSignatureKeys();
}
// Validate application archive
validateArchive( _widgetArchive );
// Load top level domain info
BufferedReader input = null;
try {
input = new BufferedReader( new FileReader( new File( _bbwpJarFolder + "tld.txt" ) ) );
String line = null; // Not declared within while loop
StringBuffer sb = new StringBuffer( "$$" );
while( ( line = input.readLine() ) != null ) {
sb.append( line.toLowerCase().trim() );
sb.append( "$$" );
}
_tld = sb.toString();
} finally {
input.close();
}
}
private void validateArchive( String archive ) throws PackageException {
File f = new File( archive );
ZipFile zipFile;
// Check for file's existence
if( !f.exists() ) {
throw new PackageException( "EXCEPTION_WIDGET_ARCHIVE_NOT_FOUND" );
} else {
try {
zipFile = new ZipFile( f );
zipFile.close();
} catch( Exception e ) {
throw new PackageException( "EXCEPTION_ARCHIVE_IO" );
}
}
}
private String determineSessionHome() {
String home = "";
try {
home = new File( getClass().getProtectionDomain().getCodeSource().getLocation().toURI() ).getCanonicalPath();
} catch( Exception e ) {
home = "";
}
if( home.equals( "" ) ) {
return System.getProperty( "user.dir" );
} else {
int idx = home.lastIndexOf( File.separator + "bin" );
return ( ( idx < 0 ) ? "" : home.substring( 0, idx ) );
}
}
private void checkSignatureKeys() throws Exception {
String keyPath = _bbwpJarFolder + WidgetPackager.SIGNATURE_KEY_FILE;
// Check for file's existence
if( !( new File( keyPath ) ).exists() ) {
throw new ValidationException( "EXCEPTION_MISSING_SIGNING_KEYS" );
}
}
public String getBBWPJarFolder() {
return _bbwpJarFolder;
}
public String getWidgetArchive() {
return _widgetArchive;
}
public String getArchiveName() {
return _archiveName;
}
public boolean requireSigning() {
return _requireSigning;
}
public String getPassword() {
return _password;
}
public String getOutputFolder() {
return _outputFolder;
}
public boolean requireSource() {
return _requireSource;
}
public String getSourceFolder() {
if( !isOriginalSourceFolderSafe() ) {
return _safeSourceFolder;
} else {
return _sourceFolder;
}
}
public String getOriginalSourceFolder() {
return _sourceFolder;
}
public String getSafeSourceFolder() {
return _safeSourceFolder;
}
public boolean debugMode() {
return _debugMode;
}
public boolean isVerbose() {
return _isVerbose;
}
public String getSessionHome() {
return _sessionHome;
}
public String getTLD() {
return _tld;
}
/**
* @return true if source folder is safe to use, it is safe only if
* (1) OS is Windows, or (2) source folder does not contain spaces
*/
public boolean isOriginalSourceFolderSafe() {
return !( !OSUtils.isWindows() && _sourceFolder.contains( " " ) );
}
}