[
https://issues.apache.org/jira/browse/MSITE-1000?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17839082#comment-17839082
]
ASF GitHub Bot commented on MSITE-1000:
---------------------------------------
michael-o commented on code in PR #177:
URL: https://github.com/apache/maven-site-plugin/pull/177#discussion_r1572746343
##########
src/main/java/org/apache/maven/plugins/site/render/ParserConfiguratorImpl.java:
##########
@@ -0,0 +1,156 @@
+/*
+ * 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.maven.plugins.site.render;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+import java.nio.file.PathMatcher;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import org.apache.maven.doxia.parser.Parser;
+import org.apache.maven.doxia.siterenderer.ParserConfigurator;
+import org.apache.maven.plugin.descriptor.MojoDescriptor;
+import org.codehaus.plexus.PlexusContainer;
+import
org.codehaus.plexus.component.configurator.ComponentConfigurationException;
+import org.codehaus.plexus.component.configurator.ComponentConfigurator;
+import
org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
+import
org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.codehaus.plexus.configuration.PlexusConfiguration;
+
+/**
+ * Configures a parser based on a {@link PlexusConfiguration} for a particular
parser id and optionally matching one of multiple patterns.
+ * It internally leverages the {@link ComponentConfigurator} for calling the
right methods inside the parser implementation.
+ */
+public class ParserConfiguratorImpl implements ParserConfigurator, Closeable {
+
+ private static final class ParserConfigurationKey {
+
+ ParserConfigurationKey(String parserId, PlexusConfiguration
patternsConfiguration) {
+ this(parserId,
PlexusConfigurationUtils.getStringArrayValues(patternsConfiguration));
+ }
+
+ ParserConfigurationKey(String parserId, Collection<String> patterns) {
+ this.parserId = parserId;
+ // lazily populate all matchers
+ matchers = patterns.stream()
+ .map(p -> FileSystems.getDefault().getPathMatcher(p))
+ .collect(Collectors.toList());
Review Comment:
I wonder how this might deviate from what we use to match path patterns. I
not opposing, just mentioning. People are used the stuff we have with Plexus
matching. Keep that in mind.
##########
src/main/java/org/apache/maven/plugins/site/render/ParserConfiguratorImpl.java:
##########
@@ -0,0 +1,156 @@
+/*
+ * 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.maven.plugins.site.render;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+import java.nio.file.PathMatcher;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import org.apache.maven.doxia.parser.Parser;
+import org.apache.maven.doxia.siterenderer.ParserConfigurator;
+import org.apache.maven.plugin.descriptor.MojoDescriptor;
+import org.codehaus.plexus.PlexusContainer;
+import
org.codehaus.plexus.component.configurator.ComponentConfigurationException;
+import org.codehaus.plexus.component.configurator.ComponentConfigurator;
+import
org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
+import
org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.codehaus.plexus.configuration.PlexusConfiguration;
+
+/**
+ * Configures a parser based on a {@link PlexusConfiguration} for a particular
parser id and optionally matching one of multiple patterns.
+ * It internally leverages the {@link ComponentConfigurator} for calling the
right methods inside the parser implementation.
+ */
+public class ParserConfiguratorImpl implements ParserConfigurator, Closeable {
+
+ private static final class ParserConfigurationKey {
+
+ ParserConfigurationKey(String parserId, PlexusConfiguration
patternsConfiguration) {
+ this(parserId,
PlexusConfigurationUtils.getStringArrayValues(patternsConfiguration));
+ }
+
+ ParserConfigurationKey(String parserId, Collection<String> patterns) {
+ this.parserId = parserId;
+ // lazily populate all matchers
+ matchers = patterns.stream()
+ .map(p -> FileSystems.getDefault().getPathMatcher(p))
+ .collect(Collectors.toList());
+ }
+
+ private final String parserId;
+
+ /**
+ * List of {@link PathMatcher}s for all of the patterns passed to the
constructor
+ */
+ private List<PathMatcher> matchers;
+
+ /**
+ * Returns {@code true} the given file path matches one of the {@link
#patterns} given via {@link #addPattern(String)}
+ * @param filePath the file path to check
+ * @return {@code true} if the given file path matches at least one of
the patterns, {@code false} otherwise.
+ * @throws IllegalArgumentException
+ * If one of the patterns does not comply with the form:
{@code syntax:pattern}
+ * @throws java.util.regex.PatternSyntaxException
+ * If one of the regex patterns is invalid
+ * @throws UnsupportedOperationException
+ * If one of the patterns syntax prefix is not known to the
implementation
+ * @see FileSystem#getPathMatcher(String)
+ */
+ public boolean matches(String parserId, Path filePath) {
+ if (this.parserId.equals(parserId)) {
+ return false;
+ }
+ if (matchers.isEmpty()) {
+ return true; // no patterns mean always match
+ }
+ return matchers.stream().anyMatch(m -> m.matches(filePath));
+ }
+ }
+
+ private final org.codehaus.plexus.classworlds.realm.ClassRealm
pluginClassRealm;
+ private final PlexusContainer plexusContainer;
+ private final ComponentConfigurator componentConfigurator;
+
+ private final Map<ParserConfigurationKey, PlexusConfiguration>
parserConfigurations;
+
+ public ParserConfiguratorImpl(
+ Map<String, List<PlexusConfiguration>> parserConfigurations,
+ PlexusContainer plexusContainer,
+ MojoDescriptor mojoDescriptor)
+ throws ComponentLookupException {
+ this.parserConfigurations = new LinkedHashMap<>();
+ for (Map.Entry<String, List<PlexusConfiguration>>
parserConfigurationPerId : parserConfigurations.entrySet()) {
+ String parserId = parserConfigurationPerId.getKey();
+ for (PlexusConfiguration configuration :
parserConfigurationPerId.getValue()) {
+ ParserConfigurationKey key = new
ParserConfigurationKey(parserId, configuration.getChild("patterns"));
+ this.parserConfigurations.put(key, configuration);
+ }
+ }
+ pluginClassRealm = mojoDescriptor.getRealm();
+ this.plexusContainer = plexusContainer;
+ componentConfigurator =
getComponentConfigurator(mojoDescriptor.getComponentConfigurator());
+ }
+
+ ComponentConfigurator getComponentConfigurator(String configuratorId)
throws ComponentLookupException {
+ // logic copied from
+ //
https://github.com/apache/maven/blob/267de063eec17111688fd1a27d4e3aae6c8d0c51/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java#L696C9-L700C10
+ if (configuratorId == null || configuratorId.isEmpty()) {
+ configuratorId = "basic"; // TODO: support v4
+ }
+ return plexusContainer.lookup(ComponentConfigurator.class,
configuratorId);
+ }
+
+ public void configureParser(PlexusConfiguration configuration, Parser
parser)
+ throws ComponentConfigurationException {
+ componentConfigurator.configureComponent(parser, configuration,
pluginClassRealm);
+ }
+
+ @Override
+ public void close() throws IOException {
+ try {
+ plexusContainer.release(componentConfigurator);
+ } catch (ComponentLifecycleException e) {
+ throw new IOException(e);
+ }
+ }
+
+ @Override
+ public boolean configure(String parserId, Path filePath, Parser parser) {
+ Optional<PlexusConfiguration> config =
parserConfigurations.entrySet().stream()
+ .filter(c -> c.getKey().matches(parserId, filePath))
+ .findFirst()
+ .map(Map.Entry::getValue);
+ config.ifPresent(c -> {
+ try {
+ configureParser(c, parser);
+ } catch (ComponentConfigurationException e) {
+ throw new IllegalStateException("Could not configure parser "
+ parser + " due to ", e);
Review Comment:
The "due to" is redundant
> Allow parametrisation of Doxia parser per file
> ----------------------------------------------
>
> Key: MSITE-1000
> URL: https://issues.apache.org/jira/browse/MSITE-1000
> Project: Maven Site Plugin
> Issue Type: New Feature
> Components: doxia integration
> Reporter: Konrad Windszus
> Assignee: Konrad Windszus
> Priority: Major
>
> Currently only the attributes used for rendering the site can be
> parameterized in
> https://maven.apache.org/plugins/maven-site-plugin/site-mojo.html#attributes.
> There is no possibility to configure the parser in
> https://github.com/apache/maven-doxia-sitetools/blob/dacaa552c1b8e89eed84db0f43b6b0a72be91d0c/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java#L322
> per document.
> This would be nice in the context of
> https://issues.apache.org/jira/browse/DOXIA-722 where generation of anchors
> should be switched on/off for certain documents. Also generation of comments
> may be desirable for certain documents.
> I propose the following additional plugin goal parameter:
> {code}
> <parserConfigurations>
> <parserConfiguration>
> <patterns>
> <pattern>**/apt/**</pattern>
> </patterns>
> <emitAnchorsForIndexableEntries>false</emitAnchorsForIndexableEntries>
> <emitComments>true</emitComments>
> </parserConfiguration>
> <parserConfigurations>
> {code}
> where {{parserConfigurations}} is an array of a complex type with (include)
> patterns on the source path (String array) and boolean methods for features.
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)