From 905b5dc6d86d0e346d6336a2c4e7dcea9e622a71 Mon Sep 17 00:00:00 2001 From: Michal Krzywanski Date: Fri, 21 Aug 2020 11:07:23 +0200 Subject: [PATCH] Implemented filterer pattern --- filterer/README.MD | 45 ++++++ filterer/etc/filterer.png | Bin 0 -> 141773 bytes filterer/etc/filterer.urm.puml | 132 ++++++++++++++++++ filterer/pom.xml | 76 ++++++++++ .../iluwatar/filterer/domain/Filterer.java | 36 +++++ .../com/iluwatar/filterer/issue/Issue.java | 49 +++++++ .../filterer/issue/IssueAwareText.java | 55 ++++++++ .../filterer/issue/IssuePosition.java | 76 ++++++++++ .../iluwatar/filterer/issue/IssueType.java | 26 ++++ .../issue/ProbabilisticIssueAwareText.java | 49 +++++++ .../filterer/issue/ProbableIssue.java | 35 +++++ .../iluwatar/filterer/issue/SimpleIssue.java | 79 +++++++++++ .../filterer/issue/SimpleIssueAwareText.java | 98 +++++++++++++ .../SimpleProbabilisticIssueAwareText.java | 101 ++++++++++++++ .../filterer/issue/SimpleProbableIssue.java | 70 ++++++++++ .../issue/SimpleIssueAwareTextTest.java | 52 +++++++ ...SimpleProbabilisticIssueAwareTextTest.java | 52 +++++++ pom.xml | 1 + 18 files changed, 1032 insertions(+) create mode 100644 filterer/README.MD create mode 100644 filterer/etc/filterer.png create mode 100644 filterer/etc/filterer.urm.puml create mode 100644 filterer/pom.xml create mode 100644 filterer/src/main/java/com/iluwatar/filterer/domain/Filterer.java create mode 100644 filterer/src/main/java/com/iluwatar/filterer/issue/Issue.java create mode 100644 filterer/src/main/java/com/iluwatar/filterer/issue/IssueAwareText.java create mode 100644 filterer/src/main/java/com/iluwatar/filterer/issue/IssuePosition.java create mode 100644 filterer/src/main/java/com/iluwatar/filterer/issue/IssueType.java create mode 100644 filterer/src/main/java/com/iluwatar/filterer/issue/ProbabilisticIssueAwareText.java create mode 100644 filterer/src/main/java/com/iluwatar/filterer/issue/ProbableIssue.java create mode 100644 filterer/src/main/java/com/iluwatar/filterer/issue/SimpleIssue.java create mode 100644 filterer/src/main/java/com/iluwatar/filterer/issue/SimpleIssueAwareText.java create mode 100644 filterer/src/main/java/com/iluwatar/filterer/issue/SimpleProbabilisticIssueAwareText.java create mode 100644 filterer/src/main/java/com/iluwatar/filterer/issue/SimpleProbableIssue.java create mode 100644 filterer/src/test/java/com/iluwatar/filterer/issue/SimpleIssueAwareTextTest.java create mode 100644 filterer/src/test/java/com/iluwatar/filterer/issue/SimpleProbabilisticIssueAwareTextTest.java diff --git a/filterer/README.MD b/filterer/README.MD new file mode 100644 index 000000000..8a2526048 --- /dev/null +++ b/filterer/README.MD @@ -0,0 +1,45 @@ +--- # this is so called 'Yaml Front Matter', read up on it here: http://jekyllrb.com/docs/frontmatter/ +layout: pattern +title: Filterer Pattern +folder: filterer +permalink: /patterns/filterer/ +description: Design pattern that helps container-like objects to return filtered version of themselves.# short meta description that shows in Google search results +categories: + - Functional +tags: + - Extensibility +--- + +## Name / classification +Filterer Pattern + +## Intent +The intent of this design pattern is to to introduce a functional interface that will add a functionality for container-like objects to easily return filtered versions of themselves. + +## Explanation +The container-like object needs to have a method that returns an instance of `Filterer`. This helper interface gives +ability to covariantly specify a lower bound of contravariant `Predicate` in the subinterfaces of interfaces representing the container-like objects. + +## Class diagram +![Filterer](./etc/filterer.png "Filterer") + +## Applicability +Pattern can be used when working with container-like objects that use subtyping, instead of parametrizing(generics) for extensible class structure. +It enables you to easily extend filtering ability of container-like objects as business requirements change. + +## Tutorials +* [Article about Filterer pattern posted on it's author's blog](https://blog.tlinkowski.pl/2018/filterer-pattern/) +* [Application of Filterer pattern in domain of text analysis](https://www.javacodegeeks.com/2019/02/filterer-pattern-10-steps.html) + +## Known uses +One of the uses is present on the blog presented in this link. It presents how to use `Filterer` pattern to create text issue anaylyzer with support for test cases used for unit testing. + +## Consequences (the good and the bad, add criticism here) +Good : + * you can easily introduce new subtypes for container-like objects and subtypes for objects that are contained within them and still be able to filter easily be new properties of those new subtypes. + +Bad : + * covariant return types mixed with generics can be sometimes tricky + +## Credits +* Author of the pattern : [Tomasz Linkowski](https://tlinkowski.pl/) \ No newline at end of file diff --git a/filterer/etc/filterer.png b/filterer/etc/filterer.png new file mode 100644 index 0000000000000000000000000000000000000000..f86764aa32aa18b063105c8ab529c2d04747326c GIT binary patch literal 141773 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%0ALv#igQ8NZ|3?qHU^qD?G%J=d~i5NG+tY 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

