/*
* 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;
import java.io.File;
import org.jboss.as.patching.installation.InstalledImage;
/**
* The patching directory structure.
*
* <pre>
* <code>
*
* ${JBOSS_HOME}
* |-- bin
* |-- bundles
* | |-- system (system bundles contains only bundles, no patches metadata)
* | | |-- layers
* | | | |-- xyz
* | | | | `-- .overlays (overlay directory)
* | | | | |-- .overlays (overlay metadata)
* | | | | |-- patch-xyz-1
* | | | | `-- patch-xyz-2
* | | | |-- vuw
* | | | | `-- .overlays (overlay directory)
* | | | | `-- patch-vuw-1
* | | | `-- base
* | | | |-- .overlays (overlay directory)
* | | | | |-- patch-base-1
* | | | | `-- patch-base-2
* | | | `-- org/jboss/as/osgi
* | | `-- add-ons
* | | `-- def
* | | `-- .overlays (overlay directory)
* | | |-- patch-def-1
* | | `-- patch-def-2
* | |
* | `-- my/own/bundle/path/thing
* |
* |-- docs
* |-- modules
* | |-- layers.conf (xyz,vuw)
* | |-- system (system modules contains only modules, no patches metadata)
* | | |-- layers
* | | | |-- xyz
* | | | | `-- .overlays (overlay directory)
* | | | | |-- patch-xyz-1
* | | | | `-- patch-xyz-2
* | | | |-- vuw
* | | | | `-- .overlays (overlay directory)
* | | | | `-- patch-vuw-1
* | | | ` -- base
* | | | |-- .overlays (overlay directory)
* | | | | |-- patch-base-1
* | | | | `-- patch-base-2
* | | | |-- org/jboss/as/...
* | | | `-- org/jboss/as/server/main/module.xml
* | | `-- add-ons
* | | `-- def
* | | `-- .overlays (overlay directory)
* | | |-- patch-def-1
* | | `-- patch-def-2
* | |
* | `-- my/own/module/root/repo
* |
* |-- .installation (metadata directory for the installation)
* | |-- identity.conf (patched state for the installed identity)
* | |-- patches (history of the patches applied to the identity)
* | | `-- patch-identity-1
* | | |-- patch.xml
* | | |-- rollback.xml
* | | |-- timestamp
* | | |-- configuration (configuration backup)
* | | `-- misc (misc backup)
* | |-- layers (metadata for patched layers)
* | | |-- base
* | | | `-- layer.conf (patched state for the layer)
* | | |-- xyz
* | | | `-- layer.conf
* | | |-- vuw
* | | | `-- layer.conf
* | `-- add-ons (metadata for patched add-ons)
* | `-- def
* | `-- layer.conf
* `-- jboss-modules.jar
* </code>
* </pre>
*
* Algorithm to build the module path when the server boots:
*
* <ol>
* <li>let paths be a list of File</li>
* <li>for each layer in {@link org.jboss.as.patching.installation.InstalledImage#getLayersConf()} file and "base":</li>
* <ol>
* <li>read the cumulative-patch-id in {@link org.jboss.as.patching.installation.Layer#loadTargetInfo()#getInstallationInfo()}</li>
* <li>append {@link org.jboss.as.patching.installation.Layer#loadTargetInfo()#getModulePatchDirectory(String)} for the cumulative-patch-id (if it exists) to the paths</li>
* <li>for each one-off patchIDs in {@link org.jboss.as.patching.installation.Layer#loadTargetInfo()#getInstallationInfo()}</li>
* <ol>
* <li>append {@link org.jboss.as.patching.installation.Layer#loadTargetInfo()#getModulePatchDirectory(String)} (if it exists) to the paths</li>
* </ol>
* </ol>
* <li>for each addOn in {@link InstalledImage#getModulesDir()}}/system/add-ons</li>
* <ol>
* <li>read the cumulative-patch-id in {@link org.jboss.as.patching.installation.AddOn#loadTargetInfo()#getInstallationInfo()}</li>
* <li>append {@link org.jboss.as.patching.installation.AddOn#loadTargetInfo()#getModulePatchDirectory(String)} for the cumulative-patch-id (if it exists) to the paths</li>
* <li>for each one-off patchIDs in {@link org.jboss.as.patching.installation.AddOn#loadTargetInfo()#getInstallationInfo()}</li>
* <ol>
* <li>append {@link org.jboss.as.patching.installation.AddOn#loadTargetInfo()#getModulePatchDirectory(String)} (if it exists) to the paths</li>
* </ol>
* </ol>
* <li>return paths</li>
* </ol>
*
* Same algorithm applies to build the bundle path.
*
* @author Emanuel Muckenhuber
*/
public abstract class DirectoryStructure {
/**
* Get the installed image layout.
*
* @return the installed image
*/
public abstract InstalledImage getInstalledImage();
/**
* Get the installation metadata.
*
* @return the installation metadata file
*/
public abstract File getInstallationInfo();
/**
* Get the bundles repository root.
*
* @return the bundle base directory
*/
public abstract File getBundleRepositoryRoot();
/**
* Get the bundles patch directory for a given patch-id.
*
* @param patchId the patch-id
* @return the bundles patch directory
*/
public abstract File getBundlesPatchDirectory(final String patchId);
/**
* Get the module root.
*
* @return the module root
*/
public abstract File getModuleRoot();
/**
* Get the modules patch directory for a given patch-id.
*
* @param patchId the patch-id
* @return the modules patch directory
*/
public abstract File getModulePatchDirectory(final String patchId);
}