RequestIncludedLibraries.java
/*
* #%L
* wcm.io
* %%
* Copyright (C) 2024 wcm.io
* %%
* Licensed 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.
* #L%
*/
package io.wcm.wcm.ui.clientlibs.components;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Function;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.sling.api.SlingHttpServletRequest;
import org.jetbrains.annotations.Nullable;
import com.adobe.granite.ui.clientlibs.HtmlLibraryManager;
import com.drew.lang.annotations.NotNull;
class RequestIncludedLibraries {
/**
* Request attributes that is also used by Granite UI clientlib manager to store the (raw) library
* paths that are already included in the current request.
*/
private static final String RA_INCLUDED_LIBRARY_PATHS = HtmlLibraryManager.class.getName() + ".included";
private final SlingHttpServletRequest request;
private final boolean allowMultipleIncludes;
RequestIncludedLibraries(@NotNull SlingHttpServletRequest request,
@Nullable Object allowMultipleIncludes) {
this.request = request;
this.allowMultipleIncludes = toBoolean(allowMultipleIncludes);
}
/**
* Gets set of library paths from request attribute. If not set, attribute is initialized with an empty set.
* @return Set of library paths attached to current request
*/
@SuppressWarnings("unchecked")
private @NotNull Set<String> getLibaryPathsSetFromRequest() {
Set<String> libraryPaths = (Set<String>)request.getAttribute(RA_INCLUDED_LIBRARY_PATHS);
if (libraryPaths == null) {
libraryPaths = new HashSet<>();
request.setAttribute(RA_INCLUDED_LIBRARY_PATHS, libraryPaths);
}
return libraryPaths;
}
/**
* @param libraryPath Library path
* @return true if given library was already included in current request.
*/
boolean isInlucded(@NotNull String libraryPath) {
return getLibaryPathsSetFromRequest().contains(libraryPath);
}
/**
* Store library path as included in current request.
* @param libraryPath Library path
*/
void storeIncluded(@NotNull String libraryPath) {
getLibaryPathsSetFromRequest().add(libraryPath);
}
/**
* Builds the markup for all given HTML libraries that are not already included in the current request.
* @param libraryPaths Library paths
* @param htmlTagBuilderFactory Factory to create HTML tag builders
* @return Markup
*/
String buildMarkupIgnoringDuplicateLibraries(@NotNull List<String> libraryPaths,
@NotNull Function<String, HtmlTagBuilder> htmlTagBuilderFactory) {
StringBuilder markup = new StringBuilder();
for (String libraryPath : libraryPaths) {
// ignore libraries that are already included
if (!allowMultipleIncludes && isInlucded(libraryPath)) {
continue;
}
// build markup for library
markup.append(htmlTagBuilderFactory.apply(libraryPath).build());
// mark library as included
storeIncluded(libraryPath);
}
return markup.toString();
}
private static boolean toBoolean(Object value) {
if (value instanceof Boolean) {
return (Boolean)value;
}
else if (value instanceof String) {
return BooleanUtils.toBoolean((String)value);
}
return false;
}
}