org.onebusaway.webapp.actions.admin.bundles.SyncBundleAction.java Source code

Java tutorial

Introduction

Here is the source code for org.onebusaway.webapp.actions.admin.bundles.SyncBundleAction.java

Source

/**
 * Copyright (C) 2015 Cambridge Systematics, Inc.
 *
 * 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 org.onebusaway.webapp.actions.admin.bundles;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.util.List;
import java.util.zip.GZIPInputStream;
import java.util.zip.ZipEntry;

import org.apache.commons.compress.archivers.ArchiveException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.json.simple.JSONObject;
import org.onebusaway.admin.util.NYCFileUtils;
import org.onebusaway.util.FileUtility;
import org.onebusaway.webapp.actions.OneBusAwayNYCAdminActionSupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

/**
 * Action class that holds properties and methods required for syncing the
 * active bundle in the prod environment with that on the staging environment,
 * i.e. deploying the active bundle from staging to production.
 * @author jpearson
 *
 */

@Namespace(value = "/admin/bundles")
@Results({ @Result(name = "syncStatus", type = "json", params = { "root", "syncStatus" }) })
public class SyncBundleAction extends OneBusAwayNYCAdminActionSupport {
    private static Logger _log = LoggerFactory.getLogger(ManageBundlesAction.class);
    private static final long serialVersionUID = 1L;

    private String environment = "dev";

    public String getEnvironment() {
        return environment;
    }

    public String syncBundle() {

        String syncStatus = "Syncing in progress";
        String apiHost = "http://admin.staging.obast.org:9999/api/bundle/latest";
        JsonObject latestBundle = null;
        try {
            latestBundle = getJsonData(apiHost).getAsJsonObject();
        } catch (Exception e) {
            _log.error("Failed to retrieve name of the latest deployed bundle");
        }
        String datasetName = latestBundle.get("dataset").getAsString();
        String buildName = latestBundle.get("name").getAsString();
        String bundleId = latestBundle.get("id").getAsString();
        String bundleFileName = buildName + ".tar.gz";
        String tmpDir = new NYCFileUtils().createTmpDirectory();
        String bundleDir = "/var/lib/oba/bundles";
        String deployDir = "/var/lib/oba/bundles/active";
        String bundleBuildDir = "/var/lib/oba/bundles/builder";

        try {
            String bundleSourceString = "http://admin.staging.obast.org:9999/api/bundle/archive/get-by-name/"
                    + datasetName + "/" + buildName + "/" + bundleFileName;
            URL bundleSource = new URL(bundleSourceString);
            ReadableByteChannel rbc = Channels.newChannel(bundleSource.openStream());
            FileOutputStream fos = new FileOutputStream(tmpDir + File.separator + bundleFileName);
            fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            unzipBundle(tmpDir, bundleFileName);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // Copy to extracted files /var/lib/oba/bundles/active
        try {
            //FileUtils.copyDirectory(new File(tmpDir + File.separator + "untarredBundle" + File.separator +  buildName), new File(deployDir));
            FileUtils.copyDirectory(new File(tmpDir + File.separator + "untarredBundle"), new File(deployDir));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // Copy downloaded .tar.gz bundle to bundle builds dir
        String buildDest = bundleBuildDir + File.separator + datasetName + File.separator + "builds"
                + File.separator + buildName + File.separator + bundleFileName;
        try {
            FileUtils.copyFile(new File(tmpDir + File.separator + bundleFileName), new File(buildDest));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // Copy inputs and outputs dirs
        File srcInputDir = new File(tmpDir + File.separator + "untarredBundle" + File.separator + buildName
                + File.separator + "inputs");
        File srcOutputDir = new File(tmpDir + File.separator + "untarredBundle" + File.separator + buildName
                + File.separator + "outputs");
        String destBuildsDir = bundleBuildDir + File.separator + datasetName + File.separator + "builds"
                + File.separator + buildName;
        try {
            FileUtils.copyDirectory(srcInputDir, new File(destBuildsDir + File.separator + "inputs"));
            FileUtils.copyDirectory(srcOutputDir, new File(destBuildsDir + File.separator + "outputs"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // Copy gtfs and aux files to aux_latest and gtfs_latest
        String gtfsFileDest = bundleBuildDir + File.separator + datasetName + File.separator + "gtfs_latest";
        String auxFileDest = bundleBuildDir + File.separator + datasetName + File.separator + "aux_latest";
        File[] inputFiles = srcInputDir.listFiles();
        for (File inputFile : inputFiles) {
            try {
                String fileName = inputFile.getName();
                int idx = fileName.indexOf("_");
                if (idx > 0) { // Skip over config dir
                    String agencyNum = fileName.substring(0, idx);
                    String zipFileName = fileName.substring(idx + 1);
                    if (agencyNum.equals("29")) { // For CT aux files
                        String fileDest = auxFileDest + File.separator + agencyNum + File.separator + zipFileName;
                        FileUtils.copyFile(inputFile, new File(fileDest));
                    } else {
                        String fileDest = gtfsFileDest + File.separator + agencyNum + File.separator + zipFileName;
                        FileUtils.copyFile(inputFile, new File(fileDest));
                    }
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        syncStatus = "Complete";
        return "syncStatus";
    }

    private JsonElement getJsonData(String spec) throws IOException {
        URL url = new URL((!spec.toLowerCase().matches("^\\w+://.*") ? "http://" : "") + spec);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("GET");
        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        return new JsonParser().parse(in.readLine());
    }

    private void unzipBundle(String tmpDir, String bundleFileName) throws IOException {
        byte[] buffer = new byte[1024];

        GZIPInputStream zipIn = new GZIPInputStream(new FileInputStream(tmpDir + File.separator + bundleFileName));
        FileOutputStream out = new FileOutputStream(tmpDir + File.separator + "unzippedBundle");

        int len;
        while ((len = zipIn.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }

        zipIn.close();
        out.close();

        // Now to untar the unzipped file
        File tarFile = new File(tmpDir + File.separator + "unzippedBundle");
        File untarredFile = new File(tmpDir + File.separator + "untarredBundle");
        //File untarredFile = new File(tmpDir);
        try {
            List<File> fileList = (new FileUtility()).unTar(tarFile, untarredFile);
        } catch (ArchiveException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return;
    }
}