commit
4d29d5ddcd
|
@ -1,3 +1,4 @@
|
||||||
|
**UPDATE**: The price of "Learn Spring Security OAuth" will permanently change on the 11th of December, along with the upcoming OAuth2 material: http://bit.ly/github-lss
|
||||||
|
|
||||||
The Courses
|
The Courses
|
||||||
==============================
|
==============================
|
||||||
|
|
|
@ -1,47 +1,46 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project
|
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>akka-http</artifactId>
|
||||||
|
<name>akka-http</name>
|
||||||
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<parent>
|
||||||
<artifactId>akka-http</artifactId>
|
<groupId>com.baeldung</groupId>
|
||||||
<name>akka-http</name>
|
<artifactId>parent-modules</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
<parent>
|
<dependencies>
|
||||||
<artifactId>parent-modules</artifactId>
|
<dependency>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.typesafe.akka</groupId>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
<artifactId>akka-http_2.12</artifactId>
|
||||||
</parent>
|
<version>${akka.http.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.typesafe.akka</groupId>
|
||||||
|
<artifactId>akka-stream_2.12</artifactId>
|
||||||
|
<version>${akka.stream.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.typesafe.akka</groupId>
|
||||||
|
<artifactId>akka-http-jackson_2.12</artifactId>
|
||||||
|
<version>${akka.http.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.typesafe.akka</groupId>
|
||||||
|
<artifactId>akka-http-testkit_2.12</artifactId>
|
||||||
|
<version>${akka.http.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
<dependencies>
|
<properties>
|
||||||
<dependency>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<groupId>com.typesafe.akka</groupId>
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
<artifactId>akka-http_2.12</artifactId>
|
<akka.http.version>10.0.11</akka.http.version>
|
||||||
<version>${akka.http.version}</version>
|
<akka.stream.version>2.5.11</akka.stream.version>
|
||||||
</dependency>
|
</properties>
|
||||||
<dependency>
|
|
||||||
<groupId>com.typesafe.akka</groupId>
|
|
||||||
<artifactId>akka-stream_2.12</artifactId>
|
|
||||||
<version>${akka.stream.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.typesafe.akka</groupId>
|
|
||||||
<artifactId>akka-http-jackson_2.12</artifactId>
|
|
||||||
<version>${akka.http.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.typesafe.akka</groupId>
|
|
||||||
<artifactId>akka-http-testkit_2.12</artifactId>
|
|
||||||
<version>${akka.http.version}</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
|
||||||
<akka.http.version>10.0.11</akka.http.version>
|
|
||||||
<akka.stream.version>2.5.11</akka.stream.version>
|
|
||||||
</properties>
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>akka-streams</artifactId>
|
<artifactId>akka-streams</artifactId>
|
||||||
<name>akka-streams</name>
|
<name>akka-streams</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<artifactId>parent-modules</artifactId>
|
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-modules</artifactId>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>algorithms-genetic</artifactId>
|
<artifactId>algorithms-genetic</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
<name>algorithms-genetic</name>
|
<name>algorithms-genetic</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>parent-modules</artifactId>
|
<artifactId>parent-modules</artifactId>
|
||||||
|
@ -60,5 +61,4 @@
|
||||||
<commons-codec.version>1.11</commons-codec.version>
|
<commons-codec.version>1.11</commons-codec.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -7,8 +7,6 @@ This module contains articles about algorithms. Some classes of algorithms, e.g.
|
||||||
|
|
||||||
- [Validating Input With Finite Automata in Java](https://www.baeldung.com/java-finite-automata)
|
- [Validating Input With Finite Automata in Java](https://www.baeldung.com/java-finite-automata)
|
||||||
- [Example of Hill Climbing Algorithm](https://www.baeldung.com/java-hill-climbing-algorithm)
|
- [Example of Hill Climbing Algorithm](https://www.baeldung.com/java-hill-climbing-algorithm)
|
||||||
- [Monte Carlo Tree Search for Tic-Tac-Toe Game](https://www.baeldung.com/java-monte-carlo-tree-search)
|
|
||||||
- [Binary Search Algorithm in Java](https://www.baeldung.com/java-binary-search)
|
|
||||||
- [Introduction to Minimax Algorithm](https://www.baeldung.com/java-minimax-algorithm)
|
- [Introduction to Minimax Algorithm](https://www.baeldung.com/java-minimax-algorithm)
|
||||||
- [How to Calculate Levenshtein Distance in Java?](https://www.baeldung.com/java-levenshtein-distance)
|
- [How to Calculate Levenshtein Distance in Java?](https://www.baeldung.com/java-levenshtein-distance)
|
||||||
- [How to Find the Kth Largest Element in Java](https://www.baeldung.com/java-kth-largest-element)
|
- [How to Find the Kth Largest Element in Java](https://www.baeldung.com/java-kth-largest-element)
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>algorithms-miscellaneous-1</artifactId>
|
<artifactId>algorithms-miscellaneous-1</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
<name>algorithms-miscellaneous-1</name>
|
<name>algorithms-miscellaneous-1</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>parent-modules</artifactId>
|
<artifactId>parent-modules</artifactId>
|
||||||
|
@ -43,7 +44,7 @@
|
||||||
<groupId>com.github.dpaukov</groupId>
|
<groupId>com.github.dpaukov</groupId>
|
||||||
<artifactId>combinatoricslib3</artifactId>
|
<artifactId>combinatoricslib3</artifactId>
|
||||||
<version>${combinatoricslib3.version}</version>
|
<version>${combinatoricslib3.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>algorithms-miscellaneous-2</artifactId>
|
<artifactId>algorithms-miscellaneous-2</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
@ -34,9 +35,9 @@
|
||||||
<version>${org.jgrapht.core.version}</version>
|
<version>${org.jgrapht.core.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jgrapht</groupId>
|
<groupId>org.jgrapht</groupId>
|
||||||
<artifactId>jgrapht-ext</artifactId>
|
<artifactId>jgrapht-ext</artifactId>
|
||||||
<version>${org.jgrapht.ext.version}</version>
|
<version>${org.jgrapht.ext.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>pl.allegro.finance</groupId>
|
<groupId>pl.allegro.finance</groupId>
|
||||||
|
|
|
@ -14,8 +14,6 @@ This module contains articles about algorithms. Some classes of algorithms, e.g.
|
||||||
- [A Guide to the Folding Technique in Java](https://www.baeldung.com/folding-hashing-technique)
|
- [A Guide to the Folding Technique in Java](https://www.baeldung.com/folding-hashing-technique)
|
||||||
- [Creating a Triangle with for Loops in Java](https://www.baeldung.com/java-print-triangle)
|
- [Creating a Triangle with for Loops in Java](https://www.baeldung.com/java-print-triangle)
|
||||||
- [Efficient Word Frequency Calculator in Java](https://www.baeldung.com/java-word-frequency)
|
- [Efficient Word Frequency Calculator in Java](https://www.baeldung.com/java-word-frequency)
|
||||||
- [Interpolation Search in Java](https://www.baeldung.com/java-interpolation-search)
|
|
||||||
- [The K-Means Clustering Algorithm in Java](https://www.baeldung.com/java-k-means-clustering-algorithm)
|
- [The K-Means Clustering Algorithm in Java](https://www.baeldung.com/java-k-means-clustering-algorithm)
|
||||||
- [Creating a Custom Annotation in Java](https://www.baeldung.com/java-custom-annotation)
|
- [Creating a Custom Annotation in Java](https://www.baeldung.com/java-custom-annotation)
|
||||||
- [Breadth-First Search Algorithm in Java](https://www.baeldung.com/java-breadth-first-search)
|
|
||||||
- More articles: [[<-- prev]](/algorithms-miscellaneous-2) [[next -->]](/algorithms-miscellaneous-4)
|
- More articles: [[<-- prev]](/algorithms-miscellaneous-2) [[next -->]](/algorithms-miscellaneous-4)
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
@ -91,4 +92,5 @@
|
||||||
<jmh-core.version>1.19</jmh-core.version>
|
<jmh-core.version>1.19</jmh-core.version>
|
||||||
<jmh-generator.version>1.19</jmh-generator.version>
|
<jmh-generator.version>1.19</jmh-generator.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -5,10 +5,10 @@ This module contains articles about algorithms. Some classes of algorithms, e.g.
|
||||||
### Relevant articles:
|
### Relevant articles:
|
||||||
|
|
||||||
- [Multi-Swarm Optimization Algorithm in Java](https://www.baeldung.com/java-multi-swarm-algorithm)
|
- [Multi-Swarm Optimization Algorithm in Java](https://www.baeldung.com/java-multi-swarm-algorithm)
|
||||||
- [String Search Algorithms for Large Texts](https://www.baeldung.com/java-full-text-search-algorithms)
|
|
||||||
- [Check If a String Contains All The Letters of The Alphabet](https://www.baeldung.com/java-string-contains-all-letters)
|
- [Check If a String Contains All The Letters of The Alphabet](https://www.baeldung.com/java-string-contains-all-letters)
|
||||||
- [Find the Middle Element of a Linked List](https://www.baeldung.com/java-linked-list-middle-element)
|
- [Find the Middle Element of a Linked List](https://www.baeldung.com/java-linked-list-middle-element)
|
||||||
- [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings)
|
- [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings)
|
||||||
- [Find the Longest Substring without Repeating Characters](https://www.baeldung.com/java-longest-substring-without-repeated-characters)
|
- [Find the Longest Substring without Repeating Characters](https://www.baeldung.com/java-longest-substring-without-repeated-characters)
|
||||||
- [Permutations of an Array in Java](https://www.baeldung.com/java-array-permutations)
|
- [Permutations of an Array in Java](https://www.baeldung.com/java-array-permutations)
|
||||||
|
- [Find the Smallest Missing Integer in an Array](https://www.baeldung.com/java-smallest-missing-integer-in-array)
|
||||||
- More articles: [[<-- prev]](/algorithms-miscellaneous-3) [[next -->]](/algorithms-miscellaneous-5)
|
- More articles: [[<-- prev]](/algorithms-miscellaneous-3) [[next -->]](/algorithms-miscellaneous-5)
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>algorithms-miscellaneous-4</artifactId>
|
<artifactId>algorithms-miscellaneous-4</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
<name>algorithms-miscellaneous-4</name>
|
<name>algorithms-miscellaneous-4</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>parent-modules</artifactId>
|
<artifactId>parent-modules</artifactId>
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
package com.baeldung.algorithms;
|
|
||||||
|
|
||||||
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import com.baeldung.algorithms.string.search.StringSearchAlgorithms;
|
|
||||||
|
|
||||||
public class StringSearchAlgorithmsUnitTest {
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testStringSearchAlgorithms(){
|
|
||||||
String text = "This is some nice text.";
|
|
||||||
String pattern = "some";
|
|
||||||
|
|
||||||
int realPosition = text.indexOf(pattern);
|
|
||||||
Assert.assertTrue(realPosition == StringSearchAlgorithms.simpleTextSearch(pattern.toCharArray(), text.toCharArray()));
|
|
||||||
Assert.assertTrue(realPosition == StringSearchAlgorithms.RabinKarpMethod(pattern.toCharArray(), text.toCharArray()));
|
|
||||||
Assert.assertTrue(realPosition == StringSearchAlgorithms.KnuthMorrisPrattSearch(pattern.toCharArray(), text.toCharArray()));
|
|
||||||
Assert.assertTrue(realPosition == StringSearchAlgorithms.BoyerMooreHorspoolSimpleSearch(pattern.toCharArray(), text.toCharArray()));
|
|
||||||
Assert.assertTrue(realPosition == StringSearchAlgorithms.BoyerMooreHorspoolSearch(pattern.toCharArray(), text.toCharArray()));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -85,4 +85,13 @@ class SmallestMissingPositiveIntegerUnitTest {
|
||||||
|
|
||||||
assertThat(result).isEqualTo(input.length);
|
assertThat(result).isEqualTo(input.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenArrayWithoutZero_whenSearchInUnsortedArrayBooleanArray_thenZero() {
|
||||||
|
int[] input = new int[] {11, 13, 14, 15};
|
||||||
|
|
||||||
|
int result = SmallestMissingPositiveInteger.searchInUnsortedArrayBooleanArray(input);
|
||||||
|
|
||||||
|
assertThat(result).isEqualTo(0);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -9,4 +9,5 @@ This module contains articles about algorithms. Some classes of algorithms, e.g.
|
||||||
- [Reversing a Binary Tree in Java](https://www.baeldung.com/java-reversing-a-binary-tree)
|
- [Reversing a Binary Tree in Java](https://www.baeldung.com/java-reversing-a-binary-tree)
|
||||||
- [Find If Two Numbers Are Relatively Prime in Java](https://www.baeldung.com/java-two-relatively-prime-numbers)
|
- [Find If Two Numbers Are Relatively Prime in Java](https://www.baeldung.com/java-two-relatively-prime-numbers)
|
||||||
- [Knapsack Problem Implementation in Java](https://www.baeldung.com/java-knapsack)
|
- [Knapsack Problem Implementation in Java](https://www.baeldung.com/java-knapsack)
|
||||||
|
- [How to Determine if a Binary Tree is Balanced](https://www.baeldung.com/java-balanced-binary-tree)
|
||||||
- More articles: [[<-- prev]](/../algorithms-miscellaneous-4)
|
- More articles: [[<-- prev]](/../algorithms-miscellaneous-4)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>algorithms-miscellaneous-5</artifactId>
|
<artifactId>algorithms-miscellaneous-5</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
@ -17,6 +18,11 @@
|
||||||
<artifactId>commons-codec</artifactId>
|
<artifactId>commons-codec</artifactId>
|
||||||
<version>${commons-codec.version}</version>
|
<version>${commons-codec.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-math3</artifactId>
|
||||||
|
<version>${commons-math3.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.projectlombok</groupId>
|
<groupId>org.projectlombok</groupId>
|
||||||
<artifactId>lombok</artifactId>
|
<artifactId>lombok</artifactId>
|
||||||
|
@ -28,6 +34,7 @@
|
||||||
<artifactId>tradukisto</artifactId>
|
<artifactId>tradukisto</artifactId>
|
||||||
<version>${tradukisto.version}</version>
|
<version>${tradukisto.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.assertj</groupId>
|
<groupId>org.assertj</groupId>
|
||||||
<artifactId>assertj-core</artifactId>
|
<artifactId>assertj-core</artifactId>
|
||||||
|
@ -52,6 +59,7 @@
|
||||||
<tradukisto.version>1.0.1</tradukisto.version>
|
<tradukisto.version>1.0.1</tradukisto.version>
|
||||||
<org.assertj.core.version>3.9.0</org.assertj.core.version>
|
<org.assertj.core.version>3.9.0</org.assertj.core.version>
|
||||||
<commons-codec.version>1.11</commons-codec.version>
|
<commons-codec.version>1.11</commons-codec.version>
|
||||||
|
<commons-math3.version>3.6.1</commons-math3.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -0,0 +1,83 @@
|
||||||
|
package com.baeldung.algorithms.caesarcipher;
|
||||||
|
|
||||||
|
import org.apache.commons.math3.stat.inference.ChiSquareTest;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
|
public class CaesarCipher {
|
||||||
|
private static final char LETTER_A = 'a';
|
||||||
|
private static final char LETTER_Z = 'z';
|
||||||
|
private static final int ALPHABET_SIZE = LETTER_Z - LETTER_A + 1;
|
||||||
|
private static final double[] ENGLISH_LETTERS_PROBABILITIES = {0.073, 0.009, 0.030, 0.044, 0.130, 0.028, 0.016, 0.035, 0.074, 0.002, 0.003, 0.035, 0.025, 0.078, 0.074, 0.027, 0.003, 0.077, 0.063, 0.093, 0.027, 0.013, 0.016, 0.005, 0.019, 0.001};
|
||||||
|
|
||||||
|
public String cipher(String message, int offset) {
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
|
||||||
|
for (char character : message.toCharArray()) {
|
||||||
|
if (character != ' ') {
|
||||||
|
int originalAlphabetPosition = character - LETTER_A;
|
||||||
|
int newAlphabetPosition = (originalAlphabetPosition + offset) % ALPHABET_SIZE;
|
||||||
|
char newCharacter = (char) (LETTER_A + newAlphabetPosition);
|
||||||
|
result.append(newCharacter);
|
||||||
|
} else {
|
||||||
|
result.append(character);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String decipher(String message, int offset) {
|
||||||
|
return cipher(message, ALPHABET_SIZE - (offset % ALPHABET_SIZE));
|
||||||
|
}
|
||||||
|
|
||||||
|
public int breakCipher(String message) {
|
||||||
|
return probableOffset(chiSquares(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
private double[] chiSquares(String message) {
|
||||||
|
double[] expectedLettersFrequencies = expectedLettersFrequencies(message.length());
|
||||||
|
|
||||||
|
double[] chiSquares = new double[ALPHABET_SIZE];
|
||||||
|
|
||||||
|
for (int offset = 0; offset < chiSquares.length; offset++) {
|
||||||
|
String decipheredMessage = decipher(message, offset);
|
||||||
|
long[] lettersFrequencies = observedLettersFrequencies(decipheredMessage);
|
||||||
|
double chiSquare = new ChiSquareTest().chiSquare(expectedLettersFrequencies, lettersFrequencies);
|
||||||
|
chiSquares[offset] = chiSquare;
|
||||||
|
}
|
||||||
|
|
||||||
|
return chiSquares;
|
||||||
|
}
|
||||||
|
|
||||||
|
private long[] observedLettersFrequencies(String message) {
|
||||||
|
return IntStream.rangeClosed(LETTER_A, LETTER_Z)
|
||||||
|
.mapToLong(letter -> countLetter((char) letter, message))
|
||||||
|
.toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
private long countLetter(char letter, String message) {
|
||||||
|
return message.chars()
|
||||||
|
.filter(character -> character == letter)
|
||||||
|
.count();
|
||||||
|
}
|
||||||
|
|
||||||
|
private double[] expectedLettersFrequencies(int messageLength) {
|
||||||
|
return Arrays.stream(ENGLISH_LETTERS_PROBABILITIES)
|
||||||
|
.map(probability -> probability * messageLength)
|
||||||
|
.toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
private int probableOffset(double[] chiSquares) {
|
||||||
|
int probableOffset = 0;
|
||||||
|
for (int offset = 0; offset < chiSquares.length; offset++) {
|
||||||
|
System.out.println(String.format("Chi-Square for offset %d: %.2f", offset, chiSquares[offset]));
|
||||||
|
if (chiSquares[offset] < chiSquares[probableOffset]) {
|
||||||
|
probableOffset = offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return probableOffset;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
package com.baeldung.algorithms.combinatorics;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import static java.util.Collections.swap;
|
||||||
|
|
||||||
|
public class Combinatorics {
|
||||||
|
|
||||||
|
public static List<List<Integer>> permutations(List<Integer> sequence) {
|
||||||
|
List<List<Integer>> results = new ArrayList<>();
|
||||||
|
permutationsInternal(sequence, results, 0);
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void permutationsInternal(List<Integer> sequence, List<List<Integer>> results, int index) {
|
||||||
|
if (index == sequence.size() - 1) {
|
||||||
|
results.add(new ArrayList<>(sequence));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = index; i < sequence.size(); i++) {
|
||||||
|
swap(sequence, i, index);
|
||||||
|
permutationsInternal(sequence, results, index + 1);
|
||||||
|
swap(sequence, i, index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<List<Integer>> combinations(List<Integer> inputSet, int k) {
|
||||||
|
List<List<Integer>> results = new ArrayList<>();
|
||||||
|
combinationsInternal(inputSet, k, results, new ArrayList<>(), 0);
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void combinationsInternal(
|
||||||
|
List<Integer> inputSet, int k, List<List<Integer>> results, ArrayList<Integer> accumulator, int index) {
|
||||||
|
int leftToAccumulate = k - accumulator.size();
|
||||||
|
int possibleToAcculumate = inputSet.size() - index;
|
||||||
|
|
||||||
|
if (accumulator.size() == k) {
|
||||||
|
results.add(new ArrayList<>(accumulator));
|
||||||
|
} else if (leftToAccumulate <= possibleToAcculumate) {
|
||||||
|
combinationsInternal(inputSet, k, results, accumulator, index + 1);
|
||||||
|
|
||||||
|
accumulator.add(inputSet.get(index));
|
||||||
|
combinationsInternal(inputSet, k, results, accumulator, index + 1);
|
||||||
|
accumulator.remove(accumulator.size() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<List<Character>> powerSet(List<Character> sequence) {
|
||||||
|
List<List<Character>> results = new ArrayList<>();
|
||||||
|
powerSetInternal(sequence, results, new ArrayList<>(), 0);
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void powerSetInternal(
|
||||||
|
List<Character> set, List<List<Character>> powerSet, List<Character> accumulator, int index) {
|
||||||
|
if (index == set.size()) {
|
||||||
|
powerSet.add(new ArrayList<>(accumulator));
|
||||||
|
} else {
|
||||||
|
accumulator.add(set.get(index));
|
||||||
|
|
||||||
|
powerSetInternal(set, powerSet, accumulator, index + 1);
|
||||||
|
accumulator.remove(accumulator.size() - 1);
|
||||||
|
powerSetInternal(set, powerSet, accumulator, index + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package com.baeldung.algorithms.maximumsubarray;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
public class BruteForceAlgorithm {
|
||||||
|
|
||||||
|
private Logger logger = LoggerFactory.getLogger(BruteForceAlgorithm.class.getName());
|
||||||
|
|
||||||
|
public int maxSubArray(int[] arr) {
|
||||||
|
|
||||||
|
int size = arr.length;
|
||||||
|
int maximumSubArraySum = Integer.MIN_VALUE;
|
||||||
|
int start = 0;
|
||||||
|
int end = 0;
|
||||||
|
|
||||||
|
for (int left = 0; left < size; left++) {
|
||||||
|
|
||||||
|
int runningWindowSum = 0;
|
||||||
|
|
||||||
|
for (int right = left; right < size; right++) {
|
||||||
|
runningWindowSum += arr[right];
|
||||||
|
|
||||||
|
if (runningWindowSum > maximumSubArraySum) {
|
||||||
|
maximumSubArraySum = runningWindowSum;
|
||||||
|
start = left;
|
||||||
|
end = right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logger.info("Found Maximum Subarray between {} and {}", start, end);
|
||||||
|
return maximumSubArraySum;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package com.baeldung.algorithms.maximumsubarray;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
public class KadaneAlgorithm {
|
||||||
|
|
||||||
|
private Logger logger = LoggerFactory.getLogger(BruteForceAlgorithm.class.getName());
|
||||||
|
|
||||||
|
public int maxSubArraySum(int[] arr) {
|
||||||
|
|
||||||
|
int size = arr.length;
|
||||||
|
int start = 0;
|
||||||
|
int end = 0;
|
||||||
|
|
||||||
|
int maxSoFar = 0, maxEndingHere = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
|
||||||
|
if (arr[i] > maxEndingHere + arr[i]) {
|
||||||
|
start = i;
|
||||||
|
maxEndingHere = arr[i];
|
||||||
|
} else
|
||||||
|
maxEndingHere = maxEndingHere + arr[i];
|
||||||
|
|
||||||
|
if (maxSoFar < maxEndingHere) {
|
||||||
|
maxSoFar = maxEndingHere;
|
||||||
|
end = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logger.info("Found Maximum Subarray between {} and {}", start, end);
|
||||||
|
return maxSoFar;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
package com.baeldung.algorithms.mergesortedarrays;
|
||||||
|
|
||||||
|
public class SortedArrays {
|
||||||
|
|
||||||
|
public static int[] merge(int[] foo, int[] bar) {
|
||||||
|
|
||||||
|
int fooLength = foo.length;
|
||||||
|
int barLength = bar.length;
|
||||||
|
|
||||||
|
int[] merged = new int[fooLength + barLength];
|
||||||
|
|
||||||
|
int fooPosition, barPosition, mergedPosition;
|
||||||
|
fooPosition = barPosition = mergedPosition = 0;
|
||||||
|
|
||||||
|
while (fooPosition < fooLength && barPosition < barLength) {
|
||||||
|
if (foo[fooPosition] < bar[barPosition]) {
|
||||||
|
merged[mergedPosition++] = foo[fooPosition++];
|
||||||
|
} else {
|
||||||
|
merged[mergedPosition++] = bar[barPosition++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (fooPosition < fooLength) {
|
||||||
|
merged[mergedPosition++] = foo[fooPosition++];
|
||||||
|
}
|
||||||
|
|
||||||
|
while (barPosition < barLength) {
|
||||||
|
merged[mergedPosition++] = bar[barPosition++];
|
||||||
|
}
|
||||||
|
|
||||||
|
return merged;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
package com.baeldung.algorithms.prim;
|
||||||
|
|
||||||
|
public class Edge {
|
||||||
|
|
||||||
|
private int weight;
|
||||||
|
private boolean isIncluded = false;
|
||||||
|
private boolean isPrinted = false;
|
||||||
|
|
||||||
|
public Edge(int weight) {
|
||||||
|
this.weight = weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getWeight() {
|
||||||
|
return weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWeight(int weight) {
|
||||||
|
this.weight = weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isIncluded() {
|
||||||
|
return isIncluded;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIncluded(boolean included) {
|
||||||
|
isIncluded = included;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPrinted() {
|
||||||
|
return isPrinted;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPrinted(boolean printed) {
|
||||||
|
isPrinted = printed;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
package com.baeldung.algorithms.prim;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.commons.math3.util.Pair;
|
||||||
|
|
||||||
|
public class Prim {
|
||||||
|
|
||||||
|
private List<Vertex> graph;
|
||||||
|
|
||||||
|
public Prim(List<Vertex> graph){
|
||||||
|
this.graph = graph;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run(){
|
||||||
|
if (graph.size() > 0){
|
||||||
|
graph.get(0).setVisited(true);
|
||||||
|
}
|
||||||
|
while (isDisconnected()){
|
||||||
|
Edge nextMinimum = new Edge(Integer.MAX_VALUE);
|
||||||
|
Vertex nextVertex = graph.get(0);
|
||||||
|
for (Vertex vertex : graph){
|
||||||
|
if (vertex.isVisited()){
|
||||||
|
Pair<Vertex, Edge> candidate = vertex.nextMinimum();
|
||||||
|
if (candidate.getValue().getWeight() < nextMinimum.getWeight()){
|
||||||
|
nextMinimum = candidate.getValue();
|
||||||
|
nextVertex = candidate.getKey();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nextMinimum.setIncluded(true);
|
||||||
|
nextVertex.setVisited(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isDisconnected(){
|
||||||
|
for (Vertex vertex : graph){
|
||||||
|
if (!vertex.isVisited()){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String originalGraphToString(){
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (Vertex vertex : graph){
|
||||||
|
sb.append(vertex.originalToString());
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetPrintHistory(){
|
||||||
|
for (Vertex vertex : graph){
|
||||||
|
Iterator<Map.Entry<Vertex,Edge>> it = vertex.getEdges().entrySet().iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
Map.Entry<Vertex,Edge> pair = it.next();
|
||||||
|
pair.getValue().setPrinted(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String minimumSpanningTreeToString(){
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (Vertex vertex : graph){
|
||||||
|
sb.append(vertex.includedToString());
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,106 @@
|
||||||
|
package com.baeldung.algorithms.prim;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.commons.math3.util.Pair;
|
||||||
|
|
||||||
|
public class Vertex {
|
||||||
|
|
||||||
|
private String label = null;
|
||||||
|
private Map<Vertex, Edge> edges = new HashMap<>();
|
||||||
|
private boolean isVisited = false;
|
||||||
|
|
||||||
|
public Vertex(String label){
|
||||||
|
this.label = label;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLabel() {
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLabel(String label) {
|
||||||
|
this.label = label;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<Vertex, Edge> getEdges() {
|
||||||
|
return edges;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addEdge(Vertex vertex, Edge edge){
|
||||||
|
if (this.edges.containsKey(vertex)){
|
||||||
|
if (edge.getWeight() < this.edges.get(vertex).getWeight()){
|
||||||
|
this.edges.replace(vertex, edge);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.edges.put(vertex, edge);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isVisited() {
|
||||||
|
return isVisited;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVisited(boolean visited) {
|
||||||
|
isVisited = visited;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Pair<Vertex, Edge> nextMinimum(){
|
||||||
|
Edge nextMinimum = new Edge(Integer.MAX_VALUE);
|
||||||
|
Vertex nextVertex = this;
|
||||||
|
Iterator<Map.Entry<Vertex,Edge>> it = edges.entrySet().iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
Map.Entry<Vertex,Edge> pair = it.next();
|
||||||
|
if (!pair.getKey().isVisited()){
|
||||||
|
if (!pair.getValue().isIncluded()) {
|
||||||
|
if (pair.getValue().getWeight() < nextMinimum.getWeight()) {
|
||||||
|
nextMinimum = pair.getValue();
|
||||||
|
nextVertex = pair.getKey();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new Pair<>(nextVertex, nextMinimum);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String originalToString(){
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
Iterator<Map.Entry<Vertex,Edge>> it = edges.entrySet().iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
Map.Entry<Vertex,Edge> pair = it.next();
|
||||||
|
if (!pair.getValue().isPrinted()) {
|
||||||
|
sb.append(getLabel());
|
||||||
|
sb.append(" --- ");
|
||||||
|
sb.append(pair.getValue().getWeight());
|
||||||
|
sb.append(" --- ");
|
||||||
|
sb.append(pair.getKey().getLabel());
|
||||||
|
sb.append("\n");
|
||||||
|
pair.getValue().setPrinted(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String includedToString(){
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
if (isVisited()) {
|
||||||
|
Iterator<Map.Entry<Vertex,Edge>> it = edges.entrySet().iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
Map.Entry<Vertex,Edge> pair = it.next();
|
||||||
|
if (pair.getValue().isIncluded()) {
|
||||||
|
if (!pair.getValue().isPrinted()) {
|
||||||
|
sb.append(getLabel());
|
||||||
|
sb.append(" --- ");
|
||||||
|
sb.append(pair.getValue().getWeight());
|
||||||
|
sb.append(" --- ");
|
||||||
|
sb.append(pair.getKey().getLabel());
|
||||||
|
sb.append("\n");
|
||||||
|
pair.getValue().setPrinted(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,83 @@
|
||||||
|
package com.baeldung.algorithms.caesarcipher;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
class CaesarCipherUnitTest {
|
||||||
|
private static final String SENTENCE = "he told me i could never teach a llama to drive";
|
||||||
|
private static final String SENTENCE_SHIFTED_THREE = "kh wrog ph l frxog qhyhu whdfk d oodpd wr gulyh";
|
||||||
|
private static final String SENTENCE_SHIFTED_TEN = "ro dyvn wo s myevn xofob dokmr k vvkwk dy nbsfo";
|
||||||
|
|
||||||
|
private CaesarCipher algorithm = new CaesarCipher();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenSentenceAndShiftThree_whenCipher_thenCipheredMessageWithoutOverflow() {
|
||||||
|
String cipheredSentence = algorithm.cipher(SENTENCE, 3);
|
||||||
|
|
||||||
|
assertThat(cipheredSentence)
|
||||||
|
.isEqualTo(SENTENCE_SHIFTED_THREE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenSentenceAndShiftTen_whenCipher_thenCipheredMessageWithOverflow() {
|
||||||
|
String cipheredSentence = algorithm.cipher(SENTENCE, 10);
|
||||||
|
|
||||||
|
assertThat(cipheredSentence)
|
||||||
|
.isEqualTo(SENTENCE_SHIFTED_TEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenSentenceAndShiftThirtySix_whenCipher_thenCipheredLikeTenMessageWithOverflow() {
|
||||||
|
String cipheredSentence = algorithm.cipher(SENTENCE, 36);
|
||||||
|
|
||||||
|
assertThat(cipheredSentence)
|
||||||
|
.isEqualTo(SENTENCE_SHIFTED_TEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenSentenceShiftedThreeAndShiftThree_whenDecipher_thenOriginalSentenceWithoutOverflow() {
|
||||||
|
String decipheredSentence = algorithm.decipher(SENTENCE_SHIFTED_THREE, 3);
|
||||||
|
|
||||||
|
assertThat(decipheredSentence)
|
||||||
|
.isEqualTo(SENTENCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenSentenceShiftedTenAndShiftTen_whenDecipher_thenOriginalSentenceWithOverflow() {
|
||||||
|
String decipheredSentence = algorithm.decipher(SENTENCE_SHIFTED_TEN, 10);
|
||||||
|
|
||||||
|
assertThat(decipheredSentence)
|
||||||
|
.isEqualTo(SENTENCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenSentenceShiftedTenAndShiftThirtySix_whenDecipher_thenOriginalSentenceWithOverflow() {
|
||||||
|
String decipheredSentence = algorithm.decipher(SENTENCE_SHIFTED_TEN, 36);
|
||||||
|
|
||||||
|
assertThat(decipheredSentence)
|
||||||
|
.isEqualTo(SENTENCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenSentenceShiftedThree_whenBreakCipher_thenOriginalSentence() {
|
||||||
|
int offset = algorithm.breakCipher(SENTENCE_SHIFTED_THREE);
|
||||||
|
|
||||||
|
assertThat(offset)
|
||||||
|
.isEqualTo(3);
|
||||||
|
|
||||||
|
assertThat(algorithm.decipher(SENTENCE_SHIFTED_THREE, offset))
|
||||||
|
.isEqualTo(SENTENCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenSentenceShiftedTen_whenBreakCipher_thenOriginalSentence() {
|
||||||
|
int offset = algorithm.breakCipher(SENTENCE_SHIFTED_TEN);
|
||||||
|
|
||||||
|
assertThat(offset)
|
||||||
|
.isEqualTo(10);
|
||||||
|
|
||||||
|
assertThat(algorithm.decipher(SENTENCE_SHIFTED_TEN, offset))
|
||||||
|
.isEqualTo(SENTENCE);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,80 @@
|
||||||
|
package com.baeldung.algorithms.combinatorics;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertSame;
|
||||||
|
|
||||||
|
public class CombinatoricsUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenEmptySequence_whenCallingPermutations_ShouldReturnEmptyList() {
|
||||||
|
List<Integer> sequence = Arrays.asList();
|
||||||
|
|
||||||
|
List<List<Integer>> permutations = Combinatorics.permutations(sequence);
|
||||||
|
|
||||||
|
assertEquals(0, permutations.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenOneElementSequence_whenCallingPermutations_ShouldReturnPermutations() {
|
||||||
|
List<Integer> sequence = Arrays.asList(1);
|
||||||
|
|
||||||
|
List<List<Integer>> permutations = Combinatorics.permutations(sequence);
|
||||||
|
|
||||||
|
assertEquals(1, permutations.size());
|
||||||
|
assertEquals(1, permutations.get(0).size());
|
||||||
|
assertSame(1, permutations.get(0).get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenFourElementsSequence_whenCallingPermutations_ShouldReturnPermutations() {
|
||||||
|
List<Integer> sequence = Arrays.asList(1, 2, 3, 4);
|
||||||
|
|
||||||
|
List<List<Integer>> permutations = Combinatorics.permutations(sequence);
|
||||||
|
|
||||||
|
assertEquals(24, permutations.size());
|
||||||
|
assertEquals(24, new HashSet<>(permutations).size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenTwoElements_whenCalling3Combinations_ShouldReturnEmptyList() {
|
||||||
|
List<Integer> set = Arrays.asList(1, 2);
|
||||||
|
|
||||||
|
List<List<Integer>> combinations = Combinatorics.combinations(set, 3);
|
||||||
|
|
||||||
|
assertEquals(0, combinations.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenThreeElements_whenCalling3Combinations_ShouldReturnOneCombination() {
|
||||||
|
List<Integer> set = Arrays.asList(1, 2, 3);
|
||||||
|
|
||||||
|
List<List<Integer>> combinations = Combinatorics.combinations(set, 3);
|
||||||
|
|
||||||
|
assertEquals(1, combinations.size());
|
||||||
|
assertEquals(combinations.get(0), Arrays.asList(1, 2, 3));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenFourElements_whenCalling2Combinations_ShouldReturnCombinations() {
|
||||||
|
List<Integer> set = Arrays.asList(1, 2, 3, 4);
|
||||||
|
|
||||||
|
List<List<Integer>> combinations = Combinatorics.combinations(set, 2);
|
||||||
|
|
||||||
|
assertEquals(6, combinations.size());
|
||||||
|
assertEquals(6, new HashSet<>(combinations).size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenFourElements_whenCallingPowerSet_ShouldReturn15Sets() {
|
||||||
|
List<Character> sequence = Arrays.asList('a', 'b', 'c', 'd');
|
||||||
|
|
||||||
|
List<List<Character>> combinations = Combinatorics.powerSet(sequence);
|
||||||
|
|
||||||
|
assertEquals(16, combinations.size());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package com.baeldung.algorithms.maximumsubarray;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
class BruteForceAlgorithmUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenArrayWithNegativeNumberWhenMaximumSubarrayThenReturns6() {
|
||||||
|
//given
|
||||||
|
int[] arr = new int[]{-3, 1, -8, 4, -1, 2, 1, -5, 5};
|
||||||
|
//when
|
||||||
|
BruteForceAlgorithm algorithm = new BruteForceAlgorithm();
|
||||||
|
int maximumSum = algorithm.maxSubArray(arr);
|
||||||
|
//then
|
||||||
|
assertEquals(6, maximumSum);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package com.baeldung.algorithms.maximumsubarray;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
class KadaneAlgorithmUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenArrayWithNegativeNumberWhenMaximumSubarrayThenReturns6() {
|
||||||
|
//given
|
||||||
|
int[] arr = new int[]{-3, 1, -8, 4, -1, 2, 1, -5, 5};
|
||||||
|
//when
|
||||||
|
KadaneAlgorithm algorithm = new KadaneAlgorithm();
|
||||||
|
int maxSum = algorithm.maxSubArraySum(arr);
|
||||||
|
//then
|
||||||
|
assertEquals(6, maxSum);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.baeldung.algorithms.mergesortedarrays;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import com.baeldung.algorithms.mergesortedarrays.SortedArrays;
|
||||||
|
|
||||||
|
public class SortedArraysUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenTwoSortedArrays_whenMerged_thenReturnMergedSortedArray() {
|
||||||
|
|
||||||
|
int[] foo = { 3, 7 };
|
||||||
|
int[] bar = { 4, 8, 11 };
|
||||||
|
int[] merged = { 3, 4, 7, 8, 11 };
|
||||||
|
|
||||||
|
assertArrayEquals(merged, SortedArrays.merge(foo, bar));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenTwoSortedArraysWithDuplicates_whenMerged_thenReturnMergedSortedArray() {
|
||||||
|
|
||||||
|
int[] foo = { 3, 3, 7 };
|
||||||
|
int[] bar = { 4, 8, 8, 11 };
|
||||||
|
int[] merged = { 3, 3, 4, 7, 8, 8, 11 };
|
||||||
|
|
||||||
|
assertArrayEquals(merged, SortedArrays.merge(foo, bar));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.baeldung.algorithms.prim;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class PrimUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAGraph_whenPrimRuns_thenPrintMST() {
|
||||||
|
Prim prim = new Prim(createGraph());
|
||||||
|
System.out.println(prim.originalGraphToString());
|
||||||
|
System.out.println("----------------");
|
||||||
|
prim.run();
|
||||||
|
System.out.println();
|
||||||
|
prim.resetPrintHistory();
|
||||||
|
System.out.println(prim.minimumSpanningTreeToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<Vertex> createGraph() {
|
||||||
|
List<Vertex> graph = new ArrayList<>();
|
||||||
|
Vertex a = new Vertex("A");
|
||||||
|
Vertex b = new Vertex("B");
|
||||||
|
Vertex c = new Vertex("C");
|
||||||
|
Vertex d = new Vertex("D");
|
||||||
|
Vertex e = new Vertex("E");
|
||||||
|
Edge ab = new Edge(2);
|
||||||
|
a.addEdge(b, ab);
|
||||||
|
b.addEdge(a, ab);
|
||||||
|
Edge ac = new Edge(3);
|
||||||
|
a.addEdge(c, ac);
|
||||||
|
c.addEdge(a, ac);
|
||||||
|
Edge bc = new Edge(2);
|
||||||
|
b.addEdge(c, bc);
|
||||||
|
c.addEdge(b, bc);
|
||||||
|
Edge be = new Edge(5);
|
||||||
|
b.addEdge(e, be);
|
||||||
|
e.addEdge(b, be);
|
||||||
|
Edge cd = new Edge(1);
|
||||||
|
c.addEdge(d, cd);
|
||||||
|
d.addEdge(c, cd);
|
||||||
|
Edge ce = new Edge(1);
|
||||||
|
c.addEdge(e, ce);
|
||||||
|
e.addEdge(c, ce);
|
||||||
|
graph.add(a);
|
||||||
|
graph.add(b);
|
||||||
|
graph.add(c);
|
||||||
|
graph.add(d);
|
||||||
|
graph.add(e);
|
||||||
|
return graph;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
## Algorithms - Searching
|
||||||
|
|
||||||
|
This module contains articles about searching algorithms.
|
||||||
|
|
||||||
|
### Relevant articles:
|
||||||
|
- [Binary Search Algorithm in Java](https://www.baeldung.com/java-binary-search)
|
||||||
|
- [Depth First Search in Java](https://www.baeldung.com/java-depth-first-search)
|
||||||
|
- [Interpolation Search in Java](https://www.baeldung.com/java-interpolation-search)
|
||||||
|
- [Breadth-First Search Algorithm in Java](https://www.baeldung.com/java-breadth-first-search)
|
||||||
|
- [String Search Algorithms for Large Texts](https://www.baeldung.com/java-full-text-search-algorithms)
|
||||||
|
- [Monte Carlo Tree Search for Tic-Tac-Toe Game](https://www.baeldung.com/java-monte-carlo-tree-search)
|
|
@ -0,0 +1,38 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>algorithms-searching</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<name>algorithms-searching</name>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-modules</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.assertj</groupId>
|
||||||
|
<artifactId>assertj-core</artifactId>
|
||||||
|
<version>${org.assertj.core.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<finalName>algorithms-searching</finalName>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/resources</directory>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<org.assertj.core.version>3.9.0</org.assertj.core.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
|
@ -1,55 +1,55 @@
|
||||||
package com.baeldung.algorithms.binarysearch;
|
package com.baeldung.algorithms.binarysearch;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class BinarySearch {
|
public class BinarySearch {
|
||||||
|
|
||||||
public int runBinarySearchIteratively(int[] sortedArray, int key, int low, int high) {
|
public int runBinarySearchIteratively(int[] sortedArray, int key, int low, int high) {
|
||||||
|
|
||||||
int index = Integer.MAX_VALUE;
|
int index = Integer.MAX_VALUE;
|
||||||
|
|
||||||
while (low <= high) {
|
while (low <= high) {
|
||||||
|
|
||||||
int mid = (low + high) / 2;
|
int mid = (low + high) / 2;
|
||||||
|
|
||||||
if (sortedArray[mid] < key) {
|
if (sortedArray[mid] < key) {
|
||||||
low = mid + 1;
|
low = mid + 1;
|
||||||
} else if (sortedArray[mid] > key) {
|
} else if (sortedArray[mid] > key) {
|
||||||
high = mid - 1;
|
high = mid - 1;
|
||||||
} else if (sortedArray[mid] == key) {
|
} else if (sortedArray[mid] == key) {
|
||||||
index = mid;
|
index = mid;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int runBinarySearchRecursively(int[] sortedArray, int key, int low, int high) {
|
public int runBinarySearchRecursively(int[] sortedArray, int key, int low, int high) {
|
||||||
|
|
||||||
int middle = (low + high) / 2;
|
int middle = (low + high) / 2;
|
||||||
if (high < low) {
|
if (high < low) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key == sortedArray[middle]) {
|
if (key == sortedArray[middle]) {
|
||||||
return middle;
|
return middle;
|
||||||
} else if (key < sortedArray[middle]) {
|
} else if (key < sortedArray[middle]) {
|
||||||
return runBinarySearchRecursively(sortedArray, key, low, middle - 1);
|
return runBinarySearchRecursively(sortedArray, key, low, middle - 1);
|
||||||
} else {
|
} else {
|
||||||
return runBinarySearchRecursively(sortedArray, key, middle + 1, high);
|
return runBinarySearchRecursively(sortedArray, key, middle + 1, high);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int runBinarySearchUsingJavaArrays(int[] sortedArray, Integer key) {
|
public int runBinarySearchUsingJavaArrays(int[] sortedArray, Integer key) {
|
||||||
int index = Arrays.binarySearch(sortedArray, key);
|
int index = Arrays.binarySearch(sortedArray, key);
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int runBinarySearchUsingJavaCollections(List<Integer> sortedList, Integer key) {
|
public int runBinarySearchUsingJavaCollections(List<Integer> sortedList, Integer key) {
|
||||||
int index = Collections.binarySearch(sortedList, key);
|
int index = Collections.binarySearch(sortedList, key);
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -0,0 +1,227 @@
|
||||||
|
package com.baeldung.algorithms.dfs;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.Queue;
|
||||||
|
import java.util.Stack;
|
||||||
|
|
||||||
|
public class BinaryTree {
|
||||||
|
|
||||||
|
Node root;
|
||||||
|
|
||||||
|
public void add(int value) {
|
||||||
|
root = addRecursive(root, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Node addRecursive(Node current, int value) {
|
||||||
|
|
||||||
|
if (current == null) {
|
||||||
|
return new Node(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value < current.value) {
|
||||||
|
current.left = addRecursive(current.left, value);
|
||||||
|
} else if (value > current.value) {
|
||||||
|
current.right = addRecursive(current.right, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return root == null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSize() {
|
||||||
|
return getSizeRecursive(root);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getSizeRecursive(Node current) {
|
||||||
|
return current == null ? 0 : getSizeRecursive(current.left) + 1 + getSizeRecursive(current.right);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean containsNode(int value) {
|
||||||
|
return containsNodeRecursive(root, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean containsNodeRecursive(Node current, int value) {
|
||||||
|
if (current == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value == current.value) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return value < current.value
|
||||||
|
? containsNodeRecursive(current.left, value)
|
||||||
|
: containsNodeRecursive(current.right, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delete(int value) {
|
||||||
|
root = deleteRecursive(root, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Node deleteRecursive(Node current, int value) {
|
||||||
|
if (current == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value == current.value) {
|
||||||
|
// Case 1: no children
|
||||||
|
if (current.left == null && current.right == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Case 2: only 1 child
|
||||||
|
if (current.right == null) {
|
||||||
|
return current.left;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current.left == null) {
|
||||||
|
return current.right;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Case 3: 2 children
|
||||||
|
int smallestValue = findSmallestValue(current.right);
|
||||||
|
current.value = smallestValue;
|
||||||
|
current.right = deleteRecursive(current.right, smallestValue);
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
if (value < current.value) {
|
||||||
|
current.left = deleteRecursive(current.left, value);
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
current.right = deleteRecursive(current.right, value);
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int findSmallestValue(Node root) {
|
||||||
|
return root.left == null ? root.value : findSmallestValue(root.left);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void traverseInOrder(Node node) {
|
||||||
|
if (node != null) {
|
||||||
|
traverseInOrder(node.left);
|
||||||
|
visit(node.value);
|
||||||
|
traverseInOrder(node.right);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void traversePreOrder(Node node) {
|
||||||
|
if (node != null) {
|
||||||
|
visit(node.value);
|
||||||
|
traversePreOrder(node.left);
|
||||||
|
traversePreOrder(node.right);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void traversePostOrder(Node node) {
|
||||||
|
if (node != null) {
|
||||||
|
traversePostOrder(node.left);
|
||||||
|
traversePostOrder(node.right);
|
||||||
|
visit(node.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void traverseLevelOrder() {
|
||||||
|
if (root == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Queue<Node> nodes = new LinkedList<>();
|
||||||
|
nodes.add(root);
|
||||||
|
|
||||||
|
while (!nodes.isEmpty()) {
|
||||||
|
|
||||||
|
Node node = nodes.remove();
|
||||||
|
|
||||||
|
System.out.print(" " + node.value);
|
||||||
|
|
||||||
|
if (node.left != null) {
|
||||||
|
nodes.add(node.left);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node.left != null) {
|
||||||
|
nodes.add(node.right);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void traverseInOrderWithoutRecursion() {
|
||||||
|
Stack<Node> stack = new Stack<Node>();
|
||||||
|
Node current = root;
|
||||||
|
stack.push(root);
|
||||||
|
while(! stack.isEmpty()) {
|
||||||
|
while(current.left != null) {
|
||||||
|
current = current.left;
|
||||||
|
stack.push(current);
|
||||||
|
}
|
||||||
|
current = stack.pop();
|
||||||
|
visit(current.value);
|
||||||
|
if(current.right != null) {
|
||||||
|
current = current.right;
|
||||||
|
stack.push(current);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void traversePreOrderWithoutRecursion() {
|
||||||
|
Stack<Node> stack = new Stack<Node>();
|
||||||
|
Node current = root;
|
||||||
|
stack.push(root);
|
||||||
|
while(! stack.isEmpty()) {
|
||||||
|
current = stack.pop();
|
||||||
|
visit(current.value);
|
||||||
|
|
||||||
|
if(current.right != null)
|
||||||
|
stack.push(current.right);
|
||||||
|
|
||||||
|
if(current.left != null)
|
||||||
|
stack.push(current.left);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void traversePostOrderWithoutRecursion() {
|
||||||
|
Stack<Node> stack = new Stack<Node>();
|
||||||
|
Node prev = root;
|
||||||
|
Node current = root;
|
||||||
|
stack.push(root);
|
||||||
|
|
||||||
|
while (!stack.isEmpty()) {
|
||||||
|
current = stack.peek();
|
||||||
|
boolean hasChild = (current.left != null || current.right != null);
|
||||||
|
boolean isPrevLastChild = (prev == current.right || (prev == current.left && current.right == null));
|
||||||
|
|
||||||
|
if (!hasChild || isPrevLastChild) {
|
||||||
|
current = stack.pop();
|
||||||
|
visit(current.value);
|
||||||
|
prev = current;
|
||||||
|
} else {
|
||||||
|
if (current.right != null) {
|
||||||
|
stack.push(current.right);
|
||||||
|
}
|
||||||
|
if (current.left != null) {
|
||||||
|
stack.push(current.left);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void visit(int value) {
|
||||||
|
System.out.print(" " + value);
|
||||||
|
}
|
||||||
|
|
||||||
|
class Node {
|
||||||
|
int value;
|
||||||
|
Node left;
|
||||||
|
Node right;
|
||||||
|
|
||||||
|
Node(int value) {
|
||||||
|
this.value = value;
|
||||||
|
right = null;
|
||||||
|
left = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package com.baeldung.graph;
|
package com.baeldung.algorithms.dfs;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
|
@ -1,194 +1,194 @@
|
||||||
package com.baeldung.algorithms.string.search;
|
package com.baeldung.algorithms.textsearch;
|
||||||
|
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public class StringSearchAlgorithms {
|
public class TextSearchAlgorithms {
|
||||||
public static long getBiggerPrime(int m) {
|
public static long getBiggerPrime(int m) {
|
||||||
BigInteger prime = BigInteger.probablePrime(getNumberOfBits(m) + 1, new Random());
|
BigInteger prime = BigInteger.probablePrime(getNumberOfBits(m) + 1, new Random());
|
||||||
return prime.longValue();
|
return prime.longValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static long getLowerPrime(long number) {
|
public static long getLowerPrime(long number) {
|
||||||
BigInteger prime = BigInteger.probablePrime(getNumberOfBits(number) - 1, new Random());
|
BigInteger prime = BigInteger.probablePrime(getNumberOfBits(number) - 1, new Random());
|
||||||
return prime.longValue();
|
return prime.longValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int getNumberOfBits(final int number) {
|
private static int getNumberOfBits(final int number) {
|
||||||
return Integer.SIZE - Integer.numberOfLeadingZeros(number);
|
return Integer.SIZE - Integer.numberOfLeadingZeros(number);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int getNumberOfBits(final long number) {
|
private static int getNumberOfBits(final long number) {
|
||||||
return Long.SIZE - Long.numberOfLeadingZeros(number);
|
return Long.SIZE - Long.numberOfLeadingZeros(number);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int simpleTextSearch(char[] pattern, char[] text) {
|
public static int simpleTextSearch(char[] pattern, char[] text) {
|
||||||
int patternSize = pattern.length;
|
int patternSize = pattern.length;
|
||||||
int textSize = text.length;
|
int textSize = text.length;
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
while ((i + patternSize) <= textSize) {
|
while ((i + patternSize) <= textSize) {
|
||||||
int j = 0;
|
int j = 0;
|
||||||
while (text[i + j] == pattern[j]) {
|
while (text[i + j] == pattern[j]) {
|
||||||
j += 1;
|
j += 1;
|
||||||
if (j >= patternSize)
|
if (j >= patternSize)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int RabinKarpMethod(char[] pattern, char[] text) {
|
public static int RabinKarpMethod(char[] pattern, char[] text) {
|
||||||
int patternSize = pattern.length; // m
|
int patternSize = pattern.length; // m
|
||||||
int textSize = text.length; // n
|
int textSize = text.length; // n
|
||||||
|
|
||||||
long prime = getBiggerPrime(patternSize);
|
long prime = getBiggerPrime(patternSize);
|
||||||
|
|
||||||
long r = 1;
|
long r = 1;
|
||||||
for (int i = 0; i < patternSize - 1; i++) {
|
for (int i = 0; i < patternSize - 1; i++) {
|
||||||
r *= 2;
|
r *= 2;
|
||||||
r = r % prime;
|
r = r % prime;
|
||||||
}
|
}
|
||||||
|
|
||||||
long[] t = new long[textSize];
|
long[] t = new long[textSize];
|
||||||
t[0] = 0;
|
t[0] = 0;
|
||||||
|
|
||||||
long pfinger = 0;
|
long pfinger = 0;
|
||||||
|
|
||||||
for (int j = 0; j < patternSize; j++) {
|
for (int j = 0; j < patternSize; j++) {
|
||||||
t[0] = (2 * t[0] + text[j]) % prime;
|
t[0] = (2 * t[0] + text[j]) % prime;
|
||||||
pfinger = (2 * pfinger + pattern[j]) % prime;
|
pfinger = (2 * pfinger + pattern[j]) % prime;
|
||||||
}
|
}
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
boolean passed = false;
|
boolean passed = false;
|
||||||
|
|
||||||
int diff = textSize - patternSize;
|
int diff = textSize - patternSize;
|
||||||
for (i = 0; i <= diff; i++) {
|
for (i = 0; i <= diff; i++) {
|
||||||
if (t[i] == pfinger) {
|
if (t[i] == pfinger) {
|
||||||
passed = true;
|
passed = true;
|
||||||
for (int k = 0; k < patternSize; k++) {
|
for (int k = 0; k < patternSize; k++) {
|
||||||
if (text[i + k] != pattern[k]) {
|
if (text[i + k] != pattern[k]) {
|
||||||
passed = false;
|
passed = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (passed) {
|
if (passed) {
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i < diff) {
|
if (i < diff) {
|
||||||
long value = 2 * (t[i] - r * text[i]) + text[i + patternSize];
|
long value = 2 * (t[i] - r * text[i]) + text[i + patternSize];
|
||||||
t[i + 1] = ((value % prime) + prime) % prime;
|
t[i + 1] = ((value % prime) + prime) % prime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int KnuthMorrisPrattSearch(char[] pattern, char[] text) {
|
public static int KnuthMorrisPrattSearch(char[] pattern, char[] text) {
|
||||||
int patternSize = pattern.length; // m
|
int patternSize = pattern.length; // m
|
||||||
int textSize = text.length; // n
|
int textSize = text.length; // n
|
||||||
|
|
||||||
int i = 0, j = 0;
|
int i = 0, j = 0;
|
||||||
|
|
||||||
int[] shift = KnuthMorrisPrattShift(pattern);
|
int[] shift = KnuthMorrisPrattShift(pattern);
|
||||||
|
|
||||||
while ((i + patternSize) <= textSize) {
|
while ((i + patternSize) <= textSize) {
|
||||||
while (text[i + j] == pattern[j]) {
|
while (text[i + j] == pattern[j]) {
|
||||||
j += 1;
|
j += 1;
|
||||||
if (j >= patternSize)
|
if (j >= patternSize)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (j > 0) {
|
if (j > 0) {
|
||||||
i += shift[j - 1];
|
i += shift[j - 1];
|
||||||
j = Math.max(j - shift[j - 1], 0);
|
j = Math.max(j - shift[j - 1], 0);
|
||||||
} else {
|
} else {
|
||||||
i++;
|
i++;
|
||||||
j = 0;
|
j = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int[] KnuthMorrisPrattShift(char[] pattern) {
|
public static int[] KnuthMorrisPrattShift(char[] pattern) {
|
||||||
int patternSize = pattern.length;
|
int patternSize = pattern.length;
|
||||||
|
|
||||||
int[] shift = new int[patternSize];
|
int[] shift = new int[patternSize];
|
||||||
shift[0] = 1;
|
shift[0] = 1;
|
||||||
|
|
||||||
int i = 1, j = 0;
|
int i = 1, j = 0;
|
||||||
|
|
||||||
while ((i + j) < patternSize) {
|
while ((i + j) < patternSize) {
|
||||||
if (pattern[i + j] == pattern[j]) {
|
if (pattern[i + j] == pattern[j]) {
|
||||||
shift[i + j] = i;
|
shift[i + j] = i;
|
||||||
j++;
|
j++;
|
||||||
} else {
|
} else {
|
||||||
if (j == 0)
|
if (j == 0)
|
||||||
shift[i] = i + 1;
|
shift[i] = i + 1;
|
||||||
|
|
||||||
if (j > 0) {
|
if (j > 0) {
|
||||||
i = i + shift[j - 1];
|
i = i + shift[j - 1];
|
||||||
j = Math.max(j - shift[j - 1], 0);
|
j = Math.max(j - shift[j - 1], 0);
|
||||||
} else {
|
} else {
|
||||||
i = i + 1;
|
i = i + 1;
|
||||||
j = 0;
|
j = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return shift;
|
return shift;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int BoyerMooreHorspoolSimpleSearch(char[] pattern, char[] text) {
|
public static int BoyerMooreHorspoolSimpleSearch(char[] pattern, char[] text) {
|
||||||
int patternSize = pattern.length;
|
int patternSize = pattern.length;
|
||||||
int textSize = text.length;
|
int textSize = text.length;
|
||||||
|
|
||||||
int i = 0, j = 0;
|
int i = 0, j = 0;
|
||||||
|
|
||||||
while ((i + patternSize) <= textSize) {
|
while ((i + patternSize) <= textSize) {
|
||||||
j = patternSize - 1;
|
j = patternSize - 1;
|
||||||
while (text[i + j] == pattern[j]) {
|
while (text[i + j] == pattern[j]) {
|
||||||
j--;
|
j--;
|
||||||
if (j < 0)
|
if (j < 0)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int BoyerMooreHorspoolSearch(char[] pattern, char[] text) {
|
public static int BoyerMooreHorspoolSearch(char[] pattern, char[] text) {
|
||||||
|
|
||||||
int shift[] = new int[256];
|
int shift[] = new int[256];
|
||||||
|
|
||||||
for (int k = 0; k < 256; k++) {
|
for (int k = 0; k < 256; k++) {
|
||||||
shift[k] = pattern.length;
|
shift[k] = pattern.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int k = 0; k < pattern.length - 1; k++) {
|
for (int k = 0; k < pattern.length - 1; k++) {
|
||||||
shift[pattern[k]] = pattern.length - 1 - k;
|
shift[pattern[k]] = pattern.length - 1 - k;
|
||||||
}
|
}
|
||||||
|
|
||||||
int i = 0, j = 0;
|
int i = 0, j = 0;
|
||||||
|
|
||||||
while ((i + pattern.length) <= text.length) {
|
while ((i + pattern.length) <= text.length) {
|
||||||
j = pattern.length - 1;
|
j = pattern.length - 1;
|
||||||
|
|
||||||
while (text[i + j] == pattern[j]) {
|
while (text[i + j] == pattern[j]) {
|
||||||
j -= 1;
|
j -= 1;
|
||||||
if (j < 0)
|
if (j < 0)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
i = i + shift[text[i + pattern.length - 1]];
|
i = i + shift[text[i + pattern.length - 1]];
|
||||||
|
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,43 +1,41 @@
|
||||||
package com.baeldung.algorithms.binarysearch;
|
package com.baeldung.algorithms.binarysearch;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import org.junit.Assert;
|
||||||
import org.junit.Assert;
|
import org.junit.Test;
|
||||||
import org.junit.Test;
|
|
||||||
import com.baeldung.algorithms.binarysearch.BinarySearch;
|
public class BinarySearchUnitTest {
|
||||||
|
|
||||||
public class BinarySearchUnitTest {
|
int[] sortedArray = { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 };
|
||||||
|
int key = 6;
|
||||||
int[] sortedArray = { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 };
|
int expectedIndexForSearchKey = 7;
|
||||||
int key = 6;
|
int low = 0;
|
||||||
int expectedIndexForSearchKey = 7;
|
int high = sortedArray.length - 1;
|
||||||
int low = 0;
|
List<Integer> sortedList = Arrays.asList(0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9);
|
||||||
int high = sortedArray.length - 1;
|
|
||||||
List<Integer> sortedList = Arrays.asList(0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9);
|
@Test
|
||||||
|
public void givenASortedArrayOfIntegers_whenBinarySearchRunIterativelyForANumber_thenGetIndexOfTheNumber() {
|
||||||
@Test
|
BinarySearch binSearch = new BinarySearch();
|
||||||
public void givenASortedArrayOfIntegers_whenBinarySearchRunIterativelyForANumber_thenGetIndexOfTheNumber() {
|
Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchIteratively(sortedArray, key, low, high));
|
||||||
BinarySearch binSearch = new BinarySearch();
|
}
|
||||||
Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchIteratively(sortedArray, key, low, high));
|
|
||||||
}
|
@Test
|
||||||
|
public void givenASortedArrayOfIntegers_whenBinarySearchRunRecursivelyForANumber_thenGetIndexOfTheNumber() {
|
||||||
@Test
|
BinarySearch binSearch = new BinarySearch();
|
||||||
public void givenASortedArrayOfIntegers_whenBinarySearchRunRecursivelyForANumber_thenGetIndexOfTheNumber() {
|
Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchRecursively(sortedArray, key, low, high));
|
||||||
BinarySearch binSearch = new BinarySearch();
|
}
|
||||||
Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchRecursively(sortedArray, key, low, high));
|
|
||||||
}
|
@Test
|
||||||
|
public void givenASortedArrayOfIntegers_whenBinarySearchRunUsingArraysClassStaticMethodForANumber_thenGetIndexOfTheNumber() {
|
||||||
@Test
|
BinarySearch binSearch = new BinarySearch();
|
||||||
public void givenASortedArrayOfIntegers_whenBinarySearchRunUsingArraysClassStaticMethodForANumber_thenGetIndexOfTheNumber() {
|
Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchUsingJavaArrays(sortedArray, key));
|
||||||
BinarySearch binSearch = new BinarySearch();
|
}
|
||||||
Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchUsingJavaArrays(sortedArray, key));
|
|
||||||
}
|
@Test
|
||||||
|
public void givenASortedListOfIntegers_whenBinarySearchRunUsingCollectionsClassStaticMethodForANumber_thenGetIndexOfTheNumber() {
|
||||||
@Test
|
BinarySearch binSearch = new BinarySearch();
|
||||||
public void givenASortedListOfIntegers_whenBinarySearchRunUsingCollectionsClassStaticMethodForANumber_thenGetIndexOfTheNumber() {
|
Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchUsingJavaCollections(sortedList, key));
|
||||||
BinarySearch binSearch = new BinarySearch();
|
}
|
||||||
Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchUsingJavaCollections(sortedList, key));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,136 @@
|
||||||
|
package com.baeldung.algorithms.dfs;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class BinaryTreeUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenABinaryTree_WhenAddingElements_ThenTreeNotEmpty() {
|
||||||
|
|
||||||
|
BinaryTree bt = createBinaryTree();
|
||||||
|
|
||||||
|
assertTrue(!bt.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenABinaryTree_WhenAddingElements_ThenTreeContainsThoseElements() {
|
||||||
|
|
||||||
|
BinaryTree bt = createBinaryTree();
|
||||||
|
|
||||||
|
assertTrue(bt.containsNode(6));
|
||||||
|
assertTrue(bt.containsNode(4));
|
||||||
|
|
||||||
|
assertFalse(bt.containsNode(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenABinaryTree_WhenAddingExistingElement_ThenElementIsNotAdded() {
|
||||||
|
|
||||||
|
BinaryTree bt = createBinaryTree();
|
||||||
|
|
||||||
|
int initialSize = bt.getSize();
|
||||||
|
|
||||||
|
assertTrue(bt.containsNode(3));
|
||||||
|
bt.add(3);
|
||||||
|
assertEquals(initialSize, bt.getSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenABinaryTree_WhenLookingForNonExistingElement_ThenReturnsFalse() {
|
||||||
|
|
||||||
|
BinaryTree bt = createBinaryTree();
|
||||||
|
|
||||||
|
assertFalse(bt.containsNode(99));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenABinaryTree_WhenDeletingElements_ThenTreeDoesNotContainThoseElements() {
|
||||||
|
|
||||||
|
BinaryTree bt = createBinaryTree();
|
||||||
|
|
||||||
|
assertTrue(bt.containsNode(9));
|
||||||
|
bt.delete(9);
|
||||||
|
assertFalse(bt.containsNode(9));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenABinaryTree_WhenDeletingNonExistingElement_ThenTreeDoesNotDelete() {
|
||||||
|
|
||||||
|
BinaryTree bt = createBinaryTree();
|
||||||
|
|
||||||
|
int initialSize = bt.getSize();
|
||||||
|
|
||||||
|
assertFalse(bt.containsNode(99));
|
||||||
|
bt.delete(99);
|
||||||
|
assertFalse(bt.containsNode(99));
|
||||||
|
assertEquals(initialSize, bt.getSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void it_deletes_the_root() {
|
||||||
|
int value = 12;
|
||||||
|
BinaryTree bt = new BinaryTree();
|
||||||
|
bt.add(value);
|
||||||
|
|
||||||
|
assertTrue(bt.containsNode(value));
|
||||||
|
bt.delete(value);
|
||||||
|
assertFalse(bt.containsNode(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenABinaryTree_WhenTraversingInOrder_ThenPrintValues() {
|
||||||
|
|
||||||
|
BinaryTree bt = createBinaryTree();
|
||||||
|
|
||||||
|
bt.traverseInOrder(bt.root);
|
||||||
|
System.out.println();
|
||||||
|
bt.traverseInOrderWithoutRecursion();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenABinaryTree_WhenTraversingPreOrder_ThenPrintValues() {
|
||||||
|
|
||||||
|
BinaryTree bt = createBinaryTree();
|
||||||
|
|
||||||
|
bt.traversePreOrder(bt.root);
|
||||||
|
System.out.println();
|
||||||
|
bt.traversePreOrderWithoutRecursion();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenABinaryTree_WhenTraversingPostOrder_ThenPrintValues() {
|
||||||
|
|
||||||
|
BinaryTree bt = createBinaryTree();
|
||||||
|
|
||||||
|
bt.traversePostOrder(bt.root);
|
||||||
|
System.out.println();
|
||||||
|
bt.traversePostOrderWithoutRecursion();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenABinaryTree_WhenTraversingLevelOrder_ThenPrintValues() {
|
||||||
|
|
||||||
|
BinaryTree bt = createBinaryTree();
|
||||||
|
|
||||||
|
bt.traverseLevelOrder();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BinaryTree createBinaryTree() {
|
||||||
|
BinaryTree bt = new BinaryTree();
|
||||||
|
|
||||||
|
bt.add(6);
|
||||||
|
bt.add(4);
|
||||||
|
bt.add(8);
|
||||||
|
bt.add(3);
|
||||||
|
bt.add(5);
|
||||||
|
bt.add(7);
|
||||||
|
bt.add(9);
|
||||||
|
|
||||||
|
return bt;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,7 +1,8 @@
|
||||||
package com.baeldung.graph;
|
package com.baeldung.algorithms.dfs;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.baeldung.algorithms.dfs.Graph;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class GraphUnitTest {
|
public class GraphUnitTest {
|
|
@ -1,10 +1,10 @@
|
||||||
package com.baeldung.algorithms.interpolationsearch;
|
package com.baeldung.algorithms.interpolationsearch;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
public class InterpolationSearchUnitTest {
|
public class InterpolationSearchUnitTest {
|
||||||
|
|
||||||
private int[] myData;
|
private int[] myData;
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.baeldung.algorithms.textsearch;
|
||||||
|
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class TextSearchAlgorithmsUnitTest {
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testStringSearchAlgorithms() {
|
||||||
|
String text = "This is some nice text.";
|
||||||
|
String pattern = "some";
|
||||||
|
|
||||||
|
int realPosition = text.indexOf(pattern);
|
||||||
|
Assert.assertTrue(realPosition == TextSearchAlgorithms.simpleTextSearch(pattern.toCharArray(), text.toCharArray()));
|
||||||
|
Assert.assertTrue(realPosition == TextSearchAlgorithms.RabinKarpMethod(pattern.toCharArray(), text.toCharArray()));
|
||||||
|
Assert.assertTrue(realPosition == TextSearchAlgorithms.KnuthMorrisPrattSearch(pattern.toCharArray(), text.toCharArray()));
|
||||||
|
Assert.assertTrue(realPosition == TextSearchAlgorithms.BoyerMooreHorspoolSimpleSearch(pattern.toCharArray(), text.toCharArray()));
|
||||||
|
Assert.assertTrue(realPosition == TextSearchAlgorithms.BoyerMooreHorspoolSearch(pattern.toCharArray(), text.toCharArray()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>algorithms-sorting</artifactId>
|
<artifactId>algorithms-sorting</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>animal-sniffer-mvn-plugin</artifactId>
|
<artifactId>animal-sniffer-mvn-plugin</artifactId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
@ -43,4 +44,5 @@
|
||||||
<animal-sniffer-maven-plugin.version>1.16</animal-sniffer-maven-plugin.version>
|
<animal-sniffer-maven-plugin.version>1.16</animal-sniffer-maven-plugin.version>
|
||||||
<org.codehaus.mojo.signature.java16.version>1.0</org.codehaus.mojo.signature.java16.version>
|
<org.codehaus.mojo.signature.java16.version>1.0</org.codehaus.mojo.signature.java16.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -1,10 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>annotation-processing</artifactId>
|
<artifactId>annotation-processing</artifactId>
|
||||||
<name>annotation-processing</name>
|
<name>annotation-processing</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>annotation-user</artifactId>
|
<artifactId>annotation-user</artifactId>
|
||||||
<name>annotation-user</name>
|
<name>annotation-user</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<artifactId>annotations</artifactId>
|
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>annotations</artifactId>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
<relativePath>../</relativePath>
|
<relativePath>../</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>annotations</artifactId>
|
<artifactId>annotations</artifactId>
|
||||||
<name>annotations</name>
|
<name>annotations</name>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<artifactId>parent-modules</artifactId>
|
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-modules</artifactId>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>antlr</artifactId>
|
<artifactId>antlr</artifactId>
|
||||||
<name>antlr</name>
|
<name>antlr</name>
|
||||||
|
@ -52,9 +53,10 @@
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<antlr.version>4.7.1</antlr.version>
|
<antlr.version>4.7.1</antlr.version>
|
||||||
<mojo.version>3.0.0</mojo.version>
|
<mojo.version>3.0.0</mojo.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -5,7 +5,7 @@
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>apache-avro</artifactId>
|
<artifactId>apache-avro</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
<name>apache-avro</name>
|
<name>apache-avro</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
|
@ -67,5 +67,5 @@
|
||||||
<avro.version>1.8.2</avro.version>
|
<avro.version>1.8.2</avro.version>
|
||||||
<slf4j.version>1.7.25</slf4j.version>
|
<slf4j.version>1.7.25</slf4j.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>apache-bval</groupId>
|
|
||||||
<artifactId>apache-bval</artifactId>
|
<artifactId>apache-bval</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
<name>apache-bval</name>
|
<name>apache-bval</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>parent-modules</artifactId>
|
<artifactId>parent-modules</artifactId>
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>apache-curator</artifactId>
|
<artifactId>apache-curator</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
<name>apache-curator</name>
|
<name>apache-curator</name>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
### Relevant Articles
|
||||||
|
|
||||||
|
- [Introduction to Apache CXF Aegis Data Binding](https://www.baeldung.com/aegis-data-binding-in-apache-cxf)
|
|
@ -1,9 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>cxf-aegis</artifactId>
|
<artifactId>cxf-aegis</artifactId>
|
||||||
<name>cxf-aegis</name>
|
<name>cxf-aegis</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>apache-cxf</artifactId>
|
<artifactId>apache-cxf</artifactId>
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>cxf-introduction</artifactId>
|
<artifactId>cxf-introduction</artifactId>
|
||||||
<name>cxf-introduction</name>
|
<name>cxf-introduction</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>apache-cxf</artifactId>
|
<artifactId>apache-cxf</artifactId>
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>cxf-jaxrs-implementation</artifactId>
|
<artifactId>cxf-jaxrs-implementation</artifactId>
|
||||||
<name>cxf-jaxrs-implementation</name>
|
<name>cxf-jaxrs-implementation</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>apache-cxf</artifactId>
|
<artifactId>apache-cxf</artifactId>
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
### Relevant Articles:
|
||||||
|
|
||||||
|
- [A Guide to Apache CXF with Spring](https://www.baeldung.com/apache-cxf-with-spring)
|
|
@ -1,9 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>cxf-spring</artifactId>
|
<artifactId>cxf-spring</artifactId>
|
||||||
|
<name>cxf-spring</name>
|
||||||
<packaging>war</packaging>
|
<packaging>war</packaging>
|
||||||
<name>cxf-spring</name>
|
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
|
@ -98,7 +99,6 @@
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
</profile>
|
</profile>
|
||||||
|
|
||||||
</profiles>
|
</profiles>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
|
@ -16,6 +16,6 @@
|
||||||
<modules>
|
<modules>
|
||||||
<module>sse-jaxrs-server</module>
|
<module>sse-jaxrs-server</module>
|
||||||
<module>sse-jaxrs-client</module>
|
<module>sse-jaxrs-client</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>sse-jaxrs-client</artifactId>
|
<artifactId>sse-jaxrs-client</artifactId>
|
||||||
<name>sse-jaxrs-client</name>
|
<name>sse-jaxrs-client</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>sse-jaxrs</artifactId>
|
<artifactId>sse-jaxrs</artifactId>
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>apache-fop</artifactId>
|
<artifactId>apache-fop</artifactId>
|
||||||
<version>0.1-SNAPSHOT</version>
|
<version>0.1-SNAPSHOT</version>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<artifactId>apache-geode</artifactId>
|
<artifactId>apache-geode</artifactId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>1.0-SNAPSHOT</version>
|
||||||
<name>apache-geode</name>
|
<name>apache-geode</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>parent-modules</artifactId>
|
<artifactId>parent-modules</artifactId>
|
||||||
|
@ -20,8 +20,9 @@
|
||||||
<version>${geode.core}</version>
|
<version>${geode.core}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<geode.core>1.6.0</geode.core>
|
<geode.core>1.6.0</geode.core>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -1,11 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>apache-meecrowave</artifactId>
|
<artifactId>apache-meecrowave</artifactId>
|
||||||
<version>0.0.1</version>
|
<version>0.0.1</version>
|
||||||
<name>apache-meecrowave</name>
|
<name>apache-meecrowave</name>
|
||||||
<description>A sample REST API application with Meecrowave</description>
|
<description>A sample REST API application with Meecrowave</description>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>parent-modules</artifactId>
|
<artifactId>parent-modules</artifactId>
|
||||||
|
@ -38,7 +39,7 @@
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
|
@ -48,14 +49,15 @@
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<maven.compiler.source>1.8</maven.compiler.source>
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
<maven.compiler.target>1.8</maven.compiler.target>
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
<meecrowave-junit.version>1.2.0</meecrowave-junit.version>
|
<meecrowave-junit.version>1.2.0</meecrowave-junit.version>
|
||||||
<okhttp.version>3.10.0</okhttp.version>
|
<okhttp.version>3.10.0</okhttp.version>
|
||||||
<meecrowave-jpa.version>1.2.1</meecrowave-jpa.version>
|
<meecrowave-jpa.version>1.2.1</meecrowave-jpa.version>
|
||||||
<meecrowave-core.version>1.2.1</meecrowave-core.version>
|
<meecrowave-core.version>1.2.1</meecrowave-core.version>
|
||||||
<meecrowave-maven-plugin.version>1.2.1</meecrowave-maven-plugin.version>
|
<meecrowave-maven-plugin.version>1.2.1</meecrowave-maven-plugin.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -0,0 +1,4 @@
|
||||||
|
### Relevant Articles:
|
||||||
|
|
||||||
|
- [OData Protocol Guide](https://www.baeldung.com/odata)
|
||||||
|
- [Intro to OData with Olingo](https://www.baeldung.com/olingo)
|
|
@ -1,87 +1,87 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>org.baeldung.examples.olingo2</groupId>
|
<groupId>org.baeldung.examples.olingo2</groupId>
|
||||||
<artifactId>olingo2</artifactId>
|
<artifactId>olingo2</artifactId>
|
||||||
<name>olingo2</name>
|
<name>olingo2</name>
|
||||||
<description>Sample Olingo 2 Project</description>
|
<description>Sample Olingo 2 Project</description>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<artifactId>parent-boot-2</artifactId>
|
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-boot-2</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
<relativePath>../../parent-boot-2</relativePath>
|
<relativePath>../../parent-boot-2</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-jersey</artifactId>
|
<artifactId>spring-boot-starter-jersey</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.h2database</groupId>
|
<groupId>com.h2database</groupId>
|
||||||
<artifactId>h2</artifactId>
|
<artifactId>h2</artifactId>
|
||||||
<scope>runtime</scope>
|
<scope>runtime</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-configuration-processor</artifactId>
|
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-test</artifactId>
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- Olingo 2 Dependencies -->
|
<!-- Olingo 2 Dependencies -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.olingo</groupId>
|
<groupId>org.apache.olingo</groupId>
|
||||||
<artifactId>olingo-odata2-core</artifactId>
|
<artifactId>olingo-odata2-core</artifactId>
|
||||||
<version>${olingo2.version}</version>
|
<version>${olingo2.version}</version>
|
||||||
<!-- Avoid jax-rs version conflict by excluding Olingo's version -->
|
<!-- Avoid jax-rs version conflict by excluding Olingo's version -->
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>javax.ws.rs</groupId>
|
<groupId>javax.ws.rs</groupId>
|
||||||
<artifactId>javax.ws.rs-api</artifactId>
|
<artifactId>javax.ws.rs-api</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.olingo</groupId>
|
<groupId>org.apache.olingo</groupId>
|
||||||
<artifactId>olingo-odata2-jpa-processor-core</artifactId>
|
<artifactId>olingo-odata2-jpa-processor-core</artifactId>
|
||||||
<version>${olingo2.version}</version>
|
<version>${olingo2.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.olingo</groupId>
|
<groupId>org.apache.olingo</groupId>
|
||||||
<artifactId>olingo-odata2-jpa-processor-ref</artifactId>
|
<artifactId>olingo-odata2-jpa-processor-ref</artifactId>
|
||||||
<version>${olingo2.version}</version>
|
<version>${olingo2.version}</version>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.eclipse.persistence</groupId>
|
<groupId>org.eclipse.persistence</groupId>
|
||||||
<artifactId>eclipselink</artifactId>
|
<artifactId>eclipselink</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<olingo2.version>2.0.11</olingo2.version>
|
<olingo2.version>2.0.11</olingo2.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>apache-opennlp</artifactId>
|
<artifactId>apache-opennlp</artifactId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>apache-poi</artifactId>
|
<artifactId>apache-poi</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.baeldung.pulsar</groupId>
|
<groupId>com.baeldung.pulsar</groupId>
|
||||||
<artifactId>apache-pulsar</artifactId>
|
<artifactId>apache-pulsar</artifactId>
|
||||||
|
@ -22,8 +22,9 @@
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<pulsar-client.version>2.1.1-incubating</pulsar-client.version>
|
<pulsar-client.version>2.1.1-incubating</pulsar-client.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -6,10 +6,10 @@
|
||||||
<artifactId>apache-shiro</artifactId>
|
<artifactId>apache-shiro</artifactId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>1.0-SNAPSHOT</version>
|
||||||
<name>apache-shiro</name>
|
<name>apache-shiro</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<artifactId>parent-boot-1</artifactId>
|
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-boot-1</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
<relativePath>../parent-boot-1</relativePath>
|
<relativePath>../parent-boot-1</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>apache-solrj</artifactId>
|
<artifactId>apache-solrj</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
|
|
@ -1,90 +1,112 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>apache-spark</artifactId>
|
<artifactId>apache-spark</artifactId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>1.0-SNAPSHOT</version>
|
||||||
<name>apache-spark</name>
|
<name>apache-spark</name>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<url>http://maven.apache.org</url>
|
<url>http://maven.apache.org</url>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>parent-modules</artifactId>
|
<artifactId>parent-modules</artifactId>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.spark</groupId>
|
<groupId>org.apache.spark</groupId>
|
||||||
<artifactId>spark-core_2.11</artifactId>
|
<artifactId>spark-core_2.11</artifactId>
|
||||||
<version>${org.apache.spark.spark-core.version}</version>
|
<version>${org.apache.spark.spark-core.version}</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.spark</groupId>
|
<groupId>org.apache.spark</groupId>
|
||||||
<artifactId>spark-sql_2.11</artifactId>
|
<artifactId>spark-sql_2.11</artifactId>
|
||||||
<version>${org.apache.spark.spark-sql.version}</version>
|
<version>${org.apache.spark.spark-sql.version}</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.spark</groupId>
|
<groupId>org.apache.spark</groupId>
|
||||||
<artifactId>spark-streaming_2.11</artifactId>
|
<artifactId>spark-graphx_2.11</artifactId>
|
||||||
<version>${org.apache.spark.spark-streaming.version}</version>
|
<version>${org.apache.spark.spark-graphx.version}</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.spark</groupId>
|
<groupId>graphframes</groupId>
|
||||||
<artifactId>spark-mllib_2.11</artifactId>
|
<artifactId>graphframes</artifactId>
|
||||||
<version>${org.apache.spark.spark-mllib.version}</version>
|
<version>${graphframes.version}</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.spark</groupId>
|
<groupId>org.apache.spark</groupId>
|
||||||
<artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
|
<artifactId>spark-streaming_2.11</artifactId>
|
||||||
<version>${org.apache.spark.spark-streaming-kafka.version}</version>
|
<version>${org.apache.spark.spark-streaming.version}</version>
|
||||||
</dependency>
|
<scope>provided</scope>
|
||||||
<dependency>
|
</dependency>
|
||||||
<groupId>com.datastax.spark</groupId>
|
<dependency>
|
||||||
<artifactId>spark-cassandra-connector_2.11</artifactId>
|
<groupId>org.apache.spark</groupId>
|
||||||
<version>${com.datastax.spark.spark-cassandra-connector.version}</version>
|
<artifactId>spark-mllib_2.11</artifactId>
|
||||||
</dependency>
|
<version>${org.apache.spark.spark-mllib.version}</version>
|
||||||
<dependency>
|
<scope>provided</scope>
|
||||||
<groupId>com.datastax.spark</groupId>
|
</dependency>
|
||||||
<artifactId>spark-cassandra-connector-java_2.11</artifactId>
|
<dependency>
|
||||||
<version>${com.datastax.spark.spark-cassandra-connector-java.version}</version>
|
<groupId>org.apache.spark</groupId>
|
||||||
</dependency>
|
<artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
|
||||||
</dependencies>
|
<version>${org.apache.spark.spark-streaming-kafka.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.datastax.spark</groupId>
|
||||||
|
<artifactId>spark-cassandra-connector_2.11</artifactId>
|
||||||
|
<version>${com.datastax.spark.spark-cassandra-connector.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.datastax.spark</groupId>
|
||||||
|
<artifactId>spark-cassandra-connector-java_2.11</artifactId>
|
||||||
|
<version>${com.datastax.spark.spark-cassandra-connector-java.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-assembly-plugin</artifactId>
|
<artifactId>maven-assembly-plugin</artifactId>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<phase>package</phase>
|
<phase>package</phase>
|
||||||
<goals>
|
<goals>
|
||||||
<goal>single</goal>
|
<goal>single</goal>
|
||||||
</goals>
|
</goals>
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
<configuration>
|
<configuration>
|
||||||
<descriptorRefs>
|
<descriptorRefs>
|
||||||
<descriptorRef>jar-with-dependencies</descriptorRef>
|
<descriptorRef>jar-with-dependencies</descriptorRef>
|
||||||
</descriptorRefs>
|
</descriptorRefs>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
<properties>
|
<repositories>
|
||||||
<org.apache.spark.spark-core.version>2.3.0</org.apache.spark.spark-core.version>
|
<repository>
|
||||||
<org.apache.spark.spark-sql.version>2.3.0</org.apache.spark.spark-sql.version>
|
<id>SparkPackagesRepo</id>
|
||||||
<org.apache.spark.spark-streaming.version>2.3.0</org.apache.spark.spark-streaming.version>
|
<url>http://dl.bintray.com/spark-packages/maven</url>
|
||||||
<org.apache.spark.spark-mllib.version>2.3.0</org.apache.spark.spark-mllib.version>
|
</repository>
|
||||||
<org.apache.spark.spark-streaming-kafka.version>2.3.0</org.apache.spark.spark-streaming-kafka.version>
|
</repositories>
|
||||||
<com.datastax.spark.spark-cassandra-connector.version>2.3.0</com.datastax.spark.spark-cassandra-connector.version>
|
|
||||||
<com.datastax.spark.spark-cassandra-connector-java.version>1.5.2</com.datastax.spark.spark-cassandra-connector-java.version>
|
<properties>
|
||||||
</properties>
|
<org.apache.spark.spark-core.version>2.3.0</org.apache.spark.spark-core.version>
|
||||||
|
<org.apache.spark.spark-sql.version>2.3.0</org.apache.spark.spark-sql.version>
|
||||||
|
<org.apache.spark.spark-streaming.version>2.3.0</org.apache.spark.spark-streaming.version>
|
||||||
|
<org.apache.spark.spark-mllib.version>2.3.0</org.apache.spark.spark-mllib.version>
|
||||||
|
<org.apache.spark.spark-graphx.version>2.3.0</org.apache.spark.spark-graphx.version>
|
||||||
|
<graphframes.version>0.7.0-spark2.4-s_2.11</graphframes.version>
|
||||||
|
<org.apache.spark.spark-streaming-kafka.version>2.3.0</org.apache.spark.spark-streaming-kafka.version>
|
||||||
|
<com.datastax.spark.spark-cassandra-connector.version>2.3.0</com.datastax.spark.spark-cassandra-connector.version>
|
||||||
|
<com.datastax.spark.spark-cassandra-connector-java.version>1.5.2</com.datastax.spark.spark-cassandra-connector-java.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
package com.baeldung.graphframes;
|
||||||
|
|
||||||
|
import org.apache.log4j.Level;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.apache.spark.api.java.function.VoidFunction;
|
||||||
|
import org.apache.spark.graphx.Edge;
|
||||||
|
import org.apache.spark.graphx.Graph;
|
||||||
|
import org.apache.spark.graphx.VertexRDD;
|
||||||
|
import org.graphframes.GraphFrame;
|
||||||
|
import scala.Tuple2;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class GraphExperiments {
|
||||||
|
public static Map<Long, User> USERS = new HashMap<>();
|
||||||
|
|
||||||
|
public static void main(String[] args) throws IOException {
|
||||||
|
Logger.getLogger("org").setLevel(Level.OFF);
|
||||||
|
GraphLoader loader = new GraphLoader();
|
||||||
|
GraphFrame graph = loader.getGraphFrameUserRelationship();
|
||||||
|
|
||||||
|
GraphExperiments experiments = new GraphExperiments();
|
||||||
|
experiments.doGraphFrameOperations(graph);
|
||||||
|
experiments.doGraphFrameAlgorithms(graph);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doGraphFrameOperations(GraphFrame graph) {
|
||||||
|
graph.vertices().show();
|
||||||
|
graph.edges().show();
|
||||||
|
|
||||||
|
graph.vertices().filter("name = 'Martin'").show();
|
||||||
|
|
||||||
|
graph.filterEdges("type = 'Friend'")
|
||||||
|
.dropIsolatedVertices().vertices().show();
|
||||||
|
|
||||||
|
graph.degrees().show();
|
||||||
|
graph.inDegrees().show();
|
||||||
|
graph.outDegrees().show();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doGraphFrameAlgorithms(GraphFrame graph) {
|
||||||
|
|
||||||
|
graph.pageRank().maxIter(20).resetProbability(0.15).run().vertices().show();
|
||||||
|
|
||||||
|
graph.connectedComponents().run().show();
|
||||||
|
|
||||||
|
graph.triangleCount().run().show();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
package com.baeldung.graphframes;
|
||||||
|
|
||||||
|
import org.apache.spark.SparkConf;
|
||||||
|
import org.apache.spark.api.java.JavaSparkContext;
|
||||||
|
import org.apache.spark.sql.Dataset;
|
||||||
|
import org.apache.spark.sql.Row;
|
||||||
|
import org.apache.spark.sql.SparkSession;
|
||||||
|
import org.graphframes.GraphFrame;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class GraphLoader {
|
||||||
|
|
||||||
|
public JavaSparkContext getSparkContext() throws IOException {
|
||||||
|
Path temp = Files.createTempDirectory("sparkGraphFrames");
|
||||||
|
SparkConf sparkConf = new SparkConf().setAppName("SparkGraphX").setMaster("local[*]");
|
||||||
|
JavaSparkContext javaSparkContext = new JavaSparkContext(sparkConf);
|
||||||
|
javaSparkContext.setCheckpointDir(temp.toString());
|
||||||
|
return javaSparkContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GraphFrame getGraphFrameUserRelationship() throws IOException {
|
||||||
|
Path temp = Files.createTempDirectory("sparkGraphFrames");
|
||||||
|
SparkSession session = SparkSession.builder()
|
||||||
|
.appName("SparkGraphFrameSample")
|
||||||
|
.config("spark.sql.warehouse.dir", temp.toString())
|
||||||
|
.sparkContext(getSparkContext().sc())
|
||||||
|
.master("local[*]")
|
||||||
|
.getOrCreate();
|
||||||
|
List<User> users = loadUsers();
|
||||||
|
|
||||||
|
Dataset<Row> userDataset = session.createDataFrame(users, User.class);
|
||||||
|
|
||||||
|
List<Relationship> relationshipsList = getRelations();
|
||||||
|
Dataset<Row> relationshipDataset = session.createDataFrame(relationshipsList, Relationship.class);
|
||||||
|
|
||||||
|
GraphFrame graphFrame = new GraphFrame(userDataset, relationshipDataset);
|
||||||
|
|
||||||
|
return graphFrame;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Relationship> getRelations() {
|
||||||
|
List<Relationship> relationships = new ArrayList<>();
|
||||||
|
relationships.add(new Relationship("Friend", "1", "2"));
|
||||||
|
relationships.add(new Relationship("Following", "1", "4"));
|
||||||
|
relationships.add(new Relationship("Friend", "2", "4"));
|
||||||
|
relationships.add(new Relationship("Relative", "3", "1"));
|
||||||
|
relationships.add(new Relationship("Relative", "3", "4"));
|
||||||
|
|
||||||
|
return relationships;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<User> loadUsers() {
|
||||||
|
User john = new User(1L, "John");
|
||||||
|
User martin = new User(2L, "Martin");
|
||||||
|
User peter = new User(3L, "Peter");
|
||||||
|
User alicia = new User(4L, "Alicia");
|
||||||
|
|
||||||
|
List<User> users = new ArrayList<>();
|
||||||
|
|
||||||
|
users.add(new User(1L, "John"));
|
||||||
|
users.add(new User(2L, "Martin"));
|
||||||
|
users.add(new User(3L, "Peter"));
|
||||||
|
users.add(new User(4L, "Alicia"));
|
||||||
|
|
||||||
|
return users;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
package com.baeldung.graphframes;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class Relationship implements Serializable {
|
||||||
|
private String type;
|
||||||
|
private String src;
|
||||||
|
private String dst;
|
||||||
|
private UUID id;
|
||||||
|
|
||||||
|
public Relationship(String type, String src, String dst) {
|
||||||
|
this.type = type;
|
||||||
|
this.src = src;
|
||||||
|
this.dst = dst;
|
||||||
|
this.id = UUID.randomUUID();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSrc() {
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDst() {
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return getSrc() + " -- " + getType() + " --> " + getDst();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package com.baeldung.graphframes;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class User implements Serializable {
|
||||||
|
|
||||||
|
private Long id;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public User(long id, String name) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "<" + id + "," + name + ">";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,149 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>apache-tapestry</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<name>apache-tapestry</name>
|
||||||
|
<packaging>war</packaging>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<!-- To set up an application with a database, change the artifactId below to
|
||||||
|
tapestry-hibernate, and add a dependency on your JDBC driver. You'll also
|
||||||
|
need to add Hibernate configuration files, such as hibernate.cfg.xml. -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tapestry</groupId>
|
||||||
|
<artifactId>tapestry-core</artifactId>
|
||||||
|
<version>${tapestry-release-version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Include the Log4j implementation for the SLF4J logging framework -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-log4j12</artifactId>
|
||||||
|
<version>${slf4j-release-version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tapestry</groupId>
|
||||||
|
<artifactId>tapestry-webresources</artifactId>
|
||||||
|
<version>${tapestry-release-version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Uncomment this to add support for file uploads: -->
|
||||||
|
<!--
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tapestry</groupId>
|
||||||
|
<artifactId>tapestry-upload</artifactId>
|
||||||
|
<version>${tapestry-release-version}</version>
|
||||||
|
</dependency>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- A dependency on either JUnit or TestNG is required, or the surefire plugin (which runs the tests)
|
||||||
|
will fail, preventing Maven from packaging the WAR. Tapestry includes a large number
|
||||||
|
of testing facilities designed for use with TestNG (http://testng.org/), so it's recommended. -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.testng</groupId>
|
||||||
|
<artifactId>testng</artifactId>
|
||||||
|
<version>${testng-release-version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tapestry</groupId>
|
||||||
|
<artifactId>tapestry-test</artifactId>
|
||||||
|
<version>${tapestry-release-version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Provided by the servlet container, but sometimes referenced in the application
|
||||||
|
code. -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.servlet</groupId>
|
||||||
|
<artifactId>servlet-api</artifactId>
|
||||||
|
<version>${servlet-api-release-version}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Provide dependency to the Tapestry javadoc taglet which replaces the Maven component report -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tapestry</groupId>
|
||||||
|
<artifactId>tapestry-javadoc</artifactId>
|
||||||
|
<version>${tapestry-release-version}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<finalName>apache-tapestry</finalName>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>2.3.2</version>
|
||||||
|
<configuration>
|
||||||
|
<source>1.8</source>
|
||||||
|
<target>1.8</target>
|
||||||
|
<optimize>true</optimize>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>2.7.2</version>
|
||||||
|
<configuration>
|
||||||
|
<systemPropertyVariables>
|
||||||
|
<tapestry.execution-mode>Qa</tapestry.execution-mode>
|
||||||
|
</systemPropertyVariables>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Run the application using "mvn jetty:run" -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.mortbay.jetty</groupId>
|
||||||
|
<artifactId>maven-jetty-plugin</artifactId>
|
||||||
|
<version>6.1.16</version>
|
||||||
|
<configuration>
|
||||||
|
<!-- Log to the console. -->
|
||||||
|
<requestLog implementation="org.mortbay.jetty.NCSARequestLog">
|
||||||
|
<!-- This doesn't do anything for Jetty, but is a workaround for a Maven bug
|
||||||
|
that prevents the requestLog from being set. -->
|
||||||
|
<append>true</append>
|
||||||
|
</requestLog>
|
||||||
|
<systemProperties>
|
||||||
|
<systemProperty>
|
||||||
|
<name>tapestry.execution-mode</name>
|
||||||
|
<value>development</value>
|
||||||
|
</systemProperty>
|
||||||
|
</systemProperties>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<reporting/>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>jboss</id>
|
||||||
|
<url>http://repository.jboss.org/nexus/content/groups/public/</url>
|
||||||
|
</repository>
|
||||||
|
|
||||||
|
<!-- This repository is only needed when the Tapestry version is a preview release, rather
|
||||||
|
than a final release. -->
|
||||||
|
<repository>
|
||||||
|
<id>apache-staging</id>
|
||||||
|
<url>https://repository.apache.org/content/groups/staging/</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<tapestry-release-version>5.4.5</tapestry-release-version>
|
||||||
|
<servlet-api-release-version>2.5</servlet-api-release-version>
|
||||||
|
<testng-release-version>6.8.21</testng-release-version>
|
||||||
|
<slf4j-release-version>1.7.19</slf4j-release-version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.baeldung.tapestry.components;
|
||||||
|
|
||||||
|
import org.apache.tapestry5.BindingConstants;
|
||||||
|
import org.apache.tapestry5.annotations.Parameter;
|
||||||
|
import org.apache.tapestry5.annotations.Property;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Layout component for pages of application.
|
||||||
|
*/
|
||||||
|
public class Layout {
|
||||||
|
|
||||||
|
@Property
|
||||||
|
@Parameter(required = true, defaultPrefix = BindingConstants.LITERAL)
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
package com.baeldung.tapestry.pages;
|
||||||
|
|
||||||
|
public class Error404 {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
package com.baeldung.tapestry.pages;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import org.apache.tapestry5.Block;
|
||||||
|
import org.apache.tapestry5.annotations.Log;
|
||||||
|
import org.apache.tapestry5.annotations.Property;
|
||||||
|
import org.apache.tapestry5.ioc.annotations.Inject;
|
||||||
|
import org.apache.tapestry5.services.ajax.AjaxResponseRenderer;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
public class Home {
|
||||||
|
|
||||||
|
@Property
|
||||||
|
private String appName = "apache-tapestry";
|
||||||
|
|
||||||
|
public Date getCurrentTime() {
|
||||||
|
return new Date();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private Logger logger;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private AjaxResponseRenderer ajaxResponseRenderer;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private Block ajaxBlock;
|
||||||
|
|
||||||
|
@Log
|
||||||
|
void onCallAjax() {
|
||||||
|
logger.info("Ajax call");
|
||||||
|
ajaxResponseRenderer.addRender("ajaxZone", ajaxBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
package com.baeldung.tapestry.pages;
|
||||||
|
|
||||||
|
|
||||||
|
import org.apache.tapestry5.Block;
|
||||||
|
import org.apache.tapestry5.EventContext;
|
||||||
|
import org.apache.tapestry5.SymbolConstants;
|
||||||
|
import org.apache.tapestry5.annotations.InjectPage;
|
||||||
|
import org.apache.tapestry5.annotations.Log;
|
||||||
|
import org.apache.tapestry5.annotations.Property;
|
||||||
|
import org.apache.tapestry5.ioc.annotations.Inject;
|
||||||
|
import org.apache.tapestry5.ioc.annotations.Symbol;
|
||||||
|
import org.apache.tapestry5.services.HttpError;
|
||||||
|
import org.apache.tapestry5.services.ajax.AjaxResponseRenderer;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start page of application apache-tapestry.
|
||||||
|
*/
|
||||||
|
public class Index {
|
||||||
|
@Inject
|
||||||
|
private Logger logger;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private AjaxResponseRenderer ajaxResponseRenderer;
|
||||||
|
|
||||||
|
@Property
|
||||||
|
@Inject
|
||||||
|
@Symbol(SymbolConstants.TAPESTRY_VERSION)
|
||||||
|
private String tapestryVersion;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private Block block;
|
||||||
|
|
||||||
|
// Handle call with an unwanted context
|
||||||
|
Object onActivate(EventContext eventContext) {
|
||||||
|
return eventContext.getCount() > 0 ?
|
||||||
|
new HttpError(404, "Resource not found") :
|
||||||
|
null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Log
|
||||||
|
void onComplete() {
|
||||||
|
logger.info("Complete call on Index page");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Log
|
||||||
|
void onAjax() {
|
||||||
|
logger.info("Ajax call on Index page");
|
||||||
|
|
||||||
|
ajaxResponseRenderer.addRender("middlezone", block);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getCurrentTime() {
|
||||||
|
return new Date();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
package com.baeldung.tapestry.pages;
|
||||||
|
|
||||||
|
import org.apache.tapestry5.alerts.AlertManager;
|
||||||
|
import org.apache.tapestry5.annotations.InjectComponent;
|
||||||
|
import org.apache.tapestry5.annotations.Property;
|
||||||
|
import org.apache.tapestry5.corelib.components.Form;
|
||||||
|
import org.apache.tapestry5.ioc.annotations.Inject;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
public class Login {
|
||||||
|
@Inject
|
||||||
|
private Logger logger;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private AlertManager alertManager;
|
||||||
|
|
||||||
|
@InjectComponent
|
||||||
|
private Form login;
|
||||||
|
|
||||||
|
@Property
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
@Property
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
void onValidateFromLogin() {
|
||||||
|
if(email == null || password == null) {
|
||||||
|
alertManager.error("Email/Password is null");
|
||||||
|
login.recordError("Validation failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Object onSuccessFromLogin() {
|
||||||
|
alertManager.success("Welcome! Login Successful");
|
||||||
|
return Home.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
void onFailureFromLogin() {
|
||||||
|
alertManager.error("Please try again with correct credentials");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,128 @@
|
||||||
|
package com.baeldung.tapestry.services;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.apache.tapestry5.SymbolConstants;
|
||||||
|
import org.apache.tapestry5.ioc.MappedConfiguration;
|
||||||
|
import org.apache.tapestry5.ioc.OrderedConfiguration;
|
||||||
|
import org.apache.tapestry5.ioc.ServiceBinder;
|
||||||
|
import org.apache.tapestry5.ioc.annotations.Contribute;
|
||||||
|
import org.apache.tapestry5.ioc.annotations.Local;
|
||||||
|
import org.apache.tapestry5.ioc.services.ApplicationDefaults;
|
||||||
|
import org.apache.tapestry5.ioc.services.SymbolProvider;
|
||||||
|
import org.apache.tapestry5.services.Request;
|
||||||
|
import org.apache.tapestry5.services.RequestFilter;
|
||||||
|
import org.apache.tapestry5.services.RequestHandler;
|
||||||
|
import org.apache.tapestry5.services.Response;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This module is automatically included as part of the Tapestry IoC Registry, it's a good place to
|
||||||
|
* configure and extend Tapestry, or to place your own service definitions.
|
||||||
|
*/
|
||||||
|
public class AppModule {
|
||||||
|
public static void bind(ServiceBinder binder) {
|
||||||
|
// binder.bind(MyServiceInterface.class, MyServiceImpl.class);
|
||||||
|
|
||||||
|
// Make bind() calls on the binder object to define most IoC services.
|
||||||
|
// Use service builder methods (example below) when the implementation
|
||||||
|
// is provided inline, or requires more initialization than simply
|
||||||
|
// invoking the constructor.
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void contributeFactoryDefaults(
|
||||||
|
MappedConfiguration<String, Object> configuration) {
|
||||||
|
// The values defined here (as factory default overrides) are themselves
|
||||||
|
// overridden with application defaults by DevelopmentModule and QaModule.
|
||||||
|
|
||||||
|
// The application version is primarily useful as it appears in
|
||||||
|
// any exception reports (HTML or textual).
|
||||||
|
configuration.override(SymbolConstants.APPLICATION_VERSION, "0.0.1-SNAPSHOT");
|
||||||
|
|
||||||
|
// This is something that should be removed when going to production, but is useful
|
||||||
|
// in the early stages of development.
|
||||||
|
configuration.override(SymbolConstants.PRODUCTION_MODE, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void contributeApplicationDefaults(
|
||||||
|
MappedConfiguration<String, Object> configuration) {
|
||||||
|
// Contributions to ApplicationDefaults will override any contributions to
|
||||||
|
// FactoryDefaults (with the same key). Here we're restricting the supported
|
||||||
|
// locales to just "en" (English). As you add localised message catalogs and other assets,
|
||||||
|
// you can extend this list of locales (it's a comma separated series of locale names;
|
||||||
|
// the first locale name is the default when there's no reasonable match).
|
||||||
|
configuration.add(SymbolConstants.SUPPORTED_LOCALES, "en");
|
||||||
|
|
||||||
|
// You should change the passphrase immediately; the HMAC passphrase is used to secure
|
||||||
|
// the hidden field data stored in forms to encrypt and digitally sign client-side data.
|
||||||
|
configuration.add(SymbolConstants.HMAC_PASSPHRASE, "change this immediately");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use annotation or method naming convention: <code>contributeApplicationDefaults</code>
|
||||||
|
*/
|
||||||
|
@Contribute(SymbolProvider.class)
|
||||||
|
@ApplicationDefaults
|
||||||
|
public static void setupEnvironment(MappedConfiguration<String, Object> configuration) {
|
||||||
|
// Support for jQuery is new in Tapestry 5.4 and will become the only supported
|
||||||
|
// option in 5.5.
|
||||||
|
configuration.add(SymbolConstants.JAVASCRIPT_INFRASTRUCTURE_PROVIDER, "jquery");
|
||||||
|
configuration.add(SymbolConstants.BOOTSTRAP_ROOT, "context:mybootstrap");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a service definition, the service will be named "TimingFilter". The interface,
|
||||||
|
* RequestFilter, is used within the RequestHandler service pipeline, which is built from the
|
||||||
|
* RequestHandler service configuration. Tapestry IoC is responsible for passing in an
|
||||||
|
* appropriate Logger instance. Requests for static resources are handled at a higher level, so
|
||||||
|
* this filter will only be invoked for Tapestry related requests.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Service builder methods are useful when the implementation is inline as an inner class
|
||||||
|
* (as here) or require some other kind of special initialization. In most cases,
|
||||||
|
* use the static bind() method instead.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* If this method was named "build", then the service id would be taken from the
|
||||||
|
* service interface and would be "RequestFilter". Since Tapestry already defines
|
||||||
|
* a service named "RequestFilter" we use an explicit service id that we can reference
|
||||||
|
* inside the contribution method.
|
||||||
|
*/
|
||||||
|
public RequestFilter buildTimingFilter(final Logger log) {
|
||||||
|
return new RequestFilter() {
|
||||||
|
public boolean service(Request request, Response response, RequestHandler handler)
|
||||||
|
throws IOException {
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
try {
|
||||||
|
// The responsibility of a filter is to invoke the corresponding method
|
||||||
|
// in the handler. When you chain multiple filters together, each filter
|
||||||
|
// received a handler that is a bridge to the next filter.
|
||||||
|
|
||||||
|
return handler.service(request, response);
|
||||||
|
} finally {
|
||||||
|
long elapsed = System.currentTimeMillis() - startTime;
|
||||||
|
|
||||||
|
log.info("Request time: {} ms", elapsed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a contribution to the RequestHandler service configuration. This is how we extend
|
||||||
|
* Tapestry using the timing filter. A common use for this kind of filter is transaction
|
||||||
|
* management or security. The @Local annotation selects the desired service by type, but only
|
||||||
|
* from the same module. Without @Local, there would be an error due to the other service(s)
|
||||||
|
* that implement RequestFilter (defined in other modules).
|
||||||
|
*/
|
||||||
|
@Contribute(RequestHandler.class)
|
||||||
|
public void addTimingFilter(OrderedConfiguration<RequestFilter> configuration, @Local RequestFilter filter) {
|
||||||
|
// Each contribution to an ordered configuration has a name, When necessary, you may
|
||||||
|
// set constraints to precisely control the invocation order of the contributed filter
|
||||||
|
// within the pipeline.
|
||||||
|
|
||||||
|
configuration.add("Timing", filter);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.baeldung.tapestry.services;
|
||||||
|
|
||||||
|
import org.apache.tapestry5.SymbolConstants;
|
||||||
|
import org.apache.tapestry5.ioc.MappedConfiguration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This module is automatically included as part of the Tapestry IoC Registry if <em>tapestry.execution-mode</em>
|
||||||
|
* includes <code>development</code>.
|
||||||
|
*/
|
||||||
|
public class DevelopmentModule {
|
||||||
|
public static void contributeApplicationDefaults(
|
||||||
|
MappedConfiguration<String, Object> configuration) {
|
||||||
|
// The factory default is true but during the early stages of an application
|
||||||
|
// overriding to false is a good idea. In addition, this is often overridden
|
||||||
|
// on the command line as -Dtapestry.production-mode=false
|
||||||
|
configuration.add(SymbolConstants.PRODUCTION_MODE, false);
|
||||||
|
|
||||||
|
// The application version number is incorprated into URLs for some
|
||||||
|
// assets. Web browsers will cache assets because of the far future expires
|
||||||
|
// header. If existing assets are changed, the version number should also
|
||||||
|
// change, to force the browser to download new versions.
|
||||||
|
configuration.add(SymbolConstants.APPLICATION_VERSION, "0.0.1-SNAPSHOT-DEV");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package com.baeldung.tapestry.services;
|
||||||
|
|
||||||
|
import org.apache.tapestry5.SymbolConstants;
|
||||||
|
import org.apache.tapestry5.ioc.MappedConfiguration;
|
||||||
|
import org.apache.tapestry5.ioc.ServiceBinder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This module is automatically included as part of the Tapestry IoC Registry if <em>tapestry.execution-mode</em>
|
||||||
|
* includes <code>qa</code> ("quality assurance").
|
||||||
|
*/
|
||||||
|
public class QaModule
|
||||||
|
{
|
||||||
|
public static void bind(ServiceBinder binder)
|
||||||
|
{
|
||||||
|
// Bind any services needed by the QA team to produce their reports
|
||||||
|
// binder.bind(MyServiceMonitorInterface.class, MyServiceMonitorImpl.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void contributeApplicationDefaults(
|
||||||
|
MappedConfiguration<String, Object> configuration)
|
||||||
|
{
|
||||||
|
// The factory default is true but during the early stages of an application
|
||||||
|
// overriding to false is a good idea. In addition, this is often overridden
|
||||||
|
// on the command line as -Dtapestry.production-mode=false
|
||||||
|
configuration.add(SymbolConstants.PRODUCTION_MODE, false);
|
||||||
|
|
||||||
|
// The application version number is incorprated into URLs for some
|
||||||
|
// assets. Web browsers will cache assets because of the far future expires
|
||||||
|
// header. If existing assets are changed, the version number should also
|
||||||
|
// change, to force the browser to download new versions.
|
||||||
|
configuration.add(SymbolConstants.APPLICATION_VERSION, "0.0.1-SNAPSHOT-QA");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd">
|
||||||
|
<head>
|
||||||
|
<title>${title}</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="span12">
|
||||||
|
<t:alerts/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="container">
|
||||||
|
<t:body />
|
||||||
|
<hr />
|
||||||
|
<footer>
|
||||||
|
<p>© Your Company</p>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,13 @@
|
||||||
|
<configuration>
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<layout class="ch.qos.logback.classic.PatternLayout">
|
||||||
|
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<logger name="com.baeldung.tapestry" level="TRACE"/>
|
||||||
|
|
||||||
|
<root level="info">
|
||||||
|
<appender-ref ref="STDOUT"/>
|
||||||
|
</root>
|
||||||
|
</configuration>
|
|
@ -0,0 +1,11 @@
|
||||||
|
<html t:type="layout" title="Not found apache-tapestry"
|
||||||
|
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
|
||||||
|
xmlns:p="tapestry:parameter">
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="span12">
|
||||||
|
<h1>Requested page not found!</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</html>
|
|
@ -0,0 +1 @@
|
||||||
|
introMsg=Welcome to the Apache Tapestry Tutorial
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue