Java tutorial
/* * Copyright 2009-2013 by The Regents of the University of California * 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 from * * 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 edu.uci.ics.hyracks.control.common.deployment; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClientBuilder; import edu.uci.ics.hyracks.api.application.IApplicationContext; import edu.uci.ics.hyracks.api.deployment.DeploymentId; import edu.uci.ics.hyracks.api.exceptions.HyracksException; import edu.uci.ics.hyracks.api.job.IJobSerializerDeserializer; import edu.uci.ics.hyracks.api.job.IJobSerializerDeserializerContainer; import edu.uci.ics.hyracks.api.util.JavaSerializationUtils; import edu.uci.ics.hyracks.control.common.context.ServerContext; /** * A utility class which is in charge of the actual work of deployments. * * @author yingyib */ public class DeploymentUtils { private static final String DEPLOYMENT = "applications"; /** * undeploy an existing deployment * * @param deploymentId * the deployment id * @param container * @param ctx * @throws HyracksException */ public static void undeploy(DeploymentId deploymentId, IJobSerializerDeserializerContainer container, ServerContext ctx) throws HyracksException { container.removeJobSerializerDeserializer(deploymentId); String rootDir = ctx.getBaseDir().toString(); String deploymentDir = rootDir.endsWith(File.separator) ? rootDir + DEPLOYMENT + File.separator + deploymentId : rootDir + File.separator + DEPLOYMENT + File.separator + deploymentId; try { File dFile = new File(deploymentDir); if (dFile.exists()) { FileUtils.forceDelete(dFile); } } catch (Exception e) { throw new HyracksException(e); } } /** * Deploying jars in NC or CC * * @param deploymentId * the deployment id * @param urls * the jar URLs * @param container * the container of serailizer/deserializer * @param ctx * the ServerContext * @param isNC * true is NC/false is CC * @throws HyracksException */ public static void deploy(DeploymentId deploymentId, List<URL> urls, IJobSerializerDeserializerContainer container, ServerContext ctx, boolean isNC) throws HyracksException { IJobSerializerDeserializer jobSerDe = container.getJobSerializerDeserializer(deploymentId); if (jobSerDe == null) { jobSerDe = new ClassLoaderJobSerializerDeserializer(); container.addJobSerializerDeserializer(deploymentId, jobSerDe); } String rootDir = ctx.getBaseDir().toString(); String deploymentDir = rootDir.endsWith(File.separator) ? rootDir + DEPLOYMENT + File.separator + deploymentId : rootDir + File.separator + DEPLOYMENT + File.separator + deploymentId; jobSerDe.addClassPathURLs(downloadURLs(urls, deploymentDir, isNC)); } /** * Deserialize bytes to an object according to a specific deployment * * @param bytes * the bytes to be deserialized * @param deploymentId * the deployment id * @param appCtx * @return the deserialized object * @throws HyracksException */ public static Object deserialize(byte[] bytes, DeploymentId deploymentId, IApplicationContext appCtx) throws HyracksException { try { IJobSerializerDeserializerContainer jobSerDeContainer = appCtx.getJobSerializerDeserializerContainer(); IJobSerializerDeserializer jobSerDe = deploymentId == null ? null : jobSerDeContainer.getJobSerializerDeserializer(deploymentId); Object obj = jobSerDe == null ? JavaSerializationUtils.deserialize(bytes) : jobSerDe.deserialize(bytes); return obj; } catch (Exception e) { throw new HyracksException(e); } } /** * Load a class from its class name * * @param className * @param deploymentId * @param appCtx * @return the loaded class * @throws HyracksException */ public static Class<?> loadClass(String className, DeploymentId deploymentId, IApplicationContext appCtx) throws HyracksException { try { IJobSerializerDeserializerContainer jobSerDeContainer = appCtx.getJobSerializerDeserializerContainer(); IJobSerializerDeserializer jobSerDe = deploymentId == null ? null : jobSerDeContainer.getJobSerializerDeserializer(deploymentId); Class<?> cl = jobSerDe == null ? JavaSerializationUtils.loadClass(className) : jobSerDe.loadClass(className); return cl; } catch (Exception e) { throw new HyracksException(e); } } /** * Get the classloader of a specific deployment * * @param deploymentId * @param appCtx * @return * @throws HyracksException */ public static ClassLoader getClassLoader(DeploymentId deploymentId, IApplicationContext appCtx) throws HyracksException { try { IJobSerializerDeserializerContainer jobSerDeContainer = appCtx.getJobSerializerDeserializerContainer(); IJobSerializerDeserializer jobSerDe = deploymentId == null ? null : jobSerDeContainer.getJobSerializerDeserializer(deploymentId); ClassLoader cl = jobSerDe == null ? DeploymentUtils.class.getClassLoader() : jobSerDe.getClassLoader(); return cl; } catch (Exception e) { throw new HyracksException(e); } } /** * Download remote Http URLs and return the stored local file URLs * * @param urls * the remote Http URLs * @param deploymentDir * the deployment jar storage directory * @param isNC * true is NC/false is CC * @return a list of local file URLs * @throws HyracksException */ private static List<URL> downloadURLs(List<URL> urls, String deploymentDir, boolean isNC) throws HyracksException { //retry 10 times at maximum for downloading binaries int retryCount = 10; int tried = 0; Exception trace = null; while (tried < retryCount) { try { tried++; List<URL> downloadedFileURLs = new ArrayList<URL>(); File dir = new File(deploymentDir); if (!dir.exists()) { FileUtils.forceMkdir(dir); } for (URL url : urls) { String urlString = url.toString(); int slashIndex = urlString.lastIndexOf('/'); String fileName = urlString.substring(slashIndex + 1).split("&")[1]; String filePath = deploymentDir + File.separator + fileName; File targetFile = new File(filePath); if (isNC) { HttpClient hc = HttpClientBuilder.create().build(); HttpGet get = new HttpGet(url.toString()); HttpResponse response = hc.execute(get); InputStream is = response.getEntity().getContent(); OutputStream os = new FileOutputStream(targetFile); try { IOUtils.copyLarge(is, os); } finally { os.close(); is.close(); } } downloadedFileURLs.add(targetFile.toURI().toURL()); } return downloadedFileURLs; } catch (Exception e) { e.printStackTrace(); trace = e; } } throw new HyracksException(trace); } }