blob: 065cf3ea412a2455a60397015666a036ef38ea89 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with this
* work for additional information regarding copyright ownership. The ASF
* licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.sling.feature.diff.impl;
import static java.util.Objects.requireNonNull;
import java.util.Collection;
import java.util.LinkedList;
import org.apache.sling.feature.ArtifactId;
import org.apache.sling.feature.Feature;
import org.apache.sling.feature.Prototype;
import org.apache.sling.feature.diff.DiffRequest;
public final class FeatureDiffImpl {
private static final String UPDATER_CLASSIFIER = "updater";
private static final FeatureElementComparator[] comparators = new FeatureElementComparator[] {
new BundlesComparator(),
new ConfigurationsComparator(),
new ExtensionsComparator(),
new FrameworkPropertiesComparator()
};
public static Feature compareFeatures(DiffRequest diffRequest) {
requireNonNull(diffRequest, "Impossible to compare features without specifying them.");
Feature previous = requireNonNull(diffRequest.getPrevious(), "Impossible to compare null previous feature.");
Feature current = requireNonNull(diffRequest.getCurrent(), "Impossible to compare null current feature.");
if (previous.getId().equals(current.getId())) {
throw new IllegalArgumentException("Input Features refer to the the same Feature version.");
}
StringBuilder classifier = new StringBuilder();
if (current.getId().getClassifier() != null && !current.getId().getClassifier().isEmpty()) {
classifier.append(current.getId().getClassifier())
.append('_');
}
classifier.append(UPDATER_CLASSIFIER);
ArtifactId resultId = new ArtifactId(current.getId().getGroupId(),
current.getId().getArtifactId(),
current.getId().getVersion(),
classifier.toString(),
current.getId().getType());
Feature target = new Feature(resultId);
target.setTitle(previous.getId() + " to " + current.getId());
target.setDescription("Computed " + previous.getId() + " to " + current.getId() + " Feature update");
Prototype prototype = new Prototype(previous.getId());
target.setPrototype(prototype);
for (FeatureElementComparator comparator : loadComparators(diffRequest)) {
comparator.computeDiff(previous, current, target);
}
return target;
}
public static Iterable<FeatureElementComparator> loadComparators(DiffRequest diffRequest) {
Collection<FeatureElementComparator> filteredComparators = new LinkedList<>();
for (FeatureElementComparator comparator : comparators) {
boolean included = !diffRequest.getIncludeComparators().isEmpty() ? diffRequest.getIncludeComparators().contains(comparator.getId()) : true;
boolean excluded = diffRequest.getExcludeComparators().contains(comparator.getId());
if (included && !excluded) {
filteredComparators.add(comparator);
}
}
return filteredComparators;
}
/**
* this class must not be instantiated directly
*/
private FeatureDiffImpl() {
// do nothing
}
}