blob: 08f5a1e69bb4ff8454dfdece7f332e2319aa1b7e [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.analyser.task.impl;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.apache.jackrabbit.vault.validation.ValidationViolation;
import org.apache.jackrabbit.vault.validation.spi.ValidatorSettings;
import org.apache.sling.feature.ArtifactId;
import org.apache.sling.feature.analyser.task.AnalyserTask;
import org.apache.sling.feature.analyser.task.AnalyserTaskContext;
import org.apache.sling.feature.analyser.task.impl.contentpackage.PackageValidator;
import org.apache.sling.feature.scanner.ContentPackageDescriptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This analyzer checks for bundles and configurations in packages
*/
public class CheckContentPackages implements AnalyserTask {
Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public String getName() {
return "Content Package validation";
}
@Override
public String getId() {
return "content-packages";
}
@Override
public void execute(final AnalyserTaskContext ctx) throws Exception {
Map<String, ? extends ValidatorSettings> validatorSettings = new HashMap<>();
for (final ContentPackageDescriptor cp : ctx.getFeatureDescriptor().getDescriptors(ContentPackageDescriptor.class)) {
URL artifactFile = cp.getArtifactFile();
if (artifactFile == null) {
ctx.reportArtifactError(cp.getArtifact().getId(), "Content package " + cp.getName() + " is not resolved and can not be checked.");
} else {
validatePackage(ctx, cp, artifactFile, validatorSettings);
}
}
}
private void validatePackage(final AnalyserTaskContext ctx, final ContentPackageDescriptor cp,
URL artifactFile, Map<String, ? extends ValidatorSettings> validatorSettings) throws URISyntaxException, IOException {
URI artifactURI = artifactFile.toURI();
Path artifactPath = Paths.get(artifactURI);
PackageValidator validator = new PackageValidator(artifactURI, validatorSettings);
Collection<ValidationViolation> violations = validator.validate();
reportViolations(ctx, cp, violations, artifactPath);
}
private void reportViolations(AnalyserTaskContext ctx, ContentPackageDescriptor cp,
Collection<ValidationViolation> violations, Path artifactPath) {
for (ValidationViolation violation : violations) {
reportViolation(ctx, cp, violation, artifactPath);
}
}
private void reportViolation(AnalyserTaskContext ctx, ContentPackageDescriptor cp, ValidationViolation violation, Path artifactPath) {
String msg = getDetailMessage(violation, artifactPath);
ArtifactId id = cp.getArtifact().getId();
switch (violation.getSeverity()) {
case ERROR:
log.error(msg);
ctx.reportArtifactError(id, msg);
break;
case WARN:
log.warn(msg);
ctx.reportArtifactWarning(id, msg);
break;
case INFO:
log.info(msg);
break;
default:
log.debug(msg);
break;
}
}
private static String getDetailMessage(ValidationViolation violation, Path baseDirectory) {
StringBuilder message = new StringBuilder("ValidationViolation: \"" + getMessage(violation) + "\"");
if (violation.getFilePath() != null) {
message.append(", filePath=").append(baseDirectory.relativize(violation.getAbsoluteFilePath()));
}
if (violation.getNodePath() != null) {
message.append(", nodePath=").append(violation.getNodePath());
}
if (violation.getLine() > 0) {
message.append(", line=").append(violation.getLine());
}
if (violation.getColumn() > 0) {
message.append(", column=").append(violation.getColumn());
}
return message.toString();
}
private static String getMessage(ValidationViolation violation) {
StringBuilder message = new StringBuilder();
if (violation.getValidatorId() != null) {
message.append(violation.getValidatorId()).append(": ");
}
message.append(violation.getMessage());
return message.toString();
}
}