/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.camel.itest.springboot.arquillian.container.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import org.jboss.arquillian.container.se.api.ClassPathDirectory; import org.jboss.arquillian.container.spi.client.container.DeploymentException; import org.jboss.shrinkwrap.api.Node; import org.jboss.shrinkwrap.api.asset.ClassAsset; public final class FileDeploymentUtils { private static final char DELIMITER_RESOURCE_PATH = '/'; private static final char DELIMITER_CLASS_NAME_PATH = '.'; private static final String EXTENSION_CLASS = ".class"; private FileDeploymentUtils() { } public static void materializeClass(File entryDirectory, ClassAsset classAsset) throws DeploymentException, IOException { File classDirectory; if (classAsset.getSource().getPackage() != null) { classDirectory = new File(entryDirectory, classAsset.getSource().getPackage().getName().replace(DELIMITER_CLASS_NAME_PATH, File.separatorChar)); if (!classDirectory.mkdirs()) { throw new DeploymentException("Could not create class package directory: " + classDirectory); } } else { classDirectory = entryDirectory; } File classFile = new File(classDirectory, classAsset.getSource().getSimpleName().concat(EXTENSION_CLASS)); classFile.createNewFile(); try (InputStream in = classAsset.openStream(); OutputStream out = new FileOutputStream(classFile)) { copy(in, out); } } public static void materializeSubdirectories(File entryDirectory, Node node) throws DeploymentException, IOException { for (Node child : node.getChildren()) { if (child.getAsset() == null) { materializeSubdirectories(entryDirectory, child); } else { if (ClassPathDirectory.isMarkerFileArchivePath(child.getPath())) { // Do not materialize the marker file continue; } // E.g. META-INF/my-super-descriptor.xml File resourceFile = new File(entryDirectory, child.getPath().get().replace(DELIMITER_RESOURCE_PATH, File.separatorChar)); File resoureDirectory = resourceFile.getParentFile(); if (!resoureDirectory.exists() && !resoureDirectory.mkdirs()) { throw new DeploymentException("Could not create class path directory: " + entryDirectory); } resourceFile.createNewFile(); try (InputStream in = child.getAsset().openStream(); OutputStream out = new FileOutputStream(resourceFile)) { copy(in, out); } child.getPath().get(); } } } public static void copy(InputStream in, OutputStream out) throws IOException { final byte[] buffer = new byte[8192]; int n = 0; while (-1 != (n = in.read(buffer))) { out.write(buffer, 0, n); } out.flush(); } public static void deleteRecursively(Path directory) throws IOException { Files.walkFileTree(directory, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Files.delete(file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { Files.delete(dir); return FileVisitResult.CONTINUE; } }); } public static void deleteContent(Path directory) throws IOException { Files.walkFileTree(directory, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Files.delete(file); return FileVisitResult.CONTINUE; } }); } }