agave-jobs/jobs-core/src/main/java/org/iplantc/service/jobs/managers/launchers/AbstractJobLauncher.java
/**
     * Copies the {@link Software#getDeploymentPath()} from the {@link Software#getStorageSystem()} for the current job
     * to the local job temp directory. If the software is public, then the deployment path represents a zipped archive
     * and will be unpacked before returning. The resulting files in either situation are checked for consistency in
     * checksums and {@link Software#getExecutablePath()} existence.
     * @throws JobException if unable to fetch the remote assets
     * @throws SoftwareUnavailableException when the software assets cannot be verified.
     * @throws SystemUnknownException if the {@link Software#getStorageSystem()} has been deleted.
     * @throws SystemUnavailableException when the {@link Software#getStorageSystem()} is unavailable to fetch the assets from
     */
Copies the  Software#getDeploymentPath() from the  Software#getStorageSystem() for the current job
to the local job temp directory. If the software is public, then the deployment path represents a zipped archive
and will be unpacked before returning. The resulting files in either situation are checked for consistency in
checksums and  Software#getExecutablePath() existence.
@throws JobException if unable to fetch the remote assets
@throws SoftwareUnavailableException when the software assets cannot be verified.
@throws SystemUnknownException if the  Software#getStorageSystem() has been deleted.
@throws SystemUnavailableException when the  Software#getStorageSystem() is unavailable to fetch the assets from
Copies the Software#getDeploymentPath () from the Software#getStorageSystem () for the current job to the local job temp directory . If the software is public then the deployment path represents a zipped archive and will be unpacked before returning . The resulting files in either situation are checked for consistency in checksums and Software#getExecutablePath () existence . @throws JobException if unable to fetch the remote assets @throws SoftwareUnavailableException when the software assets cannot be verified . @throws SystemUnknownException if the Software#getStorageSystem () has been deleted . @throws SystemUnavailableException when the Software#getStorageSystem () is unavailable to fetch the assets from
protected void copySoftwareToTempAppDir() throws JobException, SoftwareUnavailableException, SystemUnknownException, SystemUnavailableException {
        step = "Fetching app assets for job " + getJob().getUuid() + " from " +
                "agave://" + getSoftware().getStorageSystem().getSystemId() + "/" +
                getSoftware().getDeploymentPath() + " to temp application directory " +
                getTempAppDir().getPath();
        log.debug(step);
        try {
            fetchSoftwareDeploymentDirectory();
            checkStopped();
            if (getSoftware().isPubliclyAvailable()) {
                unzipPublicSoftwareArchive();
            }
        } catch (ClosedByInterruptException e) {
            log.debug("Software asset copying for job " + getJob().getUuid() + " aborted due to interrupt by worker process.");
        } catch (SystemUnknownException e) {
            throw new SystemUnknownException("No system found matching id of app deployment system, " +
                    getSoftware().getStorageSystem().getSystemId() + ".");
        } catch (SystemUnavailableException e) {
            throw new SystemUnavailableException("App deployment system " + getSoftware().getStorageSystem().getSystemId() +
                    " is currently unavailable.");
        } catch(IOException e) {
            throw new JobException("Failed to process staged app deployment path.", e);
        } catch (SoftwareUnavailableException | JobException e) {
            throw e;
        } catch (Exception e) {
            String msg = "Remote data connection to " + getSoftware().getExecutionSystem().getSystemId() + " threw exception and stopped job execution";
            log.error(msg, e);
            throw new JobException(msg, e);
        }
    }
protected void copySoftwareToTempAppDir ( ) throws JobException , SoftwareUnavailableException , SystemUnknownException , SystemUnavailableException { step = "Fetching app assets for job " + getJob ( ) . getUuid ( ) + " from " + "agave://" + getSoftware ( ) . getStorageSystem ( ) . getSystemId ( ) + "/" + getSoftware ( ) . getDeploymentPath ( ) + " to temp application directory " + getTempAppDir ( ) . getPath ( ) ; log . debug ( step ) ; try { fetchSoftwareDeploymentDirectory ( ) ; checkStopped ( ) ; if ( getSoftware ( ) . isPubliclyAvailable ( ) ) { unzipPublicSoftwareArchive ( ) ; } } catch ( ClosedByInterruptException e ) { log . debug ( "Software asset copying for job " + getJob ( ) . getUuid ( ) + " aborted due to interrupt by worker process." ) ; } catch ( SystemUnknownException e ) { throw new SystemUnknownException ( "No system found matching id of app deployment system, " + getSoftware ( ) . getStorageSystem ( ) . getSystemId ( ) + "." ) ; } catch ( SystemUnavailableException e ) { throw new SystemUnavailableException ( "App deployment system " + getSoftware ( ) . getStorageSystem ( ) . getSystemId ( ) + " is currently unavailable." ) ; } catch ( IOException e ) { throw new JobException ( "Failed to process staged app deployment path." , e ) ; } catch ( SoftwareUnavailableException | JobException e ) { throw e ; } catch ( Exception e ) { String msg = "Remote data connection to " + getSoftware ( ) . getExecutionSystem ( ) . getSystemId ( ) + " threw exception and stopped job execution" ; log . error ( msg , e ) ; throw new JobException ( msg , e ) ; } }
Copies the {@link Software#getDeploymentPath()} from the {@link Software#getStorageSystem()} for the current job
 to the local job temp directory.
Copies the { @link Software#getDeploymentPath () } from the { @link Software#getStorageSystem () } for the current job to the local job temp directory .
// downloads the software deployment directory to the tempAppDir, optimizing data movement whenever possible // public apps have thier assets compressed in a zip archive. If the app is public, we need // to decompress the assets in the local tempAppDir before continuing. // check is made upon return. Exception will be rethrown then. //        } catch(TransferException | RemoteDataException | RemoteCredentialException e) { //            throw new JobException("Unable to fetch deployment path for app " + getSoftware().getUniqueName() + //                    " from " + getSoftware().getStorageSystem().getSystemId(), e);