This is an automated email from the ASF dual-hosted git repository. kwin pushed a commit to branch feature/extended-run-mode-support in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-installer-core.git
commit 3759e38209577df181ba78a77a2ce61a754c8843 Author: Konrad Windszus <[email protected]> AuthorDate: Thu Jun 25 15:21:53 2020 +0200 SLING-9031 SLING-8548 helper class for disjunctive run modes and not operators --- .../installer/api/provider/RunModeSupport.java | 64 ++++++++++++++++++++++ .../sling/installer/api/provider/package-info.java | 21 +++++++ .../installer/api/provider/RunModeSupportTest.java | 39 +++++++++++++ 3 files changed, 124 insertions(+) diff --git a/src/main/java/org/apache/sling/installer/api/provider/RunModeSupport.java b/src/main/java/org/apache/sling/installer/api/provider/RunModeSupport.java new file mode 100644 index 0000000..b0d021d --- /dev/null +++ b/src/main/java/org/apache/sling/installer/api/provider/RunModeSupport.java @@ -0,0 +1,64 @@ +/* + * 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.installer.api.provider; + +import java.util.Set; +import java.util.regex.Pattern; + +public final class RunModeSupport { + + private static final String OR_SEPARATOR = ","; + private static final String AND_SEPARATOR = "."; + private static final String NOT_PREFIX = "-"; + + private RunModeSupport() { + // not supposed to be instantiated + } + + public static int getMatchingRunmodesFromDisjunctions(String disjunctions, Set<String> activeRunModes) { + int numMatchingRunModes = 0; + // 1. support OR + for (String discjunctivePart : disjunctions.split(Pattern.quote(OR_SEPARATOR))) { + int newNumMatchingRunModes = getMatchingRunModesFromConjunctions(discjunctivePart, activeRunModes); + if (newNumMatchingRunModes > numMatchingRunModes) { + numMatchingRunModes = newNumMatchingRunModes; + } + } + return numMatchingRunModes; + } + + private static int getMatchingRunModesFromConjunctions(String conjunctions, Set<String> activeRunModes) { + int numMatchingRunModes = 0; + // 2. support AND + for (String conjunctivePart : conjunctions.split(Pattern.quote(AND_SEPARATOR))) { + // 3. support NOT operator + if (conjunctivePart.startsWith(NOT_PREFIX)) { + if (activeRunModes.contains(conjunctivePart.substring(NOT_PREFIX.length()))) { + return 0; + } + } else { + if (!activeRunModes.contains(conjunctivePart)) { + return 0; + } + } + numMatchingRunModes++; + } + return numMatchingRunModes; + } +} diff --git a/src/main/java/org/apache/sling/installer/api/provider/package-info.java b/src/main/java/org/apache/sling/installer/api/provider/package-info.java new file mode 100644 index 0000000..53a2e40 --- /dev/null +++ b/src/main/java/org/apache/sling/installer/api/provider/package-info.java @@ -0,0 +1,21 @@ +/* + * 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. + */ + [email protected]("1.0.0") +package org.apache.sling.installer.api.provider; diff --git a/src/test/java/org/apache/sling/installer/api/provider/RunModeSupportTest.java b/src/test/java/org/apache/sling/installer/api/provider/RunModeSupportTest.java new file mode 100644 index 0000000..44ec2c2 --- /dev/null +++ b/src/test/java/org/apache/sling/installer/api/provider/RunModeSupportTest.java @@ -0,0 +1,39 @@ +/* + * 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.installer.api.provider; + +import java.util.Collections; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.junit.Assert; +import org.junit.Test; + +public class RunModeSupportTest { + + @Test + public void testGetMatchingRunmodesFromName() { + Assert.assertEquals(0, RunModeSupport.getMatchingRunmodesFromDisjunctions("test1.test2,-test3.test4", Collections.singleton("test5"))); + Assert.assertEquals(0, RunModeSupport.getMatchingRunmodesFromDisjunctions("test1.test2,-test3.test4", Stream.of("test1", "test3").collect(Collectors.toSet()))); + Assert.assertEquals(0, RunModeSupport.getMatchingRunmodesFromDisjunctions("test1.test2,-test3.test4", Stream.of("test2", "test3").collect(Collectors.toSet()))); + Assert.assertEquals(2, RunModeSupport.getMatchingRunmodesFromDisjunctions("test1.test2,-test3.test4", Stream.of("test1", "test2").collect(Collectors.toSet()))); + Assert.assertEquals(2, RunModeSupport.getMatchingRunmodesFromDisjunctions("test1.test2,-test3.test4", Stream.of("test2", "test4").collect(Collectors.toSet()))); + Assert.assertEquals(3, RunModeSupport.getMatchingRunmodesFromDisjunctions("test1.test2,-test3.test4,test5.test6.test7", Stream.of("test1", "test2", "test4", "test5", "test6", "test7").collect(Collectors.toSet()))); + } +}
