/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.deployment.model.internal.nativelib; import org.mule.runtime.core.util.FileUtils; import java.io.File; import java.io.IOException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * Finds native libraries in an application's lib folder and creates a copy of each found library inside a temporal application * folder. */ public class PerAppCopyNativeLibraryFinder extends PerAppNativeLibraryFinder { protected Logger logger = LoggerFactory.getLogger(getClass()); private final File perAppNativeLibs; public PerAppCopyNativeLibraryFinder(File libDir, File perAppNativeLibs) { super(libDir); this.perAppNativeLibs = perAppNativeLibs; if (this.perAppNativeLibs.exists()) { cleanNativeLibs(); } else { if (!this.perAppNativeLibs.mkdirs()) { throw new IllegalStateException(String.format("Unable to create application '%s' folder", this.perAppNativeLibs.getAbsolutePath())); } } } @Override public String findLibrary(String name, String parentLibraryPath) { String libraryPath = parentLibraryPath; if (null == libraryPath) { libraryPath = findLibraryLocally(name); } if (libraryPath != null) { if (logger.isDebugEnabled()) { logger.debug(String.format("Found native library for '%s' on '%s", name, libraryPath)); } final File tempLibrary = copyNativeLibrary(name, libraryPath); libraryPath = tempLibrary.getAbsolutePath(); if (logger.isDebugEnabled()) { logger.debug(String.format("Created native library copy for '%s' on '%s", name, libraryPath)); } } return libraryPath; } private void cleanNativeLibs() { String[] list = perAppNativeLibs.list(); if (list != null) { for (String library : list) { new File(perAppNativeLibs, library).delete(); } } } private File copyNativeLibrary(String name, String libraryPath) { final String nativeLibName = System.mapLibraryName(name); final File tempLibrary = new File(perAppNativeLibs, nativeLibName + System.currentTimeMillis()); try { final File library = new File(libraryPath); FileUtils.copyFile(library, tempLibrary); return tempLibrary; } catch (IOException e) { throw new IllegalStateException(String.format("Unable to generate copy for native library '%s' at '%s'", nativeLibName, tempLibrary.getAbsolutePath()), e); } } }