pY19!`Gaxytl%FiSo0r1}x?B$#Xwa2HWdQ5vi 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 literal 0 HcmV?d00001 diff --git a/filterer/etc/filterer.urm.puml b/filterer/etc/filterer.urm.puml new file mode 100644 index 000000000..24060b6aa --- /dev/null +++ b/filterer/etc/filterer.urm.puml @@ -0,0 +1,132 @@ +@startuml +package com.iluwatar.filterer.domain { + interface Filterer { + + by(Predicate) : G {abstract} + } +} +package com.iluwatar.filterer.issue { + interface Issue { + + endOffset() : int {abstract} + + startOffset() : int {abstract} + + type() : IssueType {abstract} + } + interface IssueAwareText { + + filtered() : Filterer {abstract} + + issues() : List {abstract} + + text() : String {abstract} + } + class IssuePosition { + - endOffset : int + - startOffset : int + - IssuePosition(startOffset : int, endOffset : int) + ~ endOffset() : int + + equals(o : Object) : boolean + + hashCode() : int + + of(startOffset : int, endOffset : int) : IssuePosition {static} + ~ startOffset() : int + } + ~enum IssueType { + + GRAMMAR {static} + + SPELLING {static} + + valueOf(name : String) : IssueType {static} + + values() : IssueType[] {static} + } + interface IssueWiseText { + + filtered() : Filterer {abstract} + + issues() : List {abstract} + + text() : String {abstract} + } + interface ProbabilisticIssueAwareText { + + filtered() : Filterer {abstract} + + issues() : List {abstract} + } + interface ProbabilisticIssueWiseText { + + filtered() : Filterer {abstract} + + issues() : List {abstract} + } + interface ProbableIssue { + + probability() : double {abstract} + } + class SimpleIssue { + - issuePosition : IssuePosition + - issueType : IssueType + ~ SimpleIssue(issuePosition : IssuePosition, issueType : IssueType) + + endOffset() : int + + equals(o : Object) : boolean + + hashCode() : int + + startOffset() : int + + type() : IssueType + } + class SimpleIssueAwareText { + - issues : ImmutableList + - text : String + ~ SimpleIssueAwareText(text : String, issues : List) + + equals(o : Object) : boolean + + filtered() : Filterer + - filteredGroup(predicate : Predicate) : IssueAwareText + - filteredItems(predicate : Predicate) : ImmutableList + + hashCode() : int + + issues() : List + + text() : String + } + class SimpleIssueWiseText { + - issues : ImmutableList + - text : String + + SimpleIssueWiseText(text : String, issues : List) + + equals(o : Object) : boolean + + filtered() : Filterer + - filteredGroup(predicate : Predicate) : IssueWiseText + - filteredItems(predicate : Predicate) : ImmutableList + + hashCode() : int + + issues() : List + + text() : String + } + class SimpleProbabilisticIssueAwareText { + - issues : ImmutableList + - text : String + ~ SimpleProbabilisticIssueAwareText(text : String, issues : List) + + equals(o : Object) : boolean + + filtered() : Filterer + - filteredGroup(predicate : Predicate) : ProbabilisticIssueAwareText + - filteredItems(predicate : Predicate) : ImmutableList + + hashCode() : int + + issues() : List + + text() : String + } + class SimpleProbabilisticIssueWiseText { + - issues : ImmutableList + - text : String + + SimpleProbabilisticIssueWiseText(text : String, issues : List) + + equals(o : Object) : boolean + + filtered() : Filterer + - filteredGroup(predicate : Predicate) : ProbabilisticIssueWiseText + - filteredItems(predicate : Predicate) : ImmutableList + + hashCode() : int + + issues() : List + + text() : String + } + class SimpleProbableIssue { + - probability : double + ~ SimpleProbableIssue(issuePosition : IssuePosition, issueType : IssueType, probability : double) + + equals(o : Object) : boolean + + hashCode() : int + + probability() : double + } +} +SimpleIssueWiseText --> "-issues" Issue +SimpleProbabilisticIssueAwareText --> "-issues" ProbableIssue +SimpleIssue --> "-issueType" IssueType +SimpleIssueAwareText --> "-issues" Issue +SimpleProbabilisticIssueWiseText --> "-issues" ProbableIssue +SimpleIssue --> "-issuePosition" IssuePosition +ProbabilisticIssueAwareText --|> IssueAwareText +ProbabilisticIssueWiseText --|> IssueWiseText +ProbableIssue --|> Issue +SimpleIssue ..|> Issue +SimpleIssueAwareText ..|> IssueAwareText +SimpleIssueWiseText ..|> IssueWiseText +SimpleProbabilisticIssueAwareText ..|> ProbabilisticIssueAwareText +SimpleProbabilisticIssueWiseText ..|> ProbabilisticIssueWiseText +SimpleProbableIssue ..|> ProbableIssue +SimpleProbableIssue --|> SimpleIssue +@enduml \ No newline at end of file diff --git a/filterer/pom.xml b/filterer/pom.xml new file mode 100644 index 000000000..24dae571e --- /dev/null +++ b/filterer/pom.xml @@ -0,0 +1,76 @@ + + + + + java-design-patterns + com.iluwatar + 1.23.0-SNAPSHOT + + 4.0.0 + + filterer + + + + com.google.guava + guava + 29.0-jre + + + org.junit.jupiter + junit-jupiter-api + 5.6.2 + test + + + org.junit.jupiter + junit-jupiter-engine + 5.6.2 + test + + + org.assertj + assertj-core + 3.16.1 + test + + + + + + + maven-surefire-plugin + 2.22.2 + + + maven-failsafe-plugin + 2.22.2 + + + + \ No newline at end of file diff --git a/filterer/src/main/java/com/iluwatar/filterer/domain/Filterer.java b/filterer/src/main/java/com/iluwatar/filterer/domain/Filterer.java new file mode 100644 index 000000000..17970c115 --- /dev/null +++ b/filterer/src/main/java/com/iluwatar/filterer/domain/Filterer.java @@ -0,0 +1,36 @@ +/* + * The MIT License + * Copyright © 2014-2019 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.iluwatar.filterer.domain; + +import java.util.function.Predicate; + +/** + * Filterer helper interface. + * @param type of the container-like object. + * @param type of the elements contained within this container-like object. + */ +@FunctionalInterface +public interface Filterer { + G by(Predicate predicate); +} \ No newline at end of file diff --git a/filterer/src/main/java/com/iluwatar/filterer/issue/Issue.java b/filterer/src/main/java/com/iluwatar/filterer/issue/Issue.java new file mode 100644 index 000000000..957ade6e5 --- /dev/null +++ b/filterer/src/main/java/com/iluwatar/filterer/issue/Issue.java @@ -0,0 +1,49 @@ +/* + * The MIT License + * Copyright © 2014-2019 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.iluwatar.filterer.issue; + +/** + * Represents an issue that can be detected in given text. + */ +public interface Issue { + /** + * Returns starting position where the issue begins. + * + * @return value representing starting position of the issue. + */ + int startOffset(); + + /** + * Returns ending position where the issue ends. + * + * @return value representing ending position of the issue. + */ + int endOffset(); + + /** + * Returns issue type. + * @return {@link IssueType} + */ + IssueType type(); +} diff --git a/filterer/src/main/java/com/iluwatar/filterer/issue/IssueAwareText.java b/filterer/src/main/java/com/iluwatar/filterer/issue/IssueAwareText.java new file mode 100644 index 000000000..8141ae849 --- /dev/null +++ b/filterer/src/main/java/com/iluwatar/filterer/issue/IssueAwareText.java @@ -0,0 +1,55 @@ +/* + * The MIT License + * Copyright © 2014-2019 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.iluwatar.filterer.issue; + +import com.iluwatar.filterer.domain.Filterer; + +import java.util.List; + +/** + * Represents text that is aware of issues that are present in it. + */ +public interface IssueAwareText { + + /** + * Returns the analyzed text. + * + * @return the analyzed text. + */ + String text(); + + /** + * Returns list of issues for this text. + * @return list of issues for this text. + */ + List issues(); + + /** + * Returns the instance of {@link Filterer} helper interface that allows to covariantly + * specify lower bound for predicate that we want to filter by. + * @return an instance of {@link Filterer} helper interface. + */ + Filterer filtered(); + +} diff --git a/filterer/src/main/java/com/iluwatar/filterer/issue/IssuePosition.java b/filterer/src/main/java/com/iluwatar/filterer/issue/IssuePosition.java new file mode 100644 index 000000000..a771c1a82 --- /dev/null +++ b/filterer/src/main/java/com/iluwatar/filterer/issue/IssuePosition.java @@ -0,0 +1,76 @@ +/* + * The MIT License + * Copyright © 2014-2019 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.iluwatar.filterer.issue; + +import java.util.Objects; + +/** + * Represents position of an issue. Takes starting and ending offset of issue in given text. + */ +public final class IssuePosition { + + private final int startOffset; + private final int endOffset; + + /** + * Factory method for constructing `IssuePosition` instances. + * @param startOffset starting offset of where the issue begins. + * @param endOffset ending offset of where the issue ends. + * @return new IssuePosition instance. + */ + public static IssuePosition of(final int startOffset, final int endOffset) { + return new IssuePosition(startOffset, endOffset); + } + + private IssuePosition(int startOffset, int endOffset) { + this.startOffset = startOffset; + this.endOffset = endOffset; + } + + int startOffset() { + return startOffset; + } + + int endOffset() { + return endOffset; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + IssuePosition that = (IssuePosition) o; + return startOffset == that.startOffset + && endOffset == that.endOffset; + } + + @Override + public int hashCode() { + return Objects.hash(startOffset, endOffset); + } +} diff --git a/filterer/src/main/java/com/iluwatar/filterer/issue/IssueType.java b/filterer/src/main/java/com/iluwatar/filterer/issue/IssueType.java new file mode 100644 index 000000000..ee2c12ce5 --- /dev/null +++ b/filterer/src/main/java/com/iluwatar/filterer/issue/IssueType.java @@ -0,0 +1,26 @@ +/* + * The MIT License + * Copyright © 2014-2019 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.iluwatar.filterer.issue; + +enum IssueType { GRAMMAR, SPELLING } diff --git a/filterer/src/main/java/com/iluwatar/filterer/issue/ProbabilisticIssueAwareText.java b/filterer/src/main/java/com/iluwatar/filterer/issue/ProbabilisticIssueAwareText.java new file mode 100644 index 000000000..da15bdd99 --- /dev/null +++ b/filterer/src/main/java/com/iluwatar/filterer/issue/ProbabilisticIssueAwareText.java @@ -0,0 +1,49 @@ +/* + * The MIT License + * Copyright © 2014-2019 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.iluwatar.filterer.issue; + +import com.iluwatar.filterer.domain.Filterer; + +import java.util.List; + +/** + * Represents text that is aware of it's issues with given probability of their occurrence. + */ +public interface ProbabilisticIssueAwareText extends IssueAwareText { + + /** + * {@inheritDoc} + * @return + */ + @Override + List issues(); + + /** + * {@inheritDoc} + * @return + */ + @Override + Filterer filtered(); +} + diff --git a/filterer/src/main/java/com/iluwatar/filterer/issue/ProbableIssue.java b/filterer/src/main/java/com/iluwatar/filterer/issue/ProbableIssue.java new file mode 100644 index 000000000..ccb047fa4 --- /dev/null +++ b/filterer/src/main/java/com/iluwatar/filterer/issue/ProbableIssue.java @@ -0,0 +1,35 @@ +/* + * The MIT License + * Copyright © 2014-2019 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.iluwatar.filterer.issue; + +/** + * Represents issue that is an issue with given probability. + */ +public interface ProbableIssue extends Issue { + /** + * Returns probability of occurrence of given issue. + * @return probability of occurrence of given issue. + */ + double probability(); +} \ No newline at end of file diff --git a/filterer/src/main/java/com/iluwatar/filterer/issue/SimpleIssue.java b/filterer/src/main/java/com/iluwatar/filterer/issue/SimpleIssue.java new file mode 100644 index 000000000..fde5b8d8e --- /dev/null +++ b/filterer/src/main/java/com/iluwatar/filterer/issue/SimpleIssue.java @@ -0,0 +1,79 @@ +/* + * The MIT License + * Copyright © 2014-2019 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.iluwatar.filterer.issue; + +import java.util.Objects; + +public class SimpleIssue implements Issue { + + private final IssuePosition issuePosition; + private final IssueType issueType; + + SimpleIssue(final IssuePosition issuePosition, IssueType issueType) { + this.issuePosition = issuePosition; + this.issueType = issueType; + } + + /** + * {@inheritDoc} + */ + @Override + public int startOffset() { + return issuePosition.startOffset(); + } + + /** + * {@inheritDoc} + */ + @Override + public int endOffset() { + return issuePosition.endOffset(); + } + + /** + * {@inheritDoc} + */ + @Override + public IssueType type() { + return issueType; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + SimpleIssue that = (SimpleIssue) o; + return issuePosition.equals(that.issuePosition) + && issueType == that.issueType; + } + + @Override + public int hashCode() { + return Objects.hash(issuePosition, issueType); + } +} diff --git a/filterer/src/main/java/com/iluwatar/filterer/issue/SimpleIssueAwareText.java b/filterer/src/main/java/com/iluwatar/filterer/issue/SimpleIssueAwareText.java new file mode 100644 index 000000000..c654a3aaa --- /dev/null +++ b/filterer/src/main/java/com/iluwatar/filterer/issue/SimpleIssueAwareText.java @@ -0,0 +1,98 @@ +/* + * The MIT License + * Copyright © 2014-2019 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.iluwatar.filterer.issue; + +import com.google.common.collect.ImmutableList; +import com.iluwatar.filterer.domain.Filterer; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.function.Predicate; + +/** + * {@inheritDoc} + */ +public class SimpleIssueAwareText implements IssueAwareText { + + private final String text; + private final ImmutableList issues; + + SimpleIssueAwareText(final String text, final List issues) { + this.text = text; + this.issues = ImmutableList.copyOf(issues); + } + + /** + * {@inheritDoc} + */ + @Override + public String text() { + return text; + } + + /** + * {@inheritDoc} + */ + @Override + public List issues() { + return new ArrayList<>(issues); + } + + /** + * {@inheritDoc} + */ + @Override + public Filterer filtered() { + return this::filteredGroup; + } + + private IssueAwareText filteredGroup(Predicate predicate) { + return new SimpleIssueAwareText(this.text, filteredItems(predicate)); + } + + private ImmutableList filteredItems(Predicate predicate) { + return this.issues.stream() + .filter(predicate) + .collect(ImmutableList.toImmutableList()); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + SimpleIssueAwareText that = (SimpleIssueAwareText) o; + return text.equals(that.text) + && issues.equals(that.issues); + } + + @Override + public int hashCode() { + return Objects.hash(text, issues); + } +} diff --git a/filterer/src/main/java/com/iluwatar/filterer/issue/SimpleProbabilisticIssueAwareText.java b/filterer/src/main/java/com/iluwatar/filterer/issue/SimpleProbabilisticIssueAwareText.java new file mode 100644 index 000000000..e1b4afc82 --- /dev/null +++ b/filterer/src/main/java/com/iluwatar/filterer/issue/SimpleProbabilisticIssueAwareText.java @@ -0,0 +1,101 @@ +/* + * The MIT License + * Copyright © 2014-2019 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.iluwatar.filterer.issue; + +import com.google.common.collect.ImmutableList; +import com.iluwatar.filterer.domain.Filterer; + +import java.util.List; +import java.util.Objects; +import java.util.function.Predicate; + +/** + * {@inheritDoc} + */ +public class SimpleProbabilisticIssueAwareText implements ProbabilisticIssueAwareText { + + private final String text; + private final ImmutableList issues; + + SimpleProbabilisticIssueAwareText(final String text, final List issues) { + this.text = text; + this.issues = ImmutableList.copyOf(issues); + } + + /** + * {@inheritDoc} + */ + @Override + public String text() { + return text; + } + + /** + * {@inheritDoc} + */ + @Override + public List issues() { + return issues; + } + + /** + * {@inheritDoc} + */ + @Override + public Filterer filtered() { + return this::filteredGroup; + } + + private ProbabilisticIssueAwareText filteredGroup( + final Predicate predicate + ) { + return new SimpleProbabilisticIssueAwareText(this.text, filteredItems(predicate)); + } + + private ImmutableList filteredItems( + final Predicate predicate + ) { + return this.issues.stream() + .filter(predicate) + .collect(ImmutableList.toImmutableList()); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + SimpleProbabilisticIssueAwareText that = (SimpleProbabilisticIssueAwareText) o; + return text.equals(that.text) + && issues.equals(that.issues); + } + + @Override + public int hashCode() { + return Objects.hash(text, issues); + } +} diff --git a/filterer/src/main/java/com/iluwatar/filterer/issue/SimpleProbableIssue.java b/filterer/src/main/java/com/iluwatar/filterer/issue/SimpleProbableIssue.java new file mode 100644 index 000000000..2b7672256 --- /dev/null +++ b/filterer/src/main/java/com/iluwatar/filterer/issue/SimpleProbableIssue.java @@ -0,0 +1,70 @@ +/* + * The MIT License + * Copyright © 2014-2019 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.iluwatar.filterer.issue; + +import java.util.Objects; + +/** + * {@inheritDoc} + */ +public class SimpleProbableIssue extends SimpleIssue implements ProbableIssue { + + private final double probability; + + SimpleProbableIssue(final IssuePosition issuePosition, + final IssueType issueType, + final double probability + ) { + super(issuePosition, issueType); + this.probability = probability; + } + + /** + * {@inheritDoc} + */ + @Override + public double probability() { + return probability; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + if (!super.equals(o)) { + return false; + } + SimpleProbableIssue that = (SimpleProbableIssue) o; + return Double.compare(that.probability, probability) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), probability); + } +} diff --git a/filterer/src/test/java/com/iluwatar/filterer/issue/SimpleIssueAwareTextTest.java b/filterer/src/test/java/com/iluwatar/filterer/issue/SimpleIssueAwareTextTest.java new file mode 100644 index 000000000..1278128ae --- /dev/null +++ b/filterer/src/test/java/com/iluwatar/filterer/issue/SimpleIssueAwareTextTest.java @@ -0,0 +1,52 @@ +/* + * The MIT License + * Copyright © 2014-2019 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.iluwatar.filterer.issue; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class SimpleIssueAwareTextTest { + + @Test + void shouldFilterByStartOffset() { + //given + SimpleIssue spellingIssue = new SimpleIssue(IssuePosition.of(4, 5), IssueType.SPELLING); + SimpleIssue grammarIssue = new SimpleIssue(IssuePosition.of(8, 12), IssueType.GRAMMAR); + List issues = List.of(spellingIssue, grammarIssue); + + SimpleIssueAwareText simpleIssueWiseText = new SimpleIssueAwareText("I mihgt gone there", issues); + + //when + IssueAwareText filtered = simpleIssueWiseText.filtered() + .by(issue1 -> issue1.startOffset() == 4); + + //then + assertThat(filtered.issues()).hasSize(1); + assertThat(filtered.issues()).element(0).isEqualTo(spellingIssue); + } + +} diff --git a/filterer/src/test/java/com/iluwatar/filterer/issue/SimpleProbabilisticIssueAwareTextTest.java b/filterer/src/test/java/com/iluwatar/filterer/issue/SimpleProbabilisticIssueAwareTextTest.java new file mode 100644 index 000000000..142415111 --- /dev/null +++ b/filterer/src/test/java/com/iluwatar/filterer/issue/SimpleProbabilisticIssueAwareTextTest.java @@ -0,0 +1,52 @@ +/* + * The MIT License + * Copyright © 2014-2019 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.iluwatar.filterer.issue; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class SimpleProbabilisticIssueAwareTextTest { + + @Test + void shouldFilterByProbability() { + //given + ProbableIssue spellingIssue = new SimpleProbableIssue(IssuePosition.of(4, 5), IssueType.SPELLING, 100); + ProbableIssue grammarIssue = new SimpleProbableIssue(IssuePosition.of(8, 12), IssueType.GRAMMAR, 99); + List issues = List.of(spellingIssue, grammarIssue); + + SimpleProbabilisticIssueAwareText simpleIssueWiseText = new SimpleProbabilisticIssueAwareText("I mihgt gone there", issues); + + //when + ProbabilisticIssueAwareText filtered = simpleIssueWiseText.filtered() + .by(issue1 -> Double.compare(issue1.probability(), 99) == 0); + + //then + assertThat(filtered.issues()).hasSize(1); + assertThat(filtered.issues()).element(0).isEqualTo(grammarIssue); + } + +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 0718ff045..1e34bcb67 100644 --- a/pom.xml +++ b/pom.xml @@ -193,6 +193,7 @@ strangler arrange-act-assert transaction-script + filterer