blob: 96ab646e1e5c6e5ba9900626243df21cc24a9187 [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.cpconverter.handlers.slinginitialcontent;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import java.util.Set;
import static org.apache.jackrabbit.vault.util.Constants.DOT_CONTENT_XML;
import static org.apache.sling.feature.cpconverter.shared.ConverterConstants.SLASH;
/**
* Performs re-computation of the ContentPackagePath of the bundle entry (Sling Initial Content)
*/
class ContentPackageEntryPathComputer {
private final Set<SlingInitialContentBundleEntryMetaData> bundleEntries;
private final String contentPackageEntryPath;
private final VaultContentXMLContentCreator contentCreator;
ContentPackageEntryPathComputer(@NotNull Set<SlingInitialContentBundleEntryMetaData> bundleEntries,
@NotNull final String contentPackageEntryPath,
@NotNull VaultContentXMLContentCreator contentCreator) {
this.bundleEntries = bundleEntries;
this.contentPackageEntryPath = contentPackageEntryPath;
this.contentCreator = contentCreator;
}
@NotNull
String compute() {
String recomputedContentPackageEntryPath = FilenameUtils.removeExtension(contentPackageEntryPath);
// this covers the case of having a primary node name defined in the xml/json descriptor itself.
// if this is set, we need to use it in the path.
if (StringUtils.isNotBlank(contentCreator.getPrimaryNodeName())) {
//custom node name
recomputedContentPackageEntryPath = StringUtils.substringBeforeLast(recomputedContentPackageEntryPath, SLASH);
recomputedContentPackageEntryPath = recomputedContentPackageEntryPath + SLASH + contentCreator.getPrimaryNodeName();
}
final String checkIfRecomputedPathCandidate = StringUtils.removeStart(recomputedContentPackageEntryPath, "/jcr_root");
// check if the resulting candidate matches one of the repositoryPaths in the bundle entries we have.
// for example /apps/testJsonFile.json.xml (descriptor entry)
// will match /apps/testJsonFile.json (file entry)
if (bundleEntries.stream().anyMatch(bundleEntry -> StringUtils.equals(checkIfRecomputedPathCandidate, bundleEntry.getRepositoryPath()))) {
//we are dealing with a file descriptor here
recomputedContentPackageEntryPath = recomputedContentPackageEntryPath + ".dir/" + DOT_CONTENT_XML;
} else {
// in this case we are dealing with a folder descriptor. for example:
// /apps/testJsonFolder.json
// we want it to end up in the following format: /apps/testJsonFolder/.content.xml in our assembler.
recomputedContentPackageEntryPath = recomputedContentPackageEntryPath + SLASH + DOT_CONTENT_XML;
}
return recomputedContentPackageEntryPath;
}
}