/*
* Copyright (C) 2009 Red Hat, Inc. and/or its affiliates.
*
* 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.jboss.errai.common.metadata;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* DeploymentContext and {@link PackagingUtil}
* identify and unpack nested subdeployments (i.e. WAR inside EAR) before passing the resulting URL's to
* the Reflections implementation.
* <p/>
* Calling {@link #close()} deletes the temporary created archive files.
* Subsequent call to Reflection rely on classloading and don't need these artifacts anymore.
*
* @author Heiko Braun <hbraun@redhat.com>
*/
public class DeploymentContext {
private final List<URL> configUrls;
private final Map<String, File> subContexts = new HashMap<String, File>();
private final Set<String> processedUrls = new HashSet<String>();
private final Set<File> createdTmpFiles = new HashSet<File>();
private final Logger log = LoggerFactory.getLogger(DeploymentContext.class);
public DeploymentContext(List<URL> configUrls) {
this.configUrls = configUrls;
}
public List<URL> getConfigUrls() {
return configUrls;
}
public Map<String, File> getSubContexts() {
return subContexts;
}
public boolean hasProcessed(File file) {
return processedUrls.contains(file.getAbsolutePath());
}
public void markProcessed(File file) {
processedUrls.add(file.getAbsolutePath());
}
public List<URL> process() {
PackagingUtil.process(this);
final List<URL> superAndSubContexts = new ArrayList<URL>();
for (final Map.Entry<String, File> entry : subContexts.entrySet()) {
final File unzipped = entry.getValue();
try {
superAndSubContexts.add(unzipped.toURI().toURL());
}
catch (final MalformedURLException e) {
throw new RuntimeException(e);
}
}
// orig urls needed? could be refactored...
superAndSubContexts.addAll(configUrls);
return superAndSubContexts;
}
public void markTmpFile(File file) {
createdTmpFiles.add(file);
}
public void close() {
for (final File f : createdTmpFiles) {
final boolean deleted = deleteDirectory(f);
if (!deleted) {
//note: use an error message instead of an exception
log.error("failed to cleanup: files were not deleted: " + f.getPath() + " (exists:" + f.exists() + ")");
}
}
}
static public boolean deleteDirectory(File path) {
if (path.exists()) {
final File[] files = path.listFiles();
if (files != null) {
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
deleteDirectory(files[i]);
}
else {
files[i].delete();
}
}
}
}
return (path.delete());
}
}