/*
* JBoss, Home of Professional Open Source.
* Copyright 2012, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.patching.runner;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.jboss.as.patching.Constants;
import org.jboss.as.patching.metadata.BundleItem;
import org.jboss.as.patching.metadata.ContentItem;
import org.jboss.as.patching.metadata.ContentType;
import org.jboss.as.patching.metadata.MiscContentItem;
import org.jboss.as.patching.metadata.ModuleItem;
/**
* Content loader for patch contents. When applying a patch the content is loaded from the patch itself; for rollbacks
* the content will be loaded from the patch history.
*
* @author Emanuel Muckenhuber
*/
public abstract class PatchContentLoader {
public static final String MODULES = Constants.MODULES;
public static final String BUNDLES = Constants.BUNDLES;
public static final String MISC = Constants.MISC;
public static PatchContentLoader create(final File root) {
final File miscRoot = new File(root, PatchContentLoader.MISC);
final File bundlesRoot = new File(root, PatchContentLoader.BUNDLES);
final File modulesRoot = new File(root, PatchContentLoader.MODULES);
return PatchContentLoader.create(miscRoot, bundlesRoot, modulesRoot);
}
public static PatchContentLoader create(final File miscRoot, final File bundlesRoot, final File modulesRoot) {
return new BasicContentLoader(miscRoot, bundlesRoot, modulesRoot);
}
/**
* Open a new content stream.
*
* @param item the content item
* @return the content stream
*/
InputStream openContentStream(final ContentItem item) throws IOException {
final File file = getFile(item);
if (file == null) {
throw new IllegalStateException();
}
return new FileInputStream(file);
}
/**
* Get a patch content file.
*
* @param item the content item
* @return the file
*/
public abstract File getFile(final ContentItem item);
public static File getMiscPath(final File miscRoot, final MiscContentItem item) {
if (miscRoot == null) {
throw new IllegalStateException();
}
File file = miscRoot;
for (final String path : item.getPath()) {
file = new File(file, path);
}
file = new File(file, item.getName());
return file;
}
public static File getModulePath(File root, ModuleItem item) {
return getModulePath(root, item.getName(), item.getSlot());
}
static File getModulePath(File root, String name, String slot) {
if (root == null) {
throw new IllegalStateException();
}
final String[] ss = name.split("\\.");
File file = root;
for (final String s : ss) {
file = new File(file, s);
}
return new File(file, slot);
}
static class BasicContentLoader extends PatchContentLoader {
private final File miscRoot;
private final File bundlesRoot;
private final File modulesRoot;
BasicContentLoader(File miscRoot, File bundlesRoot, File modulesRoot) {
this.miscRoot = miscRoot;
this.bundlesRoot = bundlesRoot;
this.modulesRoot = modulesRoot;
}
@Override
public File getFile(ContentItem item) {
final ContentType content = item.getContentType();
switch (content) {
case MODULE:
return getModulePath((ModuleItem) item);
case MISC:
return getMiscPath((MiscContentItem) item);
case BUNDLE:
return getBundlePath((BundleItem) item);
default:
throw new IllegalStateException();
}
}
File getMiscPath(final MiscContentItem item) {
return getMiscPath(miscRoot, item);
}
File getModulePath(final ModuleItem item) {
return getModulePath(modulesRoot, item);
}
File getBundlePath(final BundleItem item) {
return getModulePath(bundlesRoot, item.getName(), item.getSlot());
}
}
}