diff --git a/.classpath b/.classpath index 880f4a9..cd4d533 100644 --- a/.classpath +++ b/.classpath @@ -1,12 +1,12 @@ - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/lib/glum-src.jar b/lib/glum-src.jar index 85e0867..2849c44 100644 Binary files a/lib/glum-src.jar and b/lib/glum-src.jar differ diff --git a/lib/glum.jar b/lib/glum.jar index c70ba0b..3655548 100644 Binary files a/lib/glum.jar and b/lib/glum.jar differ diff --git a/script/appleUtils.py b/script/appleUtils.py index 929600b..822badf 100644 --- a/script/appleUtils.py +++ b/script/appleUtils.py @@ -24,30 +24,39 @@ def buildRelease(args, buildPath): jreVerSpec = args.jreVerSpec platformStr = 'apple' + # Determine the types of builds we should do + platformType = miscUtils.getPlatformTypes(args.platform, platformStr) + if platformType.nonJre == False and platformType.withJre == False: + return; + # Warn if a request for a non-JRE build. We do not support that for the Apple platform. + if 'apple-' in args.platform: + print('Building an Apple release without a JRE is currently not supported. This release will not be made.') + # Check our system environment before proceeding if checkSystemEnvironment() == False: return - # Select the jreTarGzFile to utilize for static releases - jreTarGzFile = jreUtils.getJreTarGzFile(platformStr, jreVerSpec) - if jreTarGzFile == None: - # Let the user know that a compatible JRE was not found - thus no static release will be made. - print('[Warning] No compatible JRE ({0}) is available for the {1} platform. A static release will not be provided for the platform.'.format(jreVerSpec, platformStr.capitalize())) - # Let the user know that a compatible JRE was not found - and thus no Apple builds will be made - print('Only static Apple distributions are supported - thus there will be no Apple distribution of the application: ' + appName + '\n') - return - - # Form the list of distributions to build (dynamic and static releases) - # Note as of 2016May01 there is no longer support for a dynamic Apple release -# distList = [(appName + '-' + version, None)] + # Form the list of distributions to build (dynamic and static JREs) distList = [] - if jreTarGzFile != None: - distList.append((appName + '-' + version + '-jre', jreTarGzFile)) +# Note as of 2016May01 there is no longer support for a dynamic Apple release +# if platformType.nonJre == True: +# distList = [(appName + '-' + version, None)] + if platformType.withJre == True: + # Select the jreTarGzFile to utilize for static releases + jreTarGzFile = jreUtils.getJreTarGzFile(platformStr, jreVerSpec) + if jreTarGzFile == None: + # Let the user know that a compatible JRE was not found - thus no static release will be made. + print('[Warning] No compatible JRE ({0}) is available for the {1} platform. A static release will not be provided for the platform.'.format(jreVerSpec, platformStr.capitalize())) + # Let the user know that a compatible JRE was not found - and thus no Apple builds will be made + print('Only static Apple distributions are supported - thus there will be no Apple distribution of the application: ' + appName + '\n') + return + else: + distList.append((appName + '-' + version + '-jre', jreTarGzFile)) # Create the various distributions for (aDistName, aJreTarGzFile) in distList: print('Building {0} distribution: {1}'.format(platformStr.capitalize(), aDistName)) - # Let the user know of the JRE tar.gz we are going to build with + # Let the user know of the JRE release we are going to build with if aJreTarGzFile != None: print('\tUtilizing JRE: ' + aJreTarGzFile) diff --git a/script/buildDist.py b/script/buildDist.py index 72b904c..2fe5d56 100755 --- a/script/buildDist.py +++ b/script/buildDist.py @@ -98,7 +98,7 @@ def checkForRequiredApplicationsAndExit(): evalPath = distutils.spawn.find_executable('jar') if evalPath == None: errList.append('Failed while trying to locate jar. Please install jar (typically included with Java)') - + genisoimagePath = distutils.spawn.find_executable('genisoimage') hdiutilPath = distutils.spawn.find_executable('hdiutil') if genisoimagePath == None and hdiutilPath == None: @@ -142,7 +142,7 @@ def getClassPath(javaCodePath): retList = [] # Ensure the javaCodePath has a trailing slash - # to allow for proper computation of clipLen + # to allow for proper computation of clipLen if javaCodePath.endswith('/') == False: javaCodePath += '/' clipLen = len(javaCodePath) @@ -167,7 +167,7 @@ if __name__ == "__main__": # Logic to capture Ctrl-C and bail signal.signal(signal.SIGINT, miscUtils.handleSignal) - # Set up the argument parser + # Set up the argument parser parser = FancyArgumentParser(prefix_chars='-', add_help=False, fromfile_prefix_chars='@') parser.add_argument('-help', '-h', help='Show this help message and exit.', action='help') parser.add_argument('-name', help='The name of the application.') @@ -189,6 +189,9 @@ if __name__ == "__main__": parser.add_argument('-forceSingleInstance', help='Force the application to have only one instance.', default=False) parser.add_argument('-digest', help='Digest used to ensure integrity of application upgrades. Default: sha256', choices=['md5', 'sha256', 'sha512'], default='sha256') parser.add_argument('-enableJmx', help='Enables JMX technology on the target client. Allows one to attach jconsole, jvisualvm, or other JMX tools.', action='store_true', default=False) + parser.add_argument('-platform', help='Target platforms to build. Choices are: [apple, linux, windows]. Note the following (append) modifiers.' + + ' Modifier \'-\' results in only the non-JRE build. Modifier \'+\' results in only the JRE build. Default: apple+, linux, windows', nargs='+', default=['apple+', 'linux', 'windows'], + choices=['apple', 'apple-', 'apple+', 'linux', 'linux-', 'linux+', 'windows', 'windows-', 'windows+'], metavar='PLATFORM') # parser.add_argument('-bundleId', help='Apple specific id descriptor.') # Intercept any request for a help message and bail @@ -200,11 +203,16 @@ if __name__ == "__main__": # Check to ensure all of the required applications are installed before proceeding checkForRequiredApplicationsAndExit() - # Parse the args + # Parse the args parser.formatter_class.max_help_position = 50 args = parser.parse_args() # print args + # Warn if there are not any valid targets + if args.platform == ['apple-']: + print('The only release specified is Apple without JRE. This is currently unsupported.\nExiting...') + exit() + # Ensure we are getting the bare minimum options errList = []; if args.name == None: @@ -217,7 +225,7 @@ if __name__ == "__main__": print('At a minimum the following must be specified: ' + str(errList) + '.\nExiting...') exit() - # Ensure the reserved 'jre' name is not utilized + # Ensure the reserved 'jre' name is not utilized if args.name.lower() == 'jre': print('The application can not be named: {}. That name is reserved for the JRE.'.format(args.name)) exit() @@ -252,7 +260,7 @@ if __name__ == "__main__": else: newJvmArgs.append(aJvmArg) args.jvmArgs = newJvmArgs - + # Add the flag -Dcom.sun.management.jmxremote to allow JMX clients to attach to the Java application # Add the flag -Djava.rmi.server.hostname=localhost to allow connections when using VPN. Not sure why??? # It appears that when the root class loader is replaced then JMX is disabled by default @@ -305,7 +313,7 @@ if __name__ == "__main__": dstPath = deltaCodePath; shutil.copytree(srcPath, dstPath, symlinks=False) - # Form the app.cfg file + # Form the app.cfg file dstPath = os.path.join(buildPath, "delta/app.cfg") miscUtils.buildAppLauncherConfig(dstPath, args) diff --git a/script/linuxUtils.py b/script/linuxUtils.py index 45ea084..4445b0a 100644 --- a/script/linuxUtils.py +++ b/script/linuxUtils.py @@ -21,20 +21,27 @@ def buildRelease(args, buildPath): jreVerSpec = args.jreVerSpec platformStr = 'linux' + # Determine the types of builds we should do + platformType = miscUtils.getPlatformTypes(args.platform, platformStr) + if platformType.nonJre == False and platformType.withJre == False: + return; + # Check our system environment before proceeding if checkSystemEnvironment() == False: return - # Select the jreTarGzFile to utilize for static releases - jreTarGzFile = jreUtils.getJreTarGzFile(platformStr, jreVerSpec) - if jreTarGzFile == None: - # Let the user know that a compatible JRE was not found - thus no static release will be made. - print('[Warning] No compatible JRE ({0}) is available for the {1} platform. A static release will not be provided for the platform.'.format(jreVerSpec, platformStr.capitalize())) - # Form the list of distributions to build (dynamic and static JREs) - distList = [(appName + '-' + version, None)] - if jreTarGzFile != None: - distList.append((appName + '-' + version + '-jre', jreTarGzFile)) + distList = [] + if platformType.nonJre == True: + distList = [(appName + '-' + version, None)] + if platformType.withJre == True: + # Select the jreTarGzFile to utilize for static releases + jreTarGzFile = jreUtils.getJreTarGzFile(platformStr, jreVerSpec) + if jreTarGzFile == None: + # Let the user know that a compatible JRE was not found - thus no static release will be made. + print('[Warning] No compatible JRE ({0}) is available for the {1} platform. A static release will not be provided for the platform.'.format(jreVerSpec, platformStr.capitalize())) + else: + distList.append((appName + '-' + version + '-jre', jreTarGzFile)) # Create a tmp (working) folder tmpPath = tempfile.mkdtemp(prefix=platformStr, dir=buildPath) diff --git a/script/miscUtils.py b/script/miscUtils.py index e61eef8..262c488 100644 --- a/script/miscUtils.py +++ b/script/miscUtils.py @@ -66,6 +66,31 @@ def computeDigestForFile(evalFile, digestType, block_size=2**20): return hash.hexdigest() +def getPlatformTypes(platformArr, platformStr): + """Returns an object that defines the release types that should be built for the given platform. The object will + have 2 field members: [nonJre, withJre]. If the field is set to True then the corresonding platform should be + built. This is determined by examaning the platformStr and determine it's occurance in the platformArr. For + example to determine the build platforms for Linux one might call getPlatformArr(someArr, 'linux'). Following are + the results of contents in someArr: + [''] ---> nonJre = False, withJre = False + ['linux'] ---> nonJre = True, withJre = True + ['linux+'] ---> nonJre = False, withJre = True + ['linux-'] ---> nonJre = True, withJre = False""" + class PlatformType(object): + nonJre = False + withJre = False + + retObj = PlatformType() + if platformStr in platformArr: + retObj.nonJre = True + retObj.withJre = True + if platformStr + '-' in platformArr: + retObj.nonJre = True + if platformStr + '+' in platformArr: + retObj.withJre = True + return retObj + + def getInstallRoot(): """Returns the root path where the running script is installed.""" argv = sys.argv; @@ -89,16 +114,16 @@ def executeAndLog(command, indentStr=""): print(indentStr + 'Stack Trace:') outStr = logUtils.appendLogOutputWithText(aExp.child_traceback, indentStr + '\t') print(outStr) - + class Proc: returncode = None proc = Proc - + return proc # if proc.returncode != 0: # print('\tError: Failed to build executable. Return code: ' + proc.returncode) - - + + def getPathSize(aRoot): """Computes the total disk space used by the specified path. Note if aRoot does not exist or is None then this will return 0""" diff --git a/script/windowsUtils.py b/script/windowsUtils.py index 50d1cd1..00e94af 100644 --- a/script/windowsUtils.py +++ b/script/windowsUtils.py @@ -22,25 +22,32 @@ def buildRelease(args, buildPath): jreVerSpec = args.jreVerSpec platformStr = 'windows' + # Determine the types of builds we should do + platformType = miscUtils.getPlatformTypes(args.platform, platformStr) + if platformType.nonJre == False and platformType.withJre == False: + return; + # Check our system environment before proceeding if checkSystemEnvironment() == False: return - # Select the jreTarGzFile to utilize for static releases - jreTarGzFile = jreUtils.getJreTarGzFile(platformStr, jreVerSpec) - if jreTarGzFile == None: - # Let the user know that a compatible JRE was not found - thus no static release will be made. - print('[Warning] No compatible JRE ({0}) is available for the {1} platform. A static release will not be provided for the platform.'.format(jreVerSpec, platformStr.capitalize())) - # Form the list of distributions to build (dynamic and static JREs) - distList = [(appName + '-' + version, None)] - if jreTarGzFile != None: - distList.append((appName + '-' + version + '-jre', jreTarGzFile)) + distList = [] + if platformType.nonJre == True: + distList = [(appName + '-' + version, None)] + if platformType.withJre == True: + # Select the jreTarGzFile to utilize for static releases + jreTarGzFile = jreUtils.getJreTarGzFile(platformStr, jreVerSpec) + if jreTarGzFile == None: + # Let the user know that a compatible JRE was not found - thus no static release will be made. + print('[Warning] No compatible JRE ({0}) is available for the {1} platform. A static release will not be provided for the platform.'.format(jreVerSpec, platformStr.capitalize())) + else: + distList.append((appName + '-' + version + '-jre', jreTarGzFile)) # Create a tmp (working) folder tmpPath = tempfile.mkdtemp(prefix=platformStr, dir=buildPath) - # Unpack the proper launch4j release (for the platform we are + # Unpack the proper launch4j release (for the platform we are # running on) into the tmp (working) folder appInstallRoot = miscUtils.getInstallRoot() appInstallRoot = os.path.dirname(appInstallRoot) @@ -58,7 +65,7 @@ def buildRelease(args, buildPath): # Create the various distributions for (aDistName, aJreTarGzFile) in distList: print('Building {0} distribution: {1}'.format(platformStr.capitalize(), aDistName)) - # Let the user know of the JRE tar.gz we are going to build with + # Let the user know of the JRE release we are going to build with if aJreTarGzFile != None: print('\tUtilizing JRE: ' + aJreTarGzFile) @@ -223,8 +230,8 @@ def checkSystemEnvironment(): def getJreMajorVersion(aJreVerSpec): """Returns the minimum version of the JRE to utilize based on the passed in JreVerSpec. If aJreVerSpec is None then - the value specified in jreUtils.getDefaultJreVerStr() will be utilized. If that value is None then the value of - 1.8.0 will be utilized.""" + the value specified in jreUtils.getDefaultJreVerStr() will be utilized. If that value is None then the value of + 1.8.0 will be utilized.""" if aJreVerSpec == None: aJreVerSpec = [jreUtils.getDefaultJreVerStr()] minJreVerStr = aJreVerSpec[0] diff --git a/src/distMaker/gui/MemoryConfigPanel.java b/src/distMaker/gui/MemoryConfigPanel.java index e6402bc..002bf33 100644 --- a/src/distMaker/gui/MemoryConfigPanel.java +++ b/src/distMaker/gui/MemoryConfigPanel.java @@ -9,7 +9,6 @@ import glum.gui.panel.GlassPanel; import glum.gui.panel.generic.MessagePanel; import glum.unit.ByteUnit; import glum.util.ThreadUtil; -import glum.zio.raw.ZioRaw; import java.awt.*; import java.awt.event.ActionEvent; @@ -30,7 +29,7 @@ import static distMaker.platform.MemUtils.KB_SIZE; import static distMaker.platform.MemUtils.MB_SIZE; import static distMaker.platform.MemUtils.GB_SIZE; -public class MemoryConfigPanel extends GlassPanel implements ActionListener, ZioRaw, ListSelectionListener +public class MemoryConfigPanel extends GlassPanel implements ActionListener, ListSelectionListener { /** Unused - but added to eliminate warning due to poorly designed java.io.Serializable interface. */ private static final long serialVersionUID = 1L; diff --git a/src/distMaker/gui/PickReleasePanel.java b/src/distMaker/gui/PickReleasePanel.java index 6f5a600..6987bf1 100644 --- a/src/distMaker/gui/PickReleasePanel.java +++ b/src/distMaker/gui/PickReleasePanel.java @@ -9,7 +9,6 @@ import glum.gui.panel.itemList.StaticItemProcessor; import glum.gui.panel.itemList.query.*; import glum.unit.ConstUnitProvider; import glum.unit.DateUnit; -import glum.zio.raw.ZioRaw; import java.awt.*; import java.awt.event.ActionEvent; @@ -27,7 +26,7 @@ import net.miginfocom.swing.MigLayout; import distMaker.LookUp; import distMaker.node.AppRelease; -public class PickReleasePanel extends GlassPanel implements ActionListener, ZioRaw, ListSelectionListener +public class PickReleasePanel extends GlassPanel implements ActionListener, ListSelectionListener { private static final long serialVersionUID = 1L; diff --git a/src/dsstore/MainApp.java b/src/dsstore/MainApp.java index 429e932..612e043 100644 --- a/src/dsstore/MainApp.java +++ b/src/dsstore/MainApp.java @@ -1,14 +1,13 @@ package dsstore; -import glum.io.IoUtil; import glum.task.*; -import glum.zio.*; +import glum.zio.stream.FileZinStream; +import glum.zio.stream.FileZoutStream; -import java.io.*; +import java.io.File; +import java.io.IOException; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import dsstore.record.*; @@ -46,20 +45,14 @@ public class MainApp public void writeStore(File aFile) { - FileZoutStream aStream; - int fileMagicKey; - // Ensure we have a valid dataBuf if (dataBuf == null) return; - aStream = null; - try + try (FileZoutStream aStream = new FileZoutStream(aFile);) { - aStream = new FileZoutStream(aFile); - // Write the file's MagicKey - fileMagicKey = 0x0001; + int fileMagicKey = 0x0001; aStream.writeInt(fileMagicKey); // Dump the contents of aBytBuff @@ -69,11 +62,8 @@ public class MainApp } catch(IOException aExp) { - IoUtil.forceClose(aStream); - aExp.printStackTrace(); } - } /** @@ -83,9 +73,6 @@ public class MainApp */ public boolean readStore(File aFile) { - ZinStream aStream; - int fileSize; - // Bail if the file is not valid if (aFile.isFile() == false) { @@ -94,8 +81,7 @@ public class MainApp } dataBuf = null; - aStream = null; - try + try (FileZinStream iStream = new FileZinStream(aFile)) { byte[] byteArr; List blockDirList; @@ -105,17 +91,16 @@ int allocBlockOffset1, allocBlockOffset2, allocBlockSize; int blockCnt, tmpSize, seekDiff, dirCnt; int blockAddrArr[]; - fileSize = (int)aFile.length(); - aStream = new FileZinStream(aFile); + int fileSize = (int)aFile.length(); // DS_Store magic key: 0x0001 - fileMagicKey = aStream.readInt(); + fileMagicKey = iStream.readInt(); if (fileMagicKey != 0x0001) throw new IOException("Bad magic key value: " + fileMagicKey + " Expected: " + 0x0001); // Read the rest of the contents into a bytebuffer byteArr = new byte[fileSize - 4]; - aStream.readFully(byteArr); + iStream.readFully(byteArr); dataBuf = ByteBuffer.wrap(byteArr); // Header block (not stored in the allocators list) @@ -209,12 +194,10 @@ refTask.infoAppendln("Reading freelists..."); catch (IOException aExp) { aExp.printStackTrace(); - IoUtil.forceClose(aStream); return false; } return true; - } diff --git a/template/README.txt b/template/README.txt index 5be87d6..b2d755b 100644 --- a/template/README.txt +++ b/template/README.txt @@ -1,9 +1,9 @@ -This template area contains images and application stubs and other resources that will be used by the distMaker release buildiong script when building the distMaker app for allthe platforms. +This template area contains images, application stubs, and other resources that will be packed with the DistMaker software during the build step. -launch4j - (Windows only) Needed a modified version to launch from any dir apple - Binary launchers for the Apple platform -background - Images that go behind the apple installer (only one currently being used now) -.DS_Store.template - File used as a template Apple (Finder?) file which is modified durring the packaging process. +background - Images that go behind the Apple installer (only one currently being used now) +launch4j - Utility to build executable for the Windows platform. +.DS_Store.template - File used as a template Apple (Finder?) file which is modified during the packaging process. -applauncher.jar - This comes from the app launcher project - it gets built there and copied here manually +appLauncher.jar - This comes from the AppLauncher project - it gets built there and copied here manually diff --git a/tools/buildRelease b/tools/buildRelease index d586650..21024e6 100755 --- a/tools/buildRelease +++ b/tools/buildRelease @@ -11,7 +11,7 @@ import time # Globals # The default version of DistMaker -version = '0.44' +version = '0.45' def logAndPrint(message="", indent=0, showTime=False):