/**
  * Copy a patch element
  *
  * @param entry the patch entry
  * @param patchId the patch id for the element
  * @param modifications the element modifications
  * @return the new patch element
  */
 protected static PatchElement createPatchElement(
     final PatchEntry entry, String patchId, final List<ContentModification> modifications) {
   final PatchElement patchElement = entry.element;
   final PatchElementImpl element = new PatchElementImpl(patchId);
   element.setProvider(patchElement.getProvider());
   // Add all the rollback actions
   element.getModifications().addAll(modifications);
   return element;
 }
 /**
  * Create a patch element for the rollback patch.
  *
  * @param entry the entry
  * @return the new patch element
  */
 protected static PatchElement createRollbackElement(final PatchEntry entry) {
   final PatchElement patchElement = entry.element;
   final String patchId;
   final Patch.PatchType patchType = patchElement.getProvider().getPatchType();
   if (patchType == Patch.PatchType.CUMULATIVE) {
     patchId = entry.getCumulativePatchID();
   } else {
     patchId = patchElement.getId();
   }
   return createPatchElement(entry, patchId, entry.rollbackActions);
 }
  /**
   * Get the target entry for a given patch element.
   *
   * @param element the patch element
   * @return the patch entry
   * @throws PatchingException
   */
  protected PatchEntry resolveForElement(final PatchElement element) throws PatchingException {
    assert state == State.NEW;
    final PatchElementProvider provider = element.getProvider();
    final String layerName = provider.getName();
    final LayerType layerType = provider.getLayerType();

    final Map<String, PatchEntry> map;
    if (layerType == LayerType.Layer) {
      map = layers;
    } else {
      map = addOns;
    }
    PatchEntry entry = map.get(layerName);
    if (entry == null) {
      final InstallationManager.MutablePatchingTarget target =
          modification.resolve(layerName, layerType);
      if (target == null) {
        throw PatchMessages.MESSAGES.noSuchLayer(layerName);
      }
      entry = new PatchEntry(target, element);
      map.put(layerName, entry);
    }
    // Maintain the most recent element
    entry.updateElement(element);
    return entry;
  }