blob: 46d74a620a5d10358711edeee7d552360455a3de [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.cms.core.models;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import javax.inject.Inject;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.jackrabbit.JcrConstants;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.cms.CMSConstants;
import org.apache.sling.cms.core.internal.ResourceEditorAssociation;
import org.apache.sling.cms.core.internal.ResourceEditorAssociationProvider;
import org.apache.sling.cms.i18n.I18NProvider;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.injectorspecific.OSGiService;
import org.osgi.annotation.versioning.ProviderType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Model for constructing the content breadcrumb.
*/
@ProviderType
@Model(adaptables = SlingHttpServletRequest.class)
public class ContentBreadcrumb {
private static final Logger log = LoggerFactory.getLogger(ContentBreadcrumb.class);
private long depth;
@OSGiService
private ResourceEditorAssociationProvider associationProvider;
private Resource resource;
private final String rootTitle;
@Inject
public ContentBreadcrumb(SlingHttpServletRequest request, @OSGiService I18NProvider i18nProvider) {
this.resource = request.getRequestPathInfo().getSuffixResource();
log.debug("Loading configuration from {}", request.getResource().getValueMap());
depth = request.getResource().getValueMap().get("depth", 0L);
String title = request.getResource().getValueMap().get("rootTitle", String.class);
if (title != null) {
rootTitle = i18nProvider.getDictionary(request).get(title);
} else {
rootTitle = null;
}
}
public String getCurrentItem() {
List<Pair<String, String>> parents = getParents();
if ((parents == null || parents.isEmpty()) && StringUtils.isNotBlank(rootTitle)) {
return rootTitle;
}
return getTitle(resource);
}
private String getLink(Resource resource) {
log.debug("Getting link for {} from {}", resource, associationProvider.getAssociations());
return associationProvider.getAssociations().stream().filter(a -> a.matches(resource)).findFirst()
.map(ResourceEditorAssociation::getEditor).orElse("/bin/browser.html") + resource.getPath();
}
public List<Pair<String, String>> getParents() {
List<Resource> ps = new ArrayList<>();
Resource current = resource;
while (true) {
Resource parent = current.getParent();
if (parent != null) {
ps.add(parent);
current = parent;
} else {
break;
}
}
Collections.reverse(ps);
if (depth <= ps.size()) {
ps = ps.subList((int) depth, ps.size());
} else {
ps.clear();
}
List<Pair<String, String>> parents = ps.stream().map(p -> new ImmutablePair<>(getLink(p), getTitle(p)))
.collect(Collectors.toList());
if (!parents.isEmpty() && StringUtils.isNotBlank(rootTitle)) {
parents.set(0, new ImmutablePair<>(parents.get(0).getLeft(), rootTitle));
}
return parents;
}
private String getTitle(Resource resource) {
String title = resource.getValueMap().get(CMSConstants.PN_TITLE, String.class);
if (StringUtils.isNotBlank(title)) {
return title;
}
title = resource.getValueMap().get(JcrConstants.JCR_CONTENT + "/" + CMSConstants.PN_TITLE, String.class);
if (StringUtils.isNotBlank(title)) {
return title;
}
return resource.getName();
}
}