use of org.jboss.as.patching.runner.IdentityPatchContext.PatchEntry in project wildfly-core by wildfly.
the class IdentityPatchRunner method reenableNotOverridenModules.
void reenableNotOverridenModules(final RollbackPatch patch, IdentityPatchContext context) throws PatchingException, IOException, XMLStreamException {
assert patch.getIdentity().getPatchType() == Patch.PatchType.CUMULATIVE;
final Iterator historyIterator = context.getHistory().iterator(patch.getIdentityState().getIdentity().loadTargetInfo());
if (!historyIterator.hasNext()) {
return;
}
final List<PatchElement> elements = patch.getElements();
final Map<String, List<PatchElement>> layerPatches = new HashMap<String, List<PatchElement>>(elements.size());
final Map<String, List<PatchElement>> addonPatches = new HashMap<String, List<PatchElement>>(elements.size());
for (PatchElement e : elements) {
if (e.getProvider().isAddOn()) {
addonPatches.put(e.getProvider().getName(), Collections.<PatchElement>emptyList());
} else {
layerPatches.put(e.getProvider().getName(), Collections.<PatchElement>emptyList());
}
}
Patch prevCP = null;
while (historyIterator.hasNext()) {
final Entry entry = historyIterator.next();
if (entry.getType() == PatchType.CUMULATIVE) {
prevCP = entry.getMetadata();
break;
}
final Patch oneOff = entry.getMetadata();
for (PatchElement oneOffElement : oneOff.getElements()) {
final Map<String, List<PatchElement>> providerPatches;
if (oneOffElement.getProvider().isAddOn()) {
providerPatches = addonPatches;
} else {
providerPatches = layerPatches;
}
List<PatchElement> patches = providerPatches.get(oneOffElement.getProvider().getName());
if (patches != null) {
switch(patches.size()) {
case 0:
providerPatches.put(oneOffElement.getProvider().getName(), Collections.singletonList(oneOffElement));
break;
case 1:
patches = new ArrayList<PatchElement>(patches);
providerPatches.put(oneOffElement.getProvider().getName(), patches);
default:
patches.add(oneOffElement);
}
}
}
}
Set<ModuleItem> cpElementModules;
Set<ModuleItem> reenabledModules = Collections.emptySet();
for (PatchElement e : elements) {
final List<PatchElement> patches;
if (e.getProvider().isAddOn()) {
patches = addonPatches.get(e.getProvider().getName());
} else {
patches = layerPatches.get(e.getProvider().getName());
}
if (patches.isEmpty()) {
continue;
}
cpElementModules = null;
final PatchEntry rollbackEntry = context.resolveForElement(e);
for (PatchElement oneOff : patches) {
for (ContentModification mod : oneOff.getModifications()) {
if (mod.getItem().getContentType() != ContentType.MODULE) {
continue;
}
final ModuleItem module = (ModuleItem) mod.getItem();
if (rollbackEntry.get(new Location(module)) != null) {
continue;
}
if (reenabledModules.contains(module)) {
continue;
}
final File modulePath = PatchContentLoader.getModulePath(rollbackEntry.getDirectoryStructure().getModulePatchDirectory(oneOff.getId()), module);
rollbackEntry.invalidateRoot(modulePath);
if (reenabledModules.isEmpty()) {
reenabledModules = new HashSet<ModuleItem>();
}
reenabledModules.add(module);
if (prevCP == null) {
rollbackEntry.disableBaseModule(module);
} else {
if (cpElementModules == null) {
for (PatchElement cpE : prevCP.getElements()) {
if (cpE.getProvider().getName().equals(e.getProvider().getName()) && cpE.getProvider().getLayerType().equals(e.getProvider().getLayerType())) {
cpElementModules = new HashSet<ModuleItem>(cpE.getModifications().size());
for (ContentModification cpMod : cpE.getModifications()) {
if (cpMod.getItem().getContentType() == ContentType.MODULE) {
cpElementModules.add(cpMod.getItem(ModuleItem.class));
}
}
break;
}
}
}
if (cpElementModules != null && !cpElementModules.contains(module)) {
rollbackEntry.disableBaseModule(module);
}
}
}
}
}
}
Aggregations