<?xml version="1.0"?>
<puzzles xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.0pdd.com/puzzles.xsd" date="2026-01-01T09:59:28+00:00" version="BUILD">
  <puzzle alive="false">
    <issue href="https://github.com/cqfn/jpeek/issues/494" closed="2025-09-07T05:55:13+00:00">494</issue>
    <ticket>452</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>452-fc6e85e0</id>
    <lines>48-50</lines>
    <body>Improve how to use section on README.md How to Use section must be improved; we need to explain the many parameters that jpeek jar accepts and the default values for each parameter.</body>
    <file>README.md</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/495">495</issue>
    <ticket>120</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>120-5199fe22</id>
    <lines>42-44</lines>
    <body>TCC: inclusion of inherited attributes and methods in the analysis should be configurable. Come back here after #187 is fixed and adjust the xpath for `attrs` and `methods` accordingly.</body>
    <file>src/main/resources/org/jpeek/metrics/TCC.xsl</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/496">496</issue>
    <ticket>120</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>120-7c3cf0d4</id>
    <lines>48-49</lines>
    <body>TCC: this metric needs to exclude private methods from the analysis. Adjust the xpath for `methods` accordingly after #188 is fixed.</body>
    <file>src/main/resources/org/jpeek/metrics/TCC.xsl</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/497">497</issue>
    <ticket>216</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>216-5540d942</id>
    <lines>67-71</lines>
    <body>LCOM4: "NotCommonAttributesWithAllArgsConstructor" test now fails. Constructor with all attributes parameters should not affect LCOM4 metric. So LCOM4.xsl needs to be fixed in order to avoid constructors affection to the metric values. "NotCommonAttributesWithAllArgsConstructor" test case must be added into collection returning by the targets() in the MetricsTest.java when this puzzle done.</body>
    <file>src/main/resources/org/jpeek/metrics/LCOM4.xsl</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/498">498</issue>
    <ticket>64</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>64-b6d7d67d</id>
    <lines>66-69</lines>
    <body>Implement the C3 method according to the description above. The variable names and comments have to be extracted into a set of words. JPeek core will have to provide all comments for each method so words can be extracted and LSI calculated for each method.</body>
    <file>src/main/resources/org/jpeek/metrics/C3.xsl</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/499">499</issue>
    <ticket>65</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>65-657d930a</id>
    <lines>51-53</lines>
    <body>TLCOM: we are including access to ALL fields here. After #156 is fixed, come back and refactor xpath for $Ms_that_use_attrs, $left_attrs, and $right_attrs in order to avoid including access to fields belonging to other classes.</body>
    <file>src/main/resources/org/jpeek/metrics/TLCOM.xsl</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/500">500</issue>
    <ticket>65</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>65-8529ead1</id>
    <lines>79-83</lines>
    <body>TLCOM: need to establish transitive connections between methods with arbitrarily long chains of method calls between them. Right now, this code can establish transitive connections to a max depth of 3 levels, ie up to something like this: m1 calls m2 calls m3 which uses a3 therefore m1 is connected to m3. It will miss connections in longer chains. After fixing this, maybe we can add it to the standard metrics in App.</body>
    <file>src/main/resources/org/jpeek/metrics/TLCOM.xsl</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/cqfn/jpeek/issues/501" closed="2025-09-07T05:55:14+00:00">501</issue>
    <ticket>65</ticket>
    <estimate>15</estimate>
    <role>DEV</role>
    <id>65-76f12f4d</id>
    <lines>86-87</lines>
    <body>TLCOM: add test for OneMethodCreatesLambda after #171 is fixed. The extra synthetic method introduced by the compiler distorts this metric's result.</body>
    <file>src/main/resources/org/jpeek/metrics/TLCOM.xsl</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/502">502</issue>
    <ticket>111</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>111-5690cd5a</id>
    <lines>27-36</lines>
    <body>LORM: figure out how to extract the concepts from each method of a class and then measure their "dispersal": how far apart they are semantically speaking. This would be the same as asking "to what degree are these methods talking about the same things?". Based on a couple of supporting papers that I added to this ticket (here: https://github.com/yegor256/jpeek/issues/111#issuecomment-365651455), I believe the way forward is to use Latent Semantic Indexing of the methods of the class and see how close or synonymous they are with the concept expressed in the class name itself. There seem to be a few java libraries available for latent semantic indexing that we can use.</body>
    <file>src/main/resources/org/jpeek/metrics/LORM.xsl</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/503">503</issue>
    <ticket>112</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>112-f7b740c5</id>
    <lines>74-95</lines>
    <body>Implement natural language processing techniques to analyze conceptual similarity of methods. Two methods have a `conceptual-relation` if they contain at least one same `concept`. `concepts` are identified by semantic processing of the class/method, as being associated in the knowledge-base with that class/method (original paper in /papers/etzkorn00.pdf). The original paper does not explicitly define the implementation of semantic processing, or which NLP methods are being used, but it is a knowledge-based system, which means that additional input must inserted into the LORM method - that is, a set of possible concepts - which are then recognized in a particular method/piece of code. This set of possible concepts depends on the `domain` that the class is in. One way of interpreting what the `domain` is (this is not defined in the original paper), is the business domain the class is used for. Another definition of `domain` also comes to mind - the programming language being used. Concepts could be defined as all reserved Java keywords and "semantic processing" recognizes which reserved keywords are used in a particular method. Hence, if two methods use same reserved keywords, they have a `conceptual-relation`. Using this definition would require no additional input by the user of the LORM method. Right now it is stubbed because NLP/semantic processing is not implemented yet.k Ensure that JPeek core implements these techniques, collects information on such relations and unstub the lines commented below.</body>
    <file>src/main/resources/org/jpeek/metrics/LORM.xsl</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/cqfn/jpeek/issues/504" closed="2025-09-07T05:55:16+00:00">504</issue>
    <ticket>119</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>119-5f1c56e0</id>
    <lines>63-69</lines>
    <body>`indirectly-related-pairs` are pairs of methods, which are connected through `directly-related-pairs`. See section 3.1 of https://pdfs.semanticscholar.org/672e/de6e3e600eafd84036a0b983b88e481ac626.pdf The key sentence is "The indirect connection relation is the **transitive closure** of direct connection relation". See https://en.wikipedia.org/wiki/Transitive_closure for more info on what is a Transitive Closure. We need to apply a Transitive Closure Algorithm on a graph of `directly-related-pairs`. A simpliest Transitive Closure algorithms has O(V&#xB3;) time complexity and involves a mutable V&#xD7;V table (V is amount of vertices). See https://www.geeksforgeeks.org/transitive-closure-of-a-graph/ for an example.</body>
    <file>src/main/resources/org/jpeek/metrics/LCC.xsl</file>
    <author>yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/cqfn/jpeek/issues/505" closed="2025-09-07T05:55:18+00:00">505</issue>
    <ticket>134</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>134-3180ea38</id>
    <lines>26-28</lines>
    <body>Matrix.xsd: add `xsd:documentation` tags as per issue #134. We need to document the schemas in src/resources/org/jpeek/xsd so that the semantics of the generated XML documents is transparent for maintainers.</body>
    <file>src/main/resources/org/jpeek/xsd/matrix.xsd</file>
    <author>yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/cqfn/jpeek/issues/506" closed="2025-09-07T05:55:19+00:00">506</issue>
    <ticket>452</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>452-6485f2e2</id>
    <lines>138-141</lines>
    <body>Extract report building Analyze method is too big. We need to extract report building from here and use a map instead of if statements se we can make easier to add and remove metrics from execution.</body>
    <file>src/main/java/org/jpeek/App.java</file>
    <author>yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/507">507</issue>
    <ticket>227</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>227-fbf042c2</id>
    <lines>174-179</lines>
    <body>Add a test to check whether passing params to XSLDocument really works. Currently only C3 metric template is known to use parameter named 'ctors'. However C3.xsl is a work in progress and has impediments, see #175. In case the parameter becomes obsolete, consider simplifying construction of XSLDocument without params (see reviews to #326).</body>
    <file>src/main/java/org/jpeek/XslReport.java</file>
    <author>yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/508">508</issue>
    <ticket>114</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>114-7bfa1f3a</id>
    <lines>132-143</lines>
    <body>Find and include the name of the variable the method is called on, if possible. Currently, only the name of called method is retrieved. This is currently implemented in `visitMethodInsn` down below. Example 1: `Bar.NAME.length();` - Here, `length` is retrieved from the method `visitMethodInsn`'s - param `name`, but the word `NAME` itself is not included in any of - the `visitMethodInsn` arguments. Example 2: `src.length();` - Here, `length` is retrieved from the method `visitMethodInsn`'s - param `name` but the word `src` itself is not included in any of - the `visitMethodInsn` arguments.</body>
    <file>src/main/java/org/jpeek/skeleton/XmlClass.java</file>
    <author>yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/509">509</issue>
    <ticket>473</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>473-a79b4155</id>
    <lines>38-41</lines>
    <body>Find a way to eliminate this ClassDataAbstractionCouplingCheck. The class probably needs to be split into smaller ones, perhaps extracting the maps into separate objects (extending MapEnvelopes), or maybe the list itself.</body>
    <file>src/main/java/org/jpeek/graph/XmlGraph.java</file>
    <author>yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/510">510</issue>
    <ticket>412</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>412-3d565676</id>
    <lines>33-38</lines>
    <body>We start implementing LCOM4Calculus implementation. We should continue calculating real 'class@value' and 'class/vars/var[@id=pairs]/text' values and remove @Disabled annotation on all Lcom4CalculusTest class. If we choose to calculate LCOM4 with Java only we should also remove LCOM4.xsl part that is doing the calculus and let the xsl here just to build the structure of the xml result. This part is especially the one calculating "xsl:variable name='E'" L73-&gt;L89, and the one doing the division L97 -&gt; L99</body>
    <file>src/main/java/org/jpeek/calculus/Calculus.java</file>
    <author>yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/511">511</issue>
    <ticket>449</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>449-96cd40b8</id>
    <lines>39-50</lines>
    <body>The `node` method in this interface was designed with only XSL implementation in mind - it uses the `metric` parameter to select the XSL file and uses that file to transform the `skeleton`. This makes Java based implementations a little awkward because the `metric` parameter becomes redundant: there is a Java implementation for each metric, and these implementations already know which metric they are for. The question becomes - how to select correct java implementation for a given metric and integrate it seamlessly with XSL calculus in `XslReport`. One option could be removing the `metric` parameter from the method and injecting a Calculus for a concrete metric in `XslReport` directly. Another could be implementing Chain Of Responsibility pattern. Decide on the best way to integrate Java based Calculus with XSL based Calculus in `XslReport` and implement it.</body>
    <file>src/main/java/org/jpeek/calculus/Calculus.java</file>
    <author>yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/512">512</issue>
    <ticket>449</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>449-dd12396b</id>
    <lines>88-94</lines>
    <body>Implement NCC calculation with `XmlGraph` and use this class to fix CCM metric (see issue #449). To do this, this class, once it works correctly, should be integrated with XSL based calculuses in `XslReport` (see `todo #449` in Calculus). Write a test to make sure the metric is calculated correctly. Also, decide whether the whole CCM metric should be implemented in Java, or only the NCC part. Update this `todo` accordingly.</body>
    <file>src/main/java/org/jpeek/calculus/java/Ccm.java</file>
    <author>yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/513">513</issue>
    <ticket>68</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>68-6427b294</id>
    <lines>37-40</lines>
    <body>SCOM has an impediment on issue #103: cannot currently be tested in MetricsTest when the resulting value is "NaN". Affected tests are: NoMethods, OneVoidMethodWithoutParams, WithoutAttributes, OneMethodCreatesLambda.</body>
    <file>src/test/java/org/jpeek/MetricsTest.java</file>
    <author>yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/514">514</issue>
    <ticket>118</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>118-aa952a15</id>
    <lines>47-51</lines>
    <body>Add test for LCC with "IndirectlyRelatedPairs" and others. In "IndirectlyRelatedPairs" all methods exist in one transitive closure, so the result should be {@code 1d}. Also, all classes without transitive relations should have the same LCC metric as TCC metric. Before do it we have to fix puzzles in LCC.xml.</body>
    <file>src/test/java/org/jpeek/MetricsTest.java</file>
    <author>yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/515">515</issue>
    <ticket>437</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>437-43230a3b</id>
    <lines>52-61</lines>
    <body>Skeleton structure has changed in #437, and therefore some xsl metrics calculus are in error or give bad results. Fix the corresponding xslt files and then reput these expected results in metricstest-params.csv MethodsWithDiffParamTypes,CCM,0.0667d MethodsWithDiffParamTypes,SCOM,0.2381d OverloadMethods,SCOM,0.75d TwoCommonAttributes,TLCOM,4.0d Bar,CCM,0.2222d TwoCommonMethods,CCM,0.0333d TwoCommonMethods,LORM,0.26667d</body>
    <file>src/test/java/org/jpeek/MetricsTest.java</file>
    <author>yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/516">516</issue>
    <ticket>415</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>415-1e78bb53</id>
    <lines>74-77</lines>
    <body>LCOM4: Graph algorithm to determine disjoint sets. Disjoint sets calculus is now implemented. We should continue calculating LCOM4 metrics (probably you should wait for #413, #403. After implementing, remove the @Disabled from the below test too.</body>
    <file>src/test/java/org/jpeek/metrics/Lcom4Test.java</file>
    <author>yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2021-02-05T05:47:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/570">570</issue>
    <ticket>119</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>119-e522f2bb</id>
    <lines>44-50</lines>
    <body>`indirectly-related-pairs` are pairs of methods, which are connected through `directly-related-pairs`. See section 3.1 of https://pdfs.semanticscholar.org/672e/de6e3e600eafd84036a0b983b88e481ac626.pdf The key sentence is "The indirect connection relation is the **transitive closure** of direct connection relation". See https://en.wikipedia.org/wiki/Transitive_closure for more info on what is a Transitive Closure. We need to apply a Transitive Closure Algorithm on a graph of `directly-related-pairs`. A simplest Transitive Closure algorithms has O(V&#xB3;) time complexity and involves a mutable V&#xD7;V table (V is amount of vertices). See https://www.geeksforgeeks.org/transitive-closure-of-a-graph/ for an example.</body>
    <file>src/main/resources/org/jpeek/metrics/LCC.xsl</file>
    <author>Yegor Bugayenko</author>
    <email>yegor256@gmail.com</email>
    <time>2025-09-07T05:54:59Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/571">571</issue>
    <ticket>522</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>522-5ca0c258</id>
    <lines>72-75</lines>
    <body>there is a 4th step for incorrect calculation: nc in case of calling one method from another because of `xsl:if test="$method/ops/op/text()[. = $other/ops/op/text()]"` method name is not used for creating edge.</body>
    <file>src/test/java/org/jpeek/metrics/CcmTest.java</file>
    <author>Yegor Bugayenko</author>
    <email>yegor256@gmail.com</email>
    <time>2025-09-07T05:54:59Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/cqfn/jpeek/issues/572">572</issue>
    <ticket>535</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>535-cc53a61c</id>
    <lines>24-26</lines>
    <body>renderOneReport is not stable on checking /shutdown endpoint Increasing timeout does not help, problem should be investigated and response validation returned back</body>
    <file>src/test/java/org/jpeek/web/TkAppTest.java</file>
    <author>Yegor Bugayenko</author>
    <email>yegor256@gmail.com</email>
    <time>2025-09-07T05:54:59Z</time>
    <children/>
  </puzzle>
</puzzles>
