Migration 1 -> 2

Maven

Das neue Modul hat eine neue artifactId und kann parallel mit der einser Version genutzt werden.
Der neue Dependency-Eintrag für die pom.xml lautet:

<dependency>
    <groupId>com.dev5310</groupId>
    <artifactId>imageresizer</artifactId>
    <version>2.8.0</version>
</dependency>

Freemarker

Die alte Templating Funktionen, die ganze HTML-Blöcke generieren, wurden ersatzlos entfernt.
Um die gleiche funktionalität wiederherzustellen, können Freemarker Makros und die neuen Templating Funktion genutzt werden.

[#assign sourceSets = {
    "1280": resizerfn.getCompleteLink(content.image!, 1400, 0)!,
    "1024": resizerfn.getCompleteLink(content.image!, 1280, 0)!,
    "768": resizerfn.getCompleteLink(content.image!, 1024, 0)!,
    "1": resizerfn.getCompleteLink(content.image!, 767, 0)!
}]

[@sizerImage sourceSets=sourceSets alt=(content.image.altText)! lazy=true/]

[#macro sizerImage sourceSets alt="" cssClass="cover" lazy=false]
    <picture class="${cssClass}">
        [#list sourceSets as size, sourceSet]
            <source media='(min-width: ${size!"1"}px)' srcset='${sourceSet}?imageFormat=webp' type="image/webp"/>
            <source media='(min-width: ${size!"1"}px)' srcset='${sourceSet}?imageFormat=jpg' type="image/jpeg"/>
        [/#list]
        <img src='${sourceSets?values?last}?imageFormat=jpg' alt='${alt!}' loading='${lazy?then("lazy", "eager")}'/>
    </picture>
[/#macro]

Oder die Builder Variante nutzen, die hier beschrieben wird: Templating Funktion Builder.

JCR-Daten

Von 1.5.0

JCR Daten für Dialogfeld sind datenkompatibel.

Von 1.4.0 und älter

JCR Daten für die Felder sind nicht datenkompatibel. Folgendes Script führt Node Operationen aus, die mit dem Update auf 1.5.0 gemacht werden würden, damit die Felder datenkompatibel werden.

import groovy.transform.Field
import info.magnolia.jcr.predicate.AbstractPredicate
import info.magnolia.jcr.util.NodeTypes
import info.magnolia.jcr.util.NodeUtil
import info.magnolia.repository.RepositoryConstants
import org.apache.commons.lang.StringUtils

import javax.jcr.*

@Field final List<String> propertyNames = List.of(
        "damID",
        "focusHorizontal",
        "focusVertical",
        "altText"
)
@Field final String delimiter = "___";

// true to save changes in repo
@Field final boolean save = true

final String oldAssetSuffix = delimiter + "damID";
println("oldAssetSuffix=${oldAssetSuffix}")
final Session session = ctx.getJCRSession(RepositoryConstants.WEBSITE);
session.refresh(false)
final Iterable<Node> components = NodeUtil.collectAllChildren(session.getRootNode(), new AbstractPredicate<Node>() {
    @Override
    public boolean evaluateTyped(final Node node) {
        try {
            final String name = node.getPrimaryNodeType().getName();
            if (NodeTypes.Component.NAME == name) {
                return true;
            }
            if (NodeTypes.Page.NAME == name) {
                return true;
            }
            if (NodeTypes.Area.NAME == name) {
                return true;
            }
        } catch (RepositoryException ignored) {
        }
        return false;
    }
});
for (final Node component : components) {
    final PropertyIterator properties = component.getProperties();
    int i = 0;
    while (properties.hasNext()) {
        final Property property = properties.nextProperty();
        if (property.isModified()) {
            // observed already migrated (changed) properties being iterated over again (2x node from collectAll??)
            // skip in this case...
            continue;
        }
        if (property.getName().endsWith(oldAssetSuffix)) {
            final String currentName = StringUtils.substringBefore(property.getName(), oldAssetSuffix);
            moveProperties(component, currentName);
            if (save && ++i % 100 == 0) {
                session.save()
            }
        }
    }
}

def moveProperties(final Node component, final String name) {
    try {
        if (!component.hasNode(name)) {
            final Node holder = component.addNode(name, NodeTypes.ContentNode.NAME);
            for (String propertyName : propertyNames) {
                if (component.hasProperty(name + delimiter + propertyName)) {
                    Property oldProperty = component.getProperty(name + delimiter + propertyName);
                    holder.setProperty(propertyName, oldProperty.getValue());
                    oldProperty.remove();
                }
            }
        } else {
            println("can't migrate property in ${component.getPath()} because of name collision, node '${name}' already exists");
        }
    } catch (RepositoryException e) {
        println("Error: " + e.getMessage());
    }
}

if (save) session.save();
println("done")

Deinstallation des alten Modules

Es müssen folgende Pfade im Config-Workspace gelöscht werden:

  • /modules/sizer
  • /modules/imaging/config/generators/sizer
  • /modules/rendering/renderers/freemarker/contextAttributes/sizerfn