[ 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)