Merge branch 'master' into master
This commit is contained in:
		
						commit
						fc3a9264d7
					
				| @ -3,7 +3,8 @@ language: java | ||||
| before_install:  | ||||
|   - echo "MAVEN_OPTS='-Xmx2048M -Xss128M -XX:+CMSClassUnloadingEnabled -XX:+UseG1GC -XX:-UseGCOverheadLimit'" > ~/.mavenrc | ||||
| 
 | ||||
| install: travis_wait 60 mvn -q test -fae | ||||
| install: skip | ||||
| script: travis_wait 60 mvn -q test -fae | ||||
| 
 | ||||
| sudo: required | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										129
									
								
								activejdbc/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								activejdbc/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,129 @@ | ||||
| <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> | ||||
|   <groupId>com.baeldung</groupId> | ||||
|   <artifactId>activejdbc</artifactId> | ||||
|   <version>1.0-SNAPSHOT</version> | ||||
|   <packaging>jar</packaging> | ||||
|   <name>activejdbc</name> | ||||
|   <url>http://maven.apache.org</url> | ||||
|   <properties> | ||||
|     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||
|     <activejdbc.version>1.4.13</activejdbc.version> | ||||
|     <environments>development.test,development</environments> | ||||
|   </properties> | ||||
|   <build> | ||||
|     <plugins> | ||||
|       <plugin> | ||||
|         <groupId>org.apache.maven.plugins</groupId> | ||||
|         <artifactId>maven-compiler-plugin</artifactId> | ||||
|         <version>3.6.0</version> | ||||
|         <configuration> | ||||
|           <source>1.8</source> | ||||
|           <target>1.8</target> | ||||
|           <encoding>UTF-8</encoding> | ||||
|         </configuration> | ||||
|       </plugin> | ||||
|       <plugin> | ||||
|         <groupId>org.javalite</groupId> | ||||
|         <artifactId>activejdbc-instrumentation</artifactId> | ||||
|         <version>${activejdbc.version}</version> | ||||
|         <executions> | ||||
|           <execution> | ||||
|             <phase>process-classes</phase> | ||||
|             <goals> | ||||
|               <goal>instrument</goal> | ||||
|             </goals> | ||||
|           </execution> | ||||
|         </executions> | ||||
|       </plugin> | ||||
|       <plugin> | ||||
|         <groupId>org.javalite</groupId> | ||||
|         <artifactId>db-migrator-maven-plugin</artifactId> | ||||
|         <version>${activejdbc.version}</version> | ||||
|         <configuration> | ||||
|           <configFile>${project.basedir}/src/main/resources/database.properties</configFile> | ||||
|           <environments>${environments}</environments> | ||||
|         </configuration> | ||||
|         <dependencies> | ||||
|           <dependency> | ||||
|             <groupId>mysql</groupId> | ||||
|             <artifactId>mysql-connector-java</artifactId> | ||||
|             <version>5.1.34</version> | ||||
|           </dependency> | ||||
|         </dependencies> | ||||
|       </plugin> | ||||
|       <plugin> | ||||
|         <groupId>org.apache.maven.plugins</groupId> | ||||
|         <artifactId>maven-surefire-plugin</artifactId> | ||||
|         <version>2.18.1</version> | ||||
|         <configuration> | ||||
|           <reportFormat>brief</reportFormat> | ||||
|           <trimStackTrace>true</trimStackTrace> | ||||
|           <useFile>false</useFile> | ||||
|           <includes> | ||||
|             <include>**/*Spec*.java</include> | ||||
|             <include>**/*Test*.java</include> | ||||
|           </includes> | ||||
|           <excludes> | ||||
|             <exclude>**/helpers/*</exclude> | ||||
|             <exclude>**/*$*</exclude> | ||||
|           </excludes> | ||||
|         </configuration> | ||||
|       </plugin> | ||||
|     </plugins> | ||||
|   </build> | ||||
|   <dependencies> | ||||
|     <dependency> | ||||
|       <groupId>junit</groupId> | ||||
|       <artifactId>junit</artifactId> | ||||
|       <version>4.12</version> | ||||
|       <scope>test</scope> | ||||
|     </dependency> | ||||
|     <dependency> | ||||
|       <groupId>org.javalite</groupId> | ||||
|       <artifactId>activejdbc</artifactId> | ||||
|       <version>${activejdbc.version}</version> | ||||
|       <exclusions> | ||||
|         <exclusion> | ||||
|           <groupId>opensymphony</groupId> | ||||
|           <artifactId>oscache</artifactId> | ||||
|         </exclusion> | ||||
|       </exclusions> | ||||
|     </dependency> | ||||
|     <dependency> | ||||
|       <groupId>mysql</groupId> | ||||
|       <artifactId>mysql-connector-java</artifactId> | ||||
|       <version>5.1.34</version> | ||||
|     </dependency> | ||||
|     <dependency> | ||||
|       <groupId>org.slf4j</groupId> | ||||
|       <artifactId>slf4j-simple</artifactId> | ||||
|       <version>1.7.9</version> | ||||
|     </dependency> | ||||
|   </dependencies> | ||||
|   <repositories> | ||||
|     <repository> | ||||
|       <id>snapshots1</id> | ||||
|       <name>JavaLite Snapshots1</name> | ||||
|       <url>http://repo.javalite.io/</url> | ||||
|       <snapshots> | ||||
|         <enabled>true</enabled> | ||||
|         <updatePolicy>always</updatePolicy> | ||||
|         <checksumPolicy>warn</checksumPolicy> | ||||
|       </snapshots> | ||||
|     </repository> | ||||
|   </repositories> | ||||
|   <pluginRepositories> | ||||
|     <pluginRepository> | ||||
|       <id>snapshots2</id> | ||||
|       <name>JavaLite Snapshots2</name> | ||||
|       <url>http://repo.javalite.io/</url> | ||||
|       <snapshots> | ||||
|         <enabled>true</enabled> | ||||
|         <updatePolicy>always</updatePolicy> | ||||
|         <checksumPolicy>warn</checksumPolicy> | ||||
|       </snapshots> | ||||
|     </pluginRepository> | ||||
|   </pluginRepositories> | ||||
| </project> | ||||
							
								
								
									
										61
									
								
								activejdbc/src/main/java/com/baeldung/ActiveJDBCApp.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								activejdbc/src/main/java/com/baeldung/ActiveJDBCApp.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,61 @@ | ||||
| package com.baeldung; | ||||
| 
 | ||||
| 
 | ||||
| import com.baeldung.model.Employee; | ||||
| import com.baeldung.model.Role; | ||||
| import org.javalite.activejdbc.Base; | ||||
| import org.javalite.activejdbc.LazyList; | ||||
| import org.javalite.activejdbc.Model; | ||||
| 
 | ||||
| public class ActiveJDBCApp | ||||
| { | ||||
|     public static void main( String[] args ) | ||||
|     { | ||||
|         try { | ||||
|             Base.open(); | ||||
|             ActiveJDBCApp app = new ActiveJDBCApp(); | ||||
|             app.create(); | ||||
|             app.update(); | ||||
|             app.delete(); | ||||
|             app.deleteCascade(); | ||||
|         } catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } finally { | ||||
|             Base.close(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     protected void create() { | ||||
|         Employee employee = new Employee("Hugo","C","M","BN"); | ||||
|         employee.saveIt(); | ||||
|         employee.add(new Role("Java Developer","BN")); | ||||
|         LazyList<Model> all = Employee.findAll(); | ||||
|         System.out.println(all.size()); | ||||
|     } | ||||
| 
 | ||||
|     protected void update() { | ||||
|         Employee employee = Employee.findFirst("first_name = ?","Hugo"); | ||||
|         employee.set("last_namea","Choi").saveIt(); | ||||
|         employee = Employee.findFirst("last_name = ?","Choi"); | ||||
|         System.out.println(employee.getString("first_name") + " " + employee.getString("last_name")); | ||||
|     } | ||||
| 
 | ||||
|     protected void delete() { | ||||
|         Employee employee = Employee.findFirst("first_name = ?","Hugo"); | ||||
|         employee.delete(); | ||||
|         employee = Employee.findFirst("last_name = ?","Choi"); | ||||
|         if(null == employee){ | ||||
|             System.out.println("No such Employee found!"); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     protected void deleteCascade() { | ||||
|         create(); | ||||
|         Employee employee = Employee.findFirst("first_name = ?","Hugo"); | ||||
|         employee.deleteCascade(); | ||||
|         employee = Employee.findFirst("last_name = ?","C"); | ||||
|         if(null == employee){ | ||||
|             System.out.println("No such Employee found!"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										19
									
								
								activejdbc/src/main/java/com/baeldung/model/Employee.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								activejdbc/src/main/java/com/baeldung/model/Employee.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| package com.baeldung.model; | ||||
| 
 | ||||
| 
 | ||||
| import org.javalite.activejdbc.Model; | ||||
| 
 | ||||
| public class Employee extends Model { | ||||
| 
 | ||||
|     public Employee(){ | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     public Employee(String firstName, String lastName, String gender, String createdBy) { | ||||
|         set("first_name1",firstName); | ||||
|         set("last_name",lastName); | ||||
|         set("gender",gender); | ||||
|         set("created_by",createdBy); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										18
									
								
								activejdbc/src/main/java/com/baeldung/model/Role.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								activejdbc/src/main/java/com/baeldung/model/Role.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | ||||
| package com.baeldung.model; | ||||
| 
 | ||||
| 
 | ||||
| import org.javalite.activejdbc.Model; | ||||
| import org.javalite.activejdbc.annotations.Table; | ||||
| 
 | ||||
| @Table("EMP_ROLES") | ||||
| public class Role extends Model { | ||||
| 
 | ||||
|     public Role(){ | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     public Role(String role,String createdBy){ | ||||
|         set("role_name",role); | ||||
|         set("created_by",createdBy); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										25
									
								
								activejdbc/src/main/migration/_create_tables.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								activejdbc/src/main/migration/_create_tables.sql
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | ||||
| # noinspection SqlNoDataSourceInspectionForFile | ||||
| 
 | ||||
| create table organisation.employees | ||||
| ( | ||||
| 	id int not null auto_increment | ||||
| 		primary key, | ||||
| 	first_name varchar(100) not null, | ||||
| 	last_name varchar(100) not null, | ||||
| 	gender varchar(1) not null, | ||||
| 	created_at datetime not null, | ||||
| 	updated_at datetime null, | ||||
| 	created_by varchar(100) not null, | ||||
| 	updated_by varchar(100) null | ||||
| )ENGINE = InnoDB DEFAULT CHARSET = utf8; | ||||
| 
 | ||||
| create table organisation.emp_roles | ||||
| ( | ||||
| 	id int not null auto_increment primary key, | ||||
| 	employee_id int not null, | ||||
| 	role_name varchar(100) not null, | ||||
| 	created_at datetime not null, | ||||
| 	updated_at datetime null, | ||||
| 	created_by varchar(100) not null, | ||||
| 	updated_by varchar(100) null | ||||
| )ENGINE = InnoDB DEFAULT CHARSET = utf8; | ||||
							
								
								
									
										10
									
								
								activejdbc/src/main/resources/database.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								activejdbc/src/main/resources/database.properties
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| development.driver=com.mysql.jdbc.Driver | ||||
| development.username=root | ||||
| development.password=123456 | ||||
| development.url=jdbc:mysql://localhost/organisation | ||||
| 
 | ||||
| 
 | ||||
| development.test.driver=com.mysql.jdbc.Driver | ||||
| development.test.username=root | ||||
| development.test.password=123456 | ||||
| development.test.url=jdbc:mysql://localhost/organisation_test | ||||
							
								
								
									
										51
									
								
								activejdbc/src/test/java/com/baeldung/ActiveJDBCAppTest.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								activejdbc/src/test/java/com/baeldung/ActiveJDBCAppTest.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | ||||
| package com.baeldung; | ||||
| 
 | ||||
| import com.baeldung.model.Employee; | ||||
| import com.baeldung.model.Role; | ||||
| import org.javalite.activejdbc.test.DBSpec; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import java.util.List; | ||||
| 
 | ||||
| public class ActiveJDBCAppTest extends DBSpec | ||||
| { | ||||
|     @Test | ||||
|     public void ifEmployeeCreated_thenIsValid() { | ||||
|         Employee employee = new Employee("B", "N", "M", "BN"); | ||||
|         the(employee).shouldBe("valid"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void ifEmployeeCreatedWithRoles_thenShouldPersist() { | ||||
|         Employee employee = new Employee("B", "N", "M", "BN"); | ||||
|         employee.saveIt(); | ||||
|         employee.add(new Role("Java Developer","BN")); | ||||
|         employee.add(new Role("Lead Java Developer","BN")); | ||||
|         a(Role.count()).shouldBeEqual(2); | ||||
|         List<Role> roles = employee.getAll(Role.class).orderBy("created_at"); | ||||
|         the(roles.get(0).getRoleName()).shouldBeEqual("Java Developer"); | ||||
|         the(roles.get(1).getRoleName()).shouldBeEqual("Lead Java Developer"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void ifEmployeeCreatedWithRoles_whenNameUpdated_thenShouldShowNewName() { | ||||
|         Employee employee = new Employee("Binesh", "N", "M", "BN"); | ||||
|         employee.saveIt(); | ||||
|         employee.add(new Role("Java Developer","BN")); | ||||
|         employee.add(new Role("Lead Java Developer","BN")); | ||||
|         employee = Employee.findFirst("first_name = ?", "Binesh"); | ||||
|         employee.set("last_name","Narayanan").saveIt(); | ||||
|         Employee updated = Employee.findFirst("first_name = ?", "Binesh"); | ||||
|         the(updated.getLastName()).shouldBeEqual("Narayanan"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void ifEmployeeCreatedWithRoles_whenDeleted_thenShouldNotBeFound() { | ||||
|         Employee employee = new Employee("Binesh", "N", "M", "BN"); | ||||
|         employee.saveIt(); | ||||
|         employee.add(new Role("Java Developer","BN")); | ||||
|         employee.delete(); | ||||
|         employee = Employee.findFirst("first_name = ?", "Binesh"); | ||||
|         the(employee).shouldBeNull(); | ||||
|     } | ||||
| } | ||||
| @ -15,3 +15,4 @@ | ||||
| - [Introduction to JGraphT](http://www.baeldung.com/jgrapht) | ||||
| - [Introduction to Minimax Algorithm](http://www.baeldung.com/java-minimax-algorithm) | ||||
| - [How to Calculate Levenshtein Distance in Java?](http://www.baeldung.com/java-levenshtein-distance) | ||||
| - [How to Find the Kth Largest Element in Java](http://www.baeldung.com/java-kth-largest-element) | ||||
|  | ||||
| @ -39,6 +39,12 @@ | ||||
|             <artifactId>jgrapht-core</artifactId> | ||||
|             <version>1.0.1</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.assertj</groupId> | ||||
|             <artifactId>assertj-core</artifactId> | ||||
|             <version>3.9.0</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
| 
 | ||||
|     <build> | ||||
|  | ||||
| @ -0,0 +1,111 @@ | ||||
| package com.baeldung.algorithms.kthlargest; | ||||
| 
 | ||||
| import java.util.Arrays; | ||||
| import java.util.Collections; | ||||
| import java.util.stream.IntStream; | ||||
| 
 | ||||
| public class FindKthLargest { | ||||
| 
 | ||||
|     public int findKthLargestBySorting(Integer[] arr, int k) { | ||||
|         Arrays.sort(arr); | ||||
|         int targetIndex = arr.length - k; | ||||
|         return arr[targetIndex]; | ||||
|     } | ||||
| 
 | ||||
|     public int findKthLargestBySortingDesc(Integer[] arr, int k) { | ||||
|         Arrays.sort(arr, Collections.reverseOrder()); | ||||
|         return arr[k - 1]; | ||||
|     } | ||||
| 
 | ||||
|     public int findKthElementByQuickSelect(Integer[] arr, int left, int right, int k) { | ||||
|         if (k >= 0 && k <= right - left + 1) { | ||||
|             int pos = partition(arr, left, right); | ||||
|             if (pos - left == k) { | ||||
|                 return arr[pos]; | ||||
|             } | ||||
|             if (pos - left > k) { | ||||
|                 return findKthElementByQuickSelect(arr, left, pos - 1, k); | ||||
|             } | ||||
|             return findKthElementByQuickSelect(arr, pos + 1, right, k - pos + left - 1); | ||||
|         } | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     public int findKthElementByQuickSelectWithIterativePartition(Integer[] arr, int left, int right, int k) { | ||||
|         if (k >= 0 && k <= right - left + 1) { | ||||
|             int pos = partitionIterative(arr, left, right); | ||||
|             if (pos - left == k) { | ||||
|                 return arr[pos]; | ||||
|             } | ||||
|             if (pos - left > k) { | ||||
|                 return findKthElementByQuickSelectWithIterativePartition(arr, left, pos - 1, k); | ||||
|             } | ||||
|             return findKthElementByQuickSelectWithIterativePartition(arr, pos + 1, right, k - pos + left - 1); | ||||
|         } | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     private int partition(Integer[] arr, int left, int right) { | ||||
|         int pivot = arr[right]; | ||||
|         Integer[] leftArr; | ||||
|         Integer[] rightArr; | ||||
| 
 | ||||
|         leftArr = IntStream.range(left, right) | ||||
|             .filter(i -> arr[i] < pivot) | ||||
|             .map(i -> arr[i]) | ||||
|             .boxed() | ||||
|             .toArray(Integer[]::new); | ||||
| 
 | ||||
|         rightArr = IntStream.range(left, right) | ||||
|             .filter(i -> arr[i] > pivot) | ||||
|             .map(i -> arr[i]) | ||||
|             .boxed() | ||||
|             .toArray(Integer[]::new); | ||||
| 
 | ||||
|         int leftArraySize = leftArr.length; | ||||
|         System.arraycopy(leftArr, 0, arr, left, leftArraySize); | ||||
|         arr[leftArraySize + left] = pivot; | ||||
|         System.arraycopy(rightArr, 0, arr, left + leftArraySize + 1, rightArr.length); | ||||
| 
 | ||||
|         return left + leftArraySize; | ||||
|     } | ||||
| 
 | ||||
|     private int partitionIterative(Integer[] arr, int left, int right) { | ||||
|         int pivot = arr[right], i = left; | ||||
|         for (int j = left; j <= right - 1; j++) { | ||||
|             if (arr[j] <= pivot) { | ||||
|                 swap(arr, i, j); | ||||
|                 i++; | ||||
|             } | ||||
|         } | ||||
|         swap(arr, i, right); | ||||
|         return i; | ||||
|     } | ||||
| 
 | ||||
|     public int findKthElementByRandomizedQuickSelect(Integer[] arr, int left, int right, int k) { | ||||
|         if (k >= 0 && k <= right - left + 1) { | ||||
|             int pos = randomPartition(arr, left, right); | ||||
|             if (pos - left == k) { | ||||
|                 return arr[pos]; | ||||
|             } | ||||
|             if (pos - left > k) { | ||||
|                 return findKthElementByRandomizedQuickSelect(arr, left, pos - 1, k); | ||||
|             } | ||||
|             return findKthElementByRandomizedQuickSelect(arr, pos + 1, right, k - pos + left - 1); | ||||
|         } | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|     private int randomPartition(Integer arr[], int left, int right) { | ||||
|         int n = right - left + 1; | ||||
|         int pivot = (int) (Math.random()) % n; | ||||
|         swap(arr, left + pivot, right); | ||||
|         return partition(arr, left, right); | ||||
|     } | ||||
| 
 | ||||
|     private void swap(Integer[] arr, int n1, int n2) { | ||||
|         int temp = arr[n2]; | ||||
|         arr[n2] = arr[n1]; | ||||
|         arr[n1] = temp; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,57 @@ | ||||
| package com.baeldung.algorithms.kthlargest; | ||||
| 
 | ||||
| import static org.assertj.core.api.Assertions.*; | ||||
| 
 | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class FindKthLargestUnitTest { | ||||
| 
 | ||||
|     private FindKthLargest findKthLargest; | ||||
|     private Integer[] arr = { 3, 7, 1, 2, 8, 10, 4, 5, 6, 9 }; | ||||
| 
 | ||||
|     @Before | ||||
|     public void setup() { | ||||
|         findKthLargest = new FindKthLargest(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenIntArray_whenFindKthLargestBySorting_thenGetResult() { | ||||
|         int k = 3; | ||||
|         assertThat(findKthLargest.findKthLargestBySorting(arr, k)).isEqualTo(8); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenIntArray_whenFindKthLargestBySortingDesc_thenGetResult() { | ||||
|         int k = 3; | ||||
|         assertThat(findKthLargest.findKthLargestBySortingDesc(arr, k)).isEqualTo(8); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenIntArray_whenFindKthLargestByQuickSelect_thenGetResult() { | ||||
|         int k = 3; | ||||
|         int kthLargest = arr.length - k; | ||||
|         assertThat(findKthLargest.findKthElementByQuickSelect(arr, 0, arr.length - 1, kthLargest)).isEqualTo(8); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenIntArray_whenFindKthElementByQuickSelectIterative_thenGetResult() { | ||||
|         int k = 3; | ||||
|         int kthLargest = arr.length - k; | ||||
|         assertThat(findKthLargest.findKthElementByQuickSelectWithIterativePartition(arr, 0, arr.length - 1, kthLargest)).isEqualTo(8); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenIntArray_whenFindKthSmallestByQuickSelect_thenGetResult() { | ||||
|         int k = 3; | ||||
|         assertThat(findKthLargest.findKthElementByQuickSelect(arr, 0, arr.length - 1, k - 1)).isEqualTo(3); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenIntArray_whenFindKthLargestByRandomizedQuickSelect_thenGetResult() { | ||||
|         int k = 3; | ||||
|         int kthLargest = arr.length - k; | ||||
|         assertThat(findKthLargest.findKthElementByRandomizedQuickSelect(arr, 0, arr.length - 1, kthLargest)).isEqualTo(8); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -9,7 +9,7 @@ | ||||
|   <url>http://maven.apache.org</url> | ||||
|    | ||||
|   <properties> | ||||
|         <maven-compiler-plugin.version>3.6.0</maven-compiler-plugin.version>	 | ||||
|         <maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>	 | ||||
|     </properties> | ||||
| 	 | ||||
|   <dependencies> | ||||
| @ -26,8 +26,8 @@ | ||||
| 				  <artifactId>maven-compiler-plugin</artifactId> | ||||
| 				  <version>3.7.0</version> | ||||
| 				  <configuration> | ||||
| 					<source>1.6</source> | ||||
| 					<target>1.6</target> | ||||
| 					<source>1.8</source> | ||||
| 					<target>1.8</target> | ||||
| 				  </configuration> | ||||
| 				</plugin> | ||||
| 				<plugin> | ||||
|  | ||||
| @ -15,7 +15,7 @@ | ||||
| 
 | ||||
|     <properties> | ||||
|         <auto-service.version>1.0-rc2</auto-service.version> | ||||
|         <maven-compiler-plugin.version>3.6.0</maven-compiler-plugin.version> | ||||
|         <maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version> | ||||
|     </properties> | ||||
| 
 | ||||
|     <dependencies> | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| ### Relevant Articles: | ||||
| - [Microsoft Word Processing in Java with Apache POI](http://www.baeldung.com/java-microsoft-word-with-apache-poi) | ||||
| - [Working with Microsoft Excel in Java](http://www.baeldung.com/java-microsoft-excel) | ||||
| - [Creating a MS PowerPoint Presentation in Java](https://github.com/eugenp/tutorials/tree/master/apache-poi) | ||||
|  | ||||
| @ -65,7 +65,7 @@ | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-compiler-plugin</artifactId> | ||||
|                 <version>3.6.2</version> | ||||
|                 <version>3.7.0</version> | ||||
|                 <configuration> | ||||
|                     <source>1.8</source> | ||||
|                     <target>1.8</target> | ||||
|  | ||||
| @ -12,7 +12,7 @@ | ||||
| 
 | ||||
| 	<properties> | ||||
| 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||
| 		<maven-compiler-plugin.version>3.6.0</maven-compiler-plugin.version> | ||||
| 		<maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version> | ||||
| 		<maven-surefire-plugin.version>2.19.1</maven-surefire-plugin.version> | ||||
| 		<camel.version>2.19.1</camel.version> | ||||
| 	    <spring-boot-starter.version>1.5.4.RELEASE</spring-boot-starter.version> | ||||
|  | ||||
							
								
								
									
										2
									
								
								cas/cas-secured-app/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								cas/cas-secured-app/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | ||||
| ## Relevant articles: | ||||
| - [CAS SSO With Spring Security](http://www.baeldung.com/spring-security-cas-sso) | ||||
| @ -14,7 +14,7 @@ | ||||
| 	<parent> | ||||
| 		<groupId>org.springframework.boot</groupId> | ||||
| 		<artifactId>spring-boot-starter-parent</artifactId> | ||||
| 		<version>2.0.0.BUILD-SNAPSHOT</version> | ||||
| 		<version>2.0.0.M7</version> | ||||
| 		<relativePath/> <!-- lookup parent from repository --> | ||||
| 	</parent> | ||||
| 
 | ||||
| @ -87,14 +87,6 @@ | ||||
| 	</build> | ||||
| 
 | ||||
| 	<repositories> | ||||
| 		<repository> | ||||
| 			<id>spring-snapshots</id> | ||||
| 			<name>Spring Snapshots</name> | ||||
| 			<url>https://repo.spring.io/snapshot</url> | ||||
| 			<snapshots> | ||||
| 				<enabled>true</enabled> | ||||
| 			</snapshots> | ||||
| 		</repository> | ||||
| 		<repository> | ||||
| 			<id>spring-milestones</id> | ||||
| 			<name>Spring Milestones</name> | ||||
| @ -106,14 +98,6 @@ | ||||
| 	</repositories> | ||||
| 
 | ||||
| 	<pluginRepositories> | ||||
| 		<pluginRepository> | ||||
| 			<id>spring-snapshots</id> | ||||
| 			<name>Spring Snapshots</name> | ||||
| 			<url>https://repo.spring.io/snapshot</url> | ||||
| 			<snapshots> | ||||
| 				<enabled>true</enabled> | ||||
| 			</snapshots> | ||||
| 		</pluginRepository> | ||||
| 		<pluginRepository> | ||||
| 			<id>spring-milestones</id> | ||||
| 			<name>Spring Milestones</name> | ||||
|  | ||||
| @ -52,7 +52,11 @@ | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-compiler-plugin</artifactId> | ||||
|                 <version>3.3</version> | ||||
|                 <version>3.7.0</version> | ||||
|                 <configuration> | ||||
|                     <source>1.8</source> | ||||
|                     <target>1.8</target> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|         </plugins> | ||||
|         <finalName>cas</finalName> | ||||
|  | ||||
| @ -32,3 +32,11 @@ | ||||
| - [“Stream has already been operated upon or closed” Exception in Java](http://www.baeldung.com/java-stream-operated-upon-or-closed-exception) | ||||
| - [Display All Time Zones With GMT And UTC in Java](http://www.baeldung.com/java-time-zones) | ||||
| - [Copy a File with Java](http://www.baeldung.com/java-copy-file) | ||||
| - [Generating Prime Numbers in Java](http://www.baeldung.com/java-generate-prime-numbers) | ||||
| - [Static and Default Methods in Interfaces in Java](http://www.baeldung.com/java-static-default-methods) | ||||
| - [Iterable to Stream in Java](http://www.baeldung.com/java-iterable-to-stream) | ||||
| - [Converting String to Stream of chars](http://www.baeldung.com/java-string-to-stream) | ||||
| - [How to Iterate Over a Stream With Indices](http://www.baeldung.com/java-stream-indices) | ||||
| - [Efficient Word Frequency Calculator in Java](http://www.baeldung.com/java-word-frequency) | ||||
| - [Primitive Type Streams in Java 8](http://www.baeldung.com/java-8-primitive-streams) | ||||
| - [Fail-Safe Iterator vs Fail-Fast Iterator](http://www.baeldung.com/java-fail-safe-vs-fail-fast-iterator) | ||||
|  | ||||
| @ -101,6 +101,23 @@ | ||||
| 		    <version>1.19</version> | ||||
| 		</dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>com.codepoetics</groupId> | ||||
|             <artifactId>protonpack</artifactId> | ||||
|             <version>${protonpack.version}</version> | ||||
|         </dependency> | ||||
|          | ||||
|        <dependency> | ||||
|             <groupId>io.vavr</groupId> | ||||
|             <artifactId>vavr</artifactId> | ||||
|             <version>${vavr.version}</version> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>one.util</groupId> | ||||
|             <artifactId>streamex</artifactId> | ||||
|             <version>${streamex.version}</version> | ||||
|         </dependency>         | ||||
|     </dependencies> | ||||
| 
 | ||||
|     <build> | ||||
| @ -267,6 +284,9 @@ | ||||
|         <collections-generic.version>4.01</collections-generic.version> | ||||
|         <commons-codec.version>1.10</commons-codec.version> | ||||
|         <lombok.version>1.16.12</lombok.version> | ||||
|         <vavr.version>0.9.0</vavr.version> | ||||
|         <protonpack.version>1.13</protonpack.version> | ||||
|         <streamex.version>0.6.5</streamex.version> | ||||
| 
 | ||||
|         <!-- testing --> | ||||
|         <assertj.version>3.6.1</assertj.version> | ||||
|  | ||||
| @ -2,7 +2,6 @@ package com.baeldung.datetime; | ||||
| 
 | ||||
| import java.time.Duration; | ||||
| import java.time.LocalTime; | ||||
| import java.time.Period; | ||||
| 
 | ||||
| public class UseDuration { | ||||
| 
 | ||||
|  | ||||
| @ -0,0 +1,18 @@ | ||||
| package com.baeldung.defaultstaticinterfacemethods.application; | ||||
| 
 | ||||
| import com.baeldung.defaultstaticinterfacemethods.model.Car; | ||||
| import com.baeldung.defaultstaticinterfacemethods.model.Vehicle; | ||||
| 
 | ||||
| public class Application { | ||||
| 
 | ||||
|     public static void main(String[] args) { | ||||
| 
 | ||||
|         Vehicle car = new Car("BMW"); | ||||
|         System.out.println(car.getBrand()); | ||||
|         System.out.println(car.speedUp()); | ||||
|         System.out.println(car.slowDown()); | ||||
|         System.out.println(car.turnAlarmOn()); | ||||
|         System.out.println(car.turnAlarmOff()); | ||||
|         System.out.println(Vehicle.getHorsePower(2500, 480)); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,12 @@ | ||||
| package com.baeldung.defaultstaticinterfacemethods.model; | ||||
| 
 | ||||
| public interface Alarm { | ||||
| 
 | ||||
|     default String turnAlarmOn() { | ||||
|         return "Turning the alarm on."; | ||||
|     } | ||||
| 
 | ||||
|     default String turnAlarmOff() { | ||||
|         return "Turning the alarm off."; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,25 @@ | ||||
| package com.baeldung.defaultstaticinterfacemethods.model; | ||||
| 
 | ||||
| public class Car implements Vehicle { | ||||
| 
 | ||||
|     private final String brand; | ||||
| 
 | ||||
|     public Car(String brand) { | ||||
|         this.brand = brand; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String getBrand() { | ||||
|         return brand; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String speedUp() { | ||||
|         return "The car is speeding up."; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String slowDown() { | ||||
|         return "The car is slowing down."; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,25 @@ | ||||
| package com.baeldung.defaultstaticinterfacemethods.model; | ||||
| 
 | ||||
| public class Motorbike implements Vehicle { | ||||
| 
 | ||||
|     private final String brand; | ||||
| 
 | ||||
|     public Motorbike(String brand) { | ||||
|         this.brand = brand; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String getBrand() { | ||||
|         return brand; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String speedUp() { | ||||
|         return "The motorbike is speeding up."; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String slowDown() { | ||||
|         return "The motorbike is slowing down."; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,35 @@ | ||||
| package com.baeldung.defaultstaticinterfacemethods.model; | ||||
| 
 | ||||
| public class MultiAlarmCar implements Vehicle, Alarm { | ||||
| 
 | ||||
|     private final String brand; | ||||
| 
 | ||||
|     public MultiAlarmCar(String brand) { | ||||
|         this.brand = brand; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String getBrand() { | ||||
|         return brand; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String speedUp() { | ||||
|         return "The motorbike is speeding up."; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String slowDown() { | ||||
|         return "The mootorbike is slowing down."; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String turnAlarmOn() { | ||||
|         return Vehicle.super.turnAlarmOn() + " " + Alarm.super.turnAlarmOn(); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String turnAlarmOff() { | ||||
|         return Vehicle.super.turnAlarmOff() + " " + Alarm.super.turnAlarmOff(); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,22 @@ | ||||
| package com.baeldung.defaultstaticinterfacemethods.model; | ||||
| 
 | ||||
| public interface Vehicle { | ||||
| 
 | ||||
|     String getBrand(); | ||||
| 
 | ||||
|     String speedUp(); | ||||
| 
 | ||||
|     String slowDown(); | ||||
| 
 | ||||
|     default String turnAlarmOn() { | ||||
|         return "Turning the vehice alarm on."; | ||||
|     } | ||||
| 
 | ||||
|     default String turnAlarmOff() { | ||||
|         return "Turning the vehicle alarm off."; | ||||
|     } | ||||
| 
 | ||||
|     static int getHorsePower(int rpm, int torque) { | ||||
|         return (rpm * torque) / 5252; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,80 @@ | ||||
| package com.baeldung.iterators; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Iterator; | ||||
| import java.util.concurrent.ConcurrentHashMap; | ||||
| 
 | ||||
| /** | ||||
|  * Source code https://github.com/eugenp/tutorials | ||||
|  * | ||||
|  * @author Santosh Thakur | ||||
|  */ | ||||
| 
 | ||||
| public class Iterators { | ||||
| 
 | ||||
|     public static int failFast1() { | ||||
|         ArrayList<Integer> numbers = new ArrayList<>(); | ||||
| 
 | ||||
|         numbers.add(10); | ||||
|         numbers.add(20); | ||||
|         numbers.add(30); | ||||
|         numbers.add(40); | ||||
| 
 | ||||
|         Iterator<Integer> iterator = numbers.iterator(); | ||||
|         while (iterator.hasNext()) { | ||||
|             Integer number = iterator.next(); | ||||
|             numbers.add(50); | ||||
|         } | ||||
| 
 | ||||
|         return numbers.size(); | ||||
|     } | ||||
| 
 | ||||
|     public static int failFast2() { | ||||
|         ArrayList<Integer> numbers = new ArrayList<>(); | ||||
|         numbers.add(10); | ||||
|         numbers.add(20); | ||||
|         numbers.add(30); | ||||
|         numbers.add(40); | ||||
| 
 | ||||
|         Iterator<Integer> iterator = numbers.iterator(); | ||||
|         while (iterator.hasNext()) { | ||||
|             if (iterator.next() == 30) { | ||||
|                 // will not throw Exception | ||||
|                 iterator.remove(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         System.out.println("using iterator's remove method = " + numbers); | ||||
| 
 | ||||
|         iterator = numbers.iterator(); | ||||
|         while (iterator.hasNext()) { | ||||
|             if (iterator.next() == 40) { | ||||
|                 // will throw Exception on | ||||
|                 // next call of next() method | ||||
|                 numbers.remove(2); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return numbers.size(); | ||||
|     } | ||||
| 
 | ||||
|     public static int failSafe1() { | ||||
|         ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>(); | ||||
| 
 | ||||
|         map.put("First", 10); | ||||
|         map.put("Second", 20); | ||||
|         map.put("Third", 30); | ||||
|         map.put("Fourth", 40); | ||||
| 
 | ||||
|         Iterator<String> iterator = map.keySet() | ||||
|             .iterator(); | ||||
| 
 | ||||
|         while (iterator.hasNext()) { | ||||
|             String key = iterator.next(); | ||||
|             map.put("Fifth", 50); | ||||
|         } | ||||
| 
 | ||||
|         return map.size(); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,44 @@ | ||||
| package com.baeldung.spliteratorAPI; | ||||
| 
 | ||||
| import java.util.List; | ||||
| 
 | ||||
| public class Article { | ||||
|     private List<Author> listOfAuthors; | ||||
|     private int id; | ||||
|     private String name; | ||||
| 
 | ||||
|     public Article(String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
|     public Article(List<Author> listOfAuthors, int id) { | ||||
|         super(); | ||||
|         this.listOfAuthors = listOfAuthors; | ||||
|         this.id = id; | ||||
|     } | ||||
| 
 | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     public void setName(String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
|     public int getId() { | ||||
|         return id; | ||||
|     } | ||||
| 
 | ||||
|     public void setId(int id) { | ||||
|         this.id = id; | ||||
|     } | ||||
| 
 | ||||
|     public List<Author> getListOfAuthors() { | ||||
|         return listOfAuthors; | ||||
|     } | ||||
| 
 | ||||
|     public void setListOfAuthors(List<Author> listOfAuthors) { | ||||
|         this.listOfAuthors = listOfAuthors; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,33 @@ | ||||
| package com.baeldung.spliteratorAPI; | ||||
| 
 | ||||
| public class Author { | ||||
|     private String name; | ||||
|     private int relatedArticleId; | ||||
| 
 | ||||
|     public Author(String name, int relatedArticleId) { | ||||
|         this.name = name; | ||||
|         this.relatedArticleId = relatedArticleId; | ||||
|     } | ||||
| 
 | ||||
|     public int getRelatedArticleId() { | ||||
|         return relatedArticleId; | ||||
|     } | ||||
| 
 | ||||
|     public void setRelatedArticleId(int relatedArticleId) { | ||||
|         this.relatedArticleId = relatedArticleId; | ||||
|     } | ||||
| 
 | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     public void setName(String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String toString() { | ||||
|         return "[name: " + name + ", relatedId: " + relatedArticleId + "]"; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -0,0 +1,19 @@ | ||||
| package com.baeldung.spliteratorAPI; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import java.util.stream.Collectors; | ||||
| import java.util.stream.Stream; | ||||
| 
 | ||||
| public class Executor { | ||||
| 
 | ||||
| 	public static int countAutors(Stream<Author> stream) { | ||||
| 		RelatedAuthorCounter wordCounter = stream.reduce(new RelatedAuthorCounter(0, true), | ||||
| 				RelatedAuthorCounter::accumulate, RelatedAuthorCounter::combine); | ||||
| 		return wordCounter.getCounter(); | ||||
| 	} | ||||
| 
 | ||||
| 	public static List<Article> generateElements() { | ||||
| 		return Stream.generate(() -> new Article("Java")).limit(35000).collect(Collectors.toList()); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,27 @@ | ||||
| package com.baeldung.spliteratorAPI; | ||||
| 
 | ||||
| public class RelatedAuthorCounter { | ||||
|     private final int counter; | ||||
|     private final boolean isRelated; | ||||
| 
 | ||||
|     public RelatedAuthorCounter(int counter, boolean isRelated) { | ||||
|         this.counter = counter; | ||||
|         this.isRelated = isRelated; | ||||
|     } | ||||
| 
 | ||||
|     public RelatedAuthorCounter accumulate(Author author) { | ||||
|         if (author.getRelatedArticleId() == 0) { | ||||
|             return isRelated ? this : new RelatedAuthorCounter(counter, true); | ||||
|         } else { | ||||
|             return isRelated ? new RelatedAuthorCounter(counter + 1, false) : this; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public RelatedAuthorCounter combine(RelatedAuthorCounter RelatedAuthorCounter) { | ||||
|         return new RelatedAuthorCounter(counter + RelatedAuthorCounter.counter, RelatedAuthorCounter.isRelated); | ||||
|     } | ||||
| 
 | ||||
|     public int getCounter() { | ||||
|         return counter; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,49 @@ | ||||
| package com.baeldung.spliteratorAPI; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import java.util.Spliterator; | ||||
| import java.util.concurrent.atomic.AtomicInteger; | ||||
| import java.util.function.Consumer; | ||||
| 
 | ||||
| public class RelatedAuthorSpliterator implements Spliterator<Author> { | ||||
| 	private final List<Author> list; | ||||
| 	AtomicInteger current = new AtomicInteger(); | ||||
| 
 | ||||
| 	public RelatedAuthorSpliterator(List<Author> list) { | ||||
| 		this.list = list; | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public boolean tryAdvance(Consumer<? super Author> action) { | ||||
| 
 | ||||
| 		action.accept(list.get(current.getAndIncrement())); | ||||
| 		return current.get() < list.size(); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public Spliterator<Author> trySplit() { | ||||
| 		int currentSize = list.size() - current.get(); | ||||
| 		if (currentSize < 10) { | ||||
| 			return null; | ||||
| 		} | ||||
| 		for (int splitPos = currentSize / 2 + current.intValue(); splitPos < list.size(); splitPos++) { | ||||
| 			if (list.get(splitPos).getRelatedArticleId() == 0) { | ||||
| 				Spliterator<Author> spliterator = new RelatedAuthorSpliterator(list.subList(current.get(), splitPos)); | ||||
| 				current.set(splitPos); | ||||
| 				return spliterator; | ||||
| 			} | ||||
| 		} | ||||
| 		return null; | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public long estimateSize() { | ||||
| 		return list.size() - current.get(); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public int characteristics() { | ||||
| 		return CONCURRENT; | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,27 @@ | ||||
| package com.baeldung.spliteratorAPI; | ||||
| 
 | ||||
| import java.util.Spliterator; | ||||
| import java.util.concurrent.Callable; | ||||
| 
 | ||||
| public class Task implements Callable<String> { | ||||
|     private Spliterator<Article> spliterator; | ||||
|     private final static String SUFFIX = "- published by Baeldung"; | ||||
| 
 | ||||
|     public Task(Spliterator<Article> spliterator) { | ||||
|         this.spliterator = spliterator; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String call() { | ||||
|         int current = 0; | ||||
|         while (spliterator.tryAdvance(article -> { | ||||
|             article.setName(article.getName() | ||||
|                 .concat(SUFFIX)); | ||||
|         })) { | ||||
|             current++; | ||||
|         } | ||||
|         ; | ||||
|         return Thread.currentThread() | ||||
|             .getName() + ":" + current; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,23 @@ | ||||
| package com.baeldung.stream; | ||||
| 
 | ||||
| import java.util.Arrays; | ||||
| import java.util.stream.IntStream; | ||||
| 
 | ||||
| class PrimitiveStreams { | ||||
| 
 | ||||
|     int min(int[] integers) { | ||||
|         return Arrays.stream(integers).min().getAsInt(); | ||||
|     } | ||||
| 
 | ||||
|     int max(int... integers) { | ||||
|         return IntStream.of(integers).max().getAsInt(); | ||||
|     } | ||||
| 
 | ||||
|     int sum(int... integers) { | ||||
|         return IntStream.of(integers).sum(); | ||||
|     } | ||||
| 
 | ||||
|     double avg(int... integers) { | ||||
|         return IntStream.of(integers).average().getAsDouble(); | ||||
|     } | ||||
| } | ||||
| @ -1,8 +1,6 @@ | ||||
| package com.baeldung.streamApi; | ||||
| package com.baeldung.stream; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import java.util.Optional; | ||||
| import java.util.stream.IntStream; | ||||
| import java.util.stream.Stream; | ||||
| 
 | ||||
| /** | ||||
| @ -16,7 +16,7 @@ public class StreamApi { | ||||
|     } | ||||
|      | ||||
|     public static String getLastElementUsingSkip(List<String> valueList) { | ||||
|         long count = valueList.stream().count(); | ||||
|         long count = (long) valueList.size(); | ||||
|         Stream<String> stream = valueList.stream(); | ||||
|         return stream.skip(count - 1).findFirst().orElse(null); | ||||
|     } | ||||
|  | ||||
| @ -2,6 +2,7 @@ package com.baeldung.counter; | ||||
| 
 | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
| import java.util.Random; | ||||
| 
 | ||||
| import org.openjdk.jmh.annotations.Benchmark; | ||||
| import org.openjdk.jmh.annotations.BenchmarkMode; | ||||
| @ -18,8 +19,18 @@ public class CounterStatistics { | ||||
|     private static final Map<String, MutableInteger> counterWithMutableIntMap = new HashMap<>(); | ||||
|     private static final Map<String, int[]> counterWithIntArrayMap = new HashMap<>(); | ||||
|     private static final Map<String, Long> counterWithLongWrapperMap = new HashMap<>(); | ||||
|     private static final Map<String, Long> counterWithLongWrapperStreamMap = new HashMap<>(); | ||||
|      | ||||
|     @Benchmark | ||||
|     static { | ||||
|         CounterUtil.COUNTRY_NAMES = new String[10000]; | ||||
|         final String prefix = "NewString";  | ||||
|         Random random = new Random(); | ||||
|         for (int i=0; i<10000; i++) { | ||||
|             CounterUtil.COUNTRY_NAMES[i] = new String(prefix + random.nextInt(1000)); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|   @Benchmark | ||||
|     public void wrapperAsCounter() { | ||||
|         CounterUtil.counterWithWrapperObject(counterMap); | ||||
|     } | ||||
| @ -29,6 +40,11 @@ public class CounterStatistics { | ||||
|         CounterUtil.counterWithLambdaAndWrapper(counterWithLongWrapperMap); | ||||
|     } | ||||
|      | ||||
|     @Benchmark | ||||
|     public void parallelStreamWithWrapper() { | ||||
|         CounterUtil.counterWithParallelStreamAndWrapper(counterWithLongWrapperStreamMap); | ||||
|     } | ||||
| 
 | ||||
|     @Benchmark | ||||
|     public void mutableIntegerAsCounter() { | ||||
|         CounterUtil.counterWithMutableInteger(counterWithMutableIntMap); | ||||
|  | ||||
| @ -6,7 +6,7 @@ import java.util.stream.Stream; | ||||
| 
 | ||||
| public class CounterUtil { | ||||
| 
 | ||||
|     private final static String[] COUNTRY_NAMES = { "China", "Australia", "India", "USA", "USSR", "UK", "China", "France", "Poland", "Austria", "India", "USA", "Egypt", "China" }; | ||||
|     public static String[] COUNTRY_NAMES = { "China", "Australia", "India", "USA", "USSR", "UK", "China", "France", "Poland", "Austria", "India", "USA", "Egypt", "China" }; | ||||
| 
 | ||||
|     public static void counterWithWrapperObject(Map<String, Integer> counterMap) { | ||||
|         for (String country : COUNTRY_NAMES) { | ||||
| @ -15,9 +15,14 @@ public class CounterUtil { | ||||
|     } | ||||
| 
 | ||||
|     public static void counterWithLambdaAndWrapper(Map<String, Long> counterMap) { | ||||
|         counterMap.putAll(Stream.of(COUNTRY_NAMES) | ||||
|         Stream.of(COUNTRY_NAMES) | ||||
|             .collect(Collectors.groupingBy(k -> k, () -> counterMap, Collectors.counting())); | ||||
|     } | ||||
| 
 | ||||
|     public static void counterWithParallelStreamAndWrapper(Map<String, Long> counterMap) { | ||||
|         Stream.of(COUNTRY_NAMES) | ||||
|             .parallel() | ||||
|             .collect(Collectors.groupingBy(k -> k, Collectors.counting()))); | ||||
|             .collect(Collectors.groupingBy(k -> k, () -> counterMap, Collectors.counting())); | ||||
|     } | ||||
| 
 | ||||
|     public static class MutableInteger { | ||||
| @ -38,23 +43,14 @@ public class CounterUtil { | ||||
| 
 | ||||
|     public static void counterWithMutableInteger(Map<String, MutableInteger> counterMap) { | ||||
|         for (String country : COUNTRY_NAMES) { | ||||
|             MutableInteger oldValue = counterMap.get(country); | ||||
|             if (oldValue != null) { | ||||
|                 oldValue.increment(); | ||||
|             } else { | ||||
|                 counterMap.put(country, new MutableInteger(1)); | ||||
|             } | ||||
|             counterMap.compute(country, (k, v) -> v == null ? new MutableInteger(0) : v) | ||||
|                 .increment(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public static void counterWithPrimitiveArray(Map<String, int[]> counterMap) { | ||||
|         for (String country : COUNTRY_NAMES) { | ||||
|             int[] oldCounter = counterMap.get(country); | ||||
|             if (oldCounter != null) { | ||||
|                 oldCounter[0] += 1; | ||||
|             } else { | ||||
|                 counterMap.put(country, new int[] { 1 }); | ||||
|             } | ||||
|             counterMap.compute(country, (k, v) -> v == null ? new int[] { 0 } : v)[0]++; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -4,7 +4,6 @@ import java.time.LocalDate; | ||||
| import java.time.LocalTime; | ||||
| import java.time.Month; | ||||
| 
 | ||||
| import org.junit.Assert; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
|  | ||||
| @ -4,7 +4,6 @@ import java.time.DayOfWeek; | ||||
| import java.time.LocalDate; | ||||
| import java.time.LocalDateTime; | ||||
| 
 | ||||
| import org.junit.Assert; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
|  | ||||
| @ -0,0 +1,79 @@ | ||||
| package com.baeldung.defaultistaticinterfacemethods.test; | ||||
| 
 | ||||
| import com.baeldung.defaultstaticinterfacemethods.model.Car; | ||||
| import com.baeldung.defaultstaticinterfacemethods.model.Motorbike; | ||||
| import com.baeldung.defaultstaticinterfacemethods.model.Vehicle; | ||||
| import org.junit.BeforeClass; | ||||
| import org.junit.Test; | ||||
| import static org.assertj.core.api.Assertions.*; | ||||
| 
 | ||||
| public class StaticDefaulInterfaceMethodUnitTest { | ||||
| 
 | ||||
|     private static Car car; | ||||
|     private static Motorbike motorbike; | ||||
| 
 | ||||
|     @BeforeClass | ||||
|     public static void setUpCarInstance() { | ||||
|         car = new Car("BMW"); | ||||
|     } | ||||
| 
 | ||||
|     @BeforeClass | ||||
|     public static void setUpMotorbikeInstance() { | ||||
|         motorbike = new Motorbike("Yamaha"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenCarInstace_whenBrandisBMW_thenOneAssertion() { | ||||
|         assertThat(car.getBrand()).isEqualTo("BMW"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenCarInstance_whenCallingSpeedUp_thenOneAssertion() { | ||||
|         assertThat(car.speedUp()).isEqualTo("The car is speeding up."); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenCarInstance_whenCallingSlowDown_thenOneAssertion() { | ||||
|         assertThat(car.slowDown()).isEqualTo("The car is slowing down."); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenCarInstance_whenCallingTurnAlarmOn_thenOneAssertion() { | ||||
|         assertThat(car.turnAlarmOn()).isEqualTo("Turning the vehice alarm on."); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenCarInstance_whenCallingTurnAlarmOff_thenOneAssertion() { | ||||
|         assertThat(car.turnAlarmOff()).isEqualTo("Turning the vehicle alarm off."); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenVehicleInterface_whenCallinggetHorsePower_thenOneAssertion() { | ||||
|         assertThat(Vehicle.getHorsePower(2500, 480)).isEqualTo(228); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenMooorbikeInstace_whenBrandisYamaha_thenOneAssertion() { | ||||
|         assertThat(motorbike.getBrand()).isEqualTo("Yamaha"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenMotorbikeInstance_whenCallingSpeedUp_thenOneAssertion() { | ||||
|         assertThat(motorbike.speedUp()).isEqualTo("The motorbike is speeding up."); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenMotorbikeInstance_whenCallingSlowDown_thenOneAssertion() { | ||||
|         assertThat(motorbike.slowDown()).isEqualTo("The motorbike is slowing down."); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenMotorbikeInstance_whenCallingTurnAlarmOn_thenOneAssertion() { | ||||
|         assertThat(motorbike.turnAlarmOn()).isEqualTo("Turning the vehice alarm on."); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenMotorbikeInstance_whenCallingTurnAlarmOff_thenOneAssertion() { | ||||
|         assertThat(motorbike.turnAlarmOff()).isEqualTo("Turning the vehicle alarm off."); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,40 @@ | ||||
| package com.baeldung.iterators; | ||||
| 
 | ||||
| import static com.baeldung.iterators.Iterators.failFast1; | ||||
| import static com.baeldung.iterators.Iterators.failFast2; | ||||
| import static com.baeldung.iterators.Iterators.failSafe1; | ||||
| import static org.assertj.core.api.Assertions.assertThat; | ||||
| import static org.assertj.core.api.Assertions.assertThatThrownBy; | ||||
| 
 | ||||
| import java.util.ConcurrentModificationException; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| /** | ||||
|  * Source code https://github.com/eugenp/tutorials | ||||
|  * | ||||
|  * @author Santosh Thakur | ||||
|  */ | ||||
| 
 | ||||
| public class IteratorsTest { | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenFailFast_ThenThrowsException() { | ||||
|         assertThatThrownBy(() -> { | ||||
|             failFast1(); | ||||
|         }).isInstanceOf(ConcurrentModificationException.class); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenFailFast_ThenThrowsExceptionInSecondIteration() { | ||||
|         assertThatThrownBy(() -> { | ||||
|             failFast2(); | ||||
|         }).isInstanceOf(ConcurrentModificationException.class); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenFailSafe_ThenDoesNotThrowException() { | ||||
|         assertThat(failSafe1()).isGreaterThanOrEqualTo(0); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -1,6 +1,6 @@ | ||||
| package com.baeldung.java8; | ||||
| 
 | ||||
| import com.baeldung.streamApi.Product; | ||||
| import com.baeldung.stream.Product; | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| import org.slf4j.Logger; | ||||
|  | ||||
| @ -6,7 +6,6 @@ import java.util.Comparator; | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import static org.junit.Assert.assertTrue; | ||||
| 
 | ||||
| public class Java8ComparatorUnitTest { | ||||
| @ -134,8 +133,7 @@ public class Java8ComparatorUnitTest { | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenThenComparing_thenSortedByAgeName() { | ||||
|         Comparator<Employee> employee_Age_Name_Comparator = Comparator.comparing(Employee::getAge) | ||||
|             .thenComparing(Employee::getName); | ||||
|         Comparator<Employee> employee_Age_Name_Comparator = Comparator.comparing(Employee::getAge).thenComparing(Employee::getName); | ||||
| 
 | ||||
|         Arrays.sort(someMoreEmployees, employee_Age_Name_Comparator); | ||||
|         // System.out.println(Arrays.toString(someMoreEmployees)); | ||||
| @ -144,8 +142,7 @@ public class Java8ComparatorUnitTest { | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenThenComparing_thenSortedByNameAge() { | ||||
|         Comparator<Employee> employee_Name_Age_Comparator = Comparator.comparing(Employee::getName) | ||||
|             .thenComparingInt(Employee::getAge); | ||||
|         Comparator<Employee> employee_Name_Age_Comparator = Comparator.comparing(Employee::getName).thenComparingInt(Employee::getAge); | ||||
| 
 | ||||
|         Arrays.sort(someMoreEmployees, employee_Name_Age_Comparator); | ||||
|         // System.out.println(Arrays.toString(someMoreEmployees)); | ||||
|  | ||||
| @ -0,0 +1,44 @@ | ||||
| package com.baeldung.spliteratorAPI; | ||||
| 
 | ||||
| import java.util.Arrays; | ||||
| import java.util.Spliterator; | ||||
| import java.util.stream.Stream; | ||||
| import java.util.stream.StreamSupport; | ||||
| 
 | ||||
| import static org.assertj.core.api.Assertions.*; | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class ExecutorTest { | ||||
| 	Article article; | ||||
| 	Stream<Author> stream; | ||||
| 	Spliterator<Author> spliterator; | ||||
| 	Spliterator<Article> split1; | ||||
| 	Spliterator<Article> split2; | ||||
| 
 | ||||
| 	@Before | ||||
| 	public void init() { | ||||
| 		article = new Article(Arrays.asList(new Author("Ahmad", 0), new Author("Eugen", 0), new Author("Alice", 1), | ||||
| 				new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), | ||||
| 				new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), | ||||
| 				new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), | ||||
| 				new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), | ||||
| 				new Author("Mike", 0), new Author("Michał", 0), new Author("Loredana", 1)), 0); | ||||
| 		stream = article.getListOfAuthors().stream(); | ||||
| 		split1 = Executor.generateElements().spliterator(); | ||||
| 		split2 = split1.trySplit(); | ||||
| 		spliterator = new RelatedAuthorSpliterator(article.getListOfAuthors()); | ||||
| 	} | ||||
| 
 | ||||
| 	@Test | ||||
| 	public void givenAstreamOfAuthors_whenProcessedInParallelWithCustomSpliterator_coubtProducessRightOutput() { | ||||
| 		Stream<Author> stream2 = StreamSupport.stream(spliterator, true); | ||||
| 		assertThat(Executor.countAutors(stream2.parallel())).isEqualTo(9); | ||||
| 	} | ||||
| 
 | ||||
| 	@Test | ||||
| 	public void givenSpliterator_whenAppliedToAListOfArticle_thenSplittedInHalf() { | ||||
| 		assertThat(new Task(split1).call()).containsSequence(Executor.generateElements().size() / 2 + ""); | ||||
| 		assertThat(new Task(split2).call()).containsSequence(Executor.generateElements().size() / 2 + ""); | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,99 @@ | ||||
| package com.baeldung.stream; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
| import java.util.stream.Collectors; | ||||
| import java.util.stream.IntStream; | ||||
| import java.util.stream.Stream; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
| import static org.junit.Assert.assertTrue; | ||||
| 
 | ||||
| public class PrimitiveStreamsUnitTest { | ||||
| 
 | ||||
|     private PrimitiveStreams streams = new PrimitiveStreams(); | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenAnArrayOfIntegersWhenMinIsCalledThenCorrectMinIsReturned() { | ||||
|         int[] integers = new int[] {20, 98, 12, 7, 35}; | ||||
|         int min = streams.min(integers); // returns 7 | ||||
| 
 | ||||
|         assertEquals(7, min); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenAnArrayOfIntegersWhenMaxIsCalledThenCorrectMaxIsReturned() { | ||||
|         int max = streams.max(20, 98, 12, 7, 35); | ||||
| 
 | ||||
|         assertEquals(98, max); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenAnArrayOfIntegersWhenSumIsCalledThenCorrectSumIsReturned() { | ||||
|         int sum = streams.sum(20, 98, 12, 7, 35); | ||||
| 
 | ||||
|         assertEquals(172, sum); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenAnArrayOfIntegersWhenAvgIsCalledThenCorrectAvgIsReturned() { | ||||
|         double avg = streams.avg(20, 98, 12, 7, 35); | ||||
| 
 | ||||
|         assertTrue(34.4 == avg); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenARangeOfIntegersWhenIntStreamSumIsCalledThenCorrectSumIsReturned() { | ||||
|         int sum = IntStream.range(1, 10).sum(); | ||||
| 
 | ||||
|         assertEquals(45, sum); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenARangeClosedOfIntegersWhenIntStreamSumIsCalledThenCorrectSumIsReturned() { | ||||
|         int sum = IntStream.rangeClosed(1, 10).sum(); | ||||
| 
 | ||||
|         assertEquals(55, sum); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenARangeWhenForEachIsCalledThenTheIndicesWillBePrinted() { | ||||
|         IntStream.rangeClosed(1, 5).parallel().forEach(System.out::println); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenAnArrayWhenSumIsCalledThenTheCorrectSumIsReturned() { | ||||
| 
 | ||||
|         int sum = Stream.of(33,45) | ||||
|           .mapToInt(i -> i) | ||||
|           .sum(); | ||||
| 
 | ||||
|         assertEquals(78, sum); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenAnIntStreamThenGetTheEvenIntegers() { | ||||
|         List<Integer> evenInts = IntStream.rangeClosed(1, 10) | ||||
|           .filter(i -> i % 2 == 0) | ||||
|           .boxed() | ||||
|           .collect(Collectors.toList()); | ||||
| 
 | ||||
|         List<Integer> expected = IntStream.of(2, 4, 6, 8, 10).boxed().collect(Collectors.toList()); | ||||
| 
 | ||||
|         assertEquals(expected, evenInts); | ||||
|     } | ||||
| 
 | ||||
|     class Person { | ||||
|         private int age; | ||||
| 
 | ||||
|         Person(int age) { | ||||
|             this.age = age; | ||||
|         } | ||||
| 
 | ||||
|         int getAge() { | ||||
|             return age; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,101 @@ | ||||
| package com.baeldung.stringjoiner; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
| import java.util.StringJoiner; | ||||
| import java.util.stream.Collectors; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class StringJoinerUnitTest { | ||||
|     private final String DELIMITER_COMMA = ","; | ||||
|     private final String DELIMITER_HYPHEN = "-"; | ||||
|     private final String PREFIX = "["; | ||||
|     private final String SUFFIX = "]"; | ||||
|     private final String EMPTY_JOINER = "empty"; | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenJoinerWithoutPrefixSuffixWithoutEmptyValue_thenReturnDefault() { | ||||
|         StringJoiner commaSeparatedJoiner = new StringJoiner(DELIMITER_COMMA); | ||||
|         assertEquals(0, commaSeparatedJoiner.toString().length()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenJoinerWithPrefixSuffixWithoutEmptyValue_thenReturnDefault() { | ||||
|         StringJoiner commaSeparatedPrefixSuffixJoiner = new StringJoiner(DELIMITER_COMMA, PREFIX, SUFFIX); | ||||
|         assertEquals(commaSeparatedPrefixSuffixJoiner.toString(), PREFIX + SUFFIX); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenJoinerWithoutPrefixSuffixWithEmptyValue_thenReturnDefault() { | ||||
|         StringJoiner commaSeparatedJoiner = new StringJoiner(DELIMITER_COMMA); | ||||
|         commaSeparatedJoiner.setEmptyValue(EMPTY_JOINER); | ||||
| 
 | ||||
|         assertEquals(commaSeparatedJoiner.toString(), EMPTY_JOINER); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenJoinerWithPrefixSuffixWithEmptyValue_thenReturnDefault() { | ||||
|         StringJoiner commaSeparatedPrefixSuffixJoiner = new StringJoiner(DELIMITER_COMMA, PREFIX, SUFFIX); | ||||
|         commaSeparatedPrefixSuffixJoiner.setEmptyValue(EMPTY_JOINER); | ||||
| 
 | ||||
|         assertEquals(commaSeparatedPrefixSuffixJoiner.toString(), EMPTY_JOINER); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenAddElements_thenJoinElements() { | ||||
|         StringJoiner rgbJoiner = new StringJoiner(DELIMITER_COMMA, PREFIX, SUFFIX); | ||||
|         rgbJoiner.add("Red") | ||||
|           .add("Green") | ||||
|           .add("Blue"); | ||||
| 
 | ||||
|         assertEquals(rgbJoiner.toString(), "[Red,Green,Blue]"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenAddListElements_thenJoinListElements() { | ||||
|         List<String> rgbList = new ArrayList<String>(); | ||||
|         rgbList.add("Red"); | ||||
|         rgbList.add("Green"); | ||||
|         rgbList.add("Blue"); | ||||
| 
 | ||||
|         StringJoiner rgbJoiner = new StringJoiner(DELIMITER_COMMA, PREFIX, SUFFIX); | ||||
| 
 | ||||
|         for (String color : rgbList) { | ||||
|             rgbJoiner.add(color); | ||||
|         } | ||||
| 
 | ||||
|         assertEquals(rgbJoiner.toString(), "[Red,Green,Blue]"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenMergeJoiners_thenReturnMerged() { | ||||
|         StringJoiner rgbJoiner = new StringJoiner(DELIMITER_COMMA, PREFIX, SUFFIX); | ||||
|         StringJoiner cmybJoiner = new StringJoiner(DELIMITER_HYPHEN, PREFIX, SUFFIX); | ||||
| 
 | ||||
|         rgbJoiner.add("Red") | ||||
|           .add("Green") | ||||
|           .add("Blue"); | ||||
|         cmybJoiner.add("Cyan") | ||||
|           .add("Magenta") | ||||
|           .add("Yellow") | ||||
|           .add("Black"); | ||||
| 
 | ||||
|         rgbJoiner.merge(cmybJoiner); | ||||
| 
 | ||||
|         assertEquals(rgbJoiner.toString(), "[Red,Green,Blue,Cyan-Magenta-Yellow-Black]"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenUsedWithinCollectors_thenJoin() { | ||||
|         List<String> rgbList = Arrays.asList("Red", "Green", "Blue"); | ||||
|         String commaSeparatedRGB = rgbList.stream() | ||||
|           .map(color -> color.toString()) | ||||
|           .collect(Collectors.joining(",")); | ||||
| 
 | ||||
|         assertEquals(commaSeparatedRGB, "Red,Green,Blue"); | ||||
|     } | ||||
| } | ||||
| @ -1,7 +1,6 @@ | ||||
| package com.baeldung.temporaladjusters; | ||||
| 
 | ||||
| import com.baeldung.temporaladjuster.CustomTemporalAdjuster; | ||||
| import org.junit.Assert; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import java.time.LocalDate; | ||||
|  | ||||
| @ -18,3 +18,5 @@ | ||||
| - [How to Get All Dates Between Two Dates?](http://www.baeldung.com/java-between-dates) | ||||
| - [Java 9 java.util.Objects Additions](http://www.baeldung.com/java-9-objects-new) | ||||
| - [Compact Strings in Java 9](http://www.baeldung.com/java-9-compact-string) | ||||
| - [Convert Date to LocalDate or LocalDateTime and Back](http://www.baeldung.com/java-date-to-localdate-and-localdatetime) | ||||
| - [Java 9 Variable Handles Demistyfied](http://www.baeldung.com/java-variable-handles) | ||||
|  | ||||
| @ -2,10 +2,10 @@ | ||||
|     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> | ||||
|     <groupId>com.baeldung</groupId> | ||||
|     <artifactId>core-java9</artifactId> | ||||
|     <artifactId>core-java-9</artifactId> | ||||
|     <version>0.2-SNAPSHOT</version> | ||||
| 
 | ||||
|     <name>core-java9</name> | ||||
|     <name>core-java-9</name> | ||||
| 
 | ||||
|     <pluginRepositories> | ||||
|         <pluginRepository> | ||||
| @ -90,7 +90,7 @@ | ||||
|         <org.slf4j.version>1.7.21</org.slf4j.version> | ||||
|         <ch.qos.logback.version>1.2.1</ch.qos.logback.version> | ||||
|         <!-- maven plugins --> | ||||
|         <maven-compiler-plugin.version>3.6.0</maven-compiler-plugin.version> | ||||
|         <maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version> | ||||
|         <maven-surefire-plugin.version>2.19.1</maven-surefire-plugin.version> | ||||
| 
 | ||||
|         <!-- testing --> | ||||
|  | ||||
| @ -0,0 +1,106 @@ | ||||
| package com.baeldung.java9.varhandles; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import java.lang.invoke.MethodHandles; | ||||
| import java.lang.invoke.VarHandle; | ||||
| 
 | ||||
| import static org.assertj.core.api.Assertions.assertThat; | ||||
| 
 | ||||
| public class VariableHandlesTest { | ||||
| 
 | ||||
|     public int publicTestVariable = 1; | ||||
|     private int privateTestVariable = 1; | ||||
|     public int variableToSet = 1; | ||||
|     public int variableToCompareAndSet = 1; | ||||
|     public int variableToGetAndAdd = 0; | ||||
|     public byte variableToBitwiseOr = 0; | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenVariableHandleForPublicVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException { | ||||
|         VarHandle publicIntHandle = MethodHandles | ||||
|           .lookup() | ||||
|           .in(VariableHandlesTest.class) | ||||
|           .findVarHandle(VariableHandlesTest.class, "publicTestVariable", int.class); | ||||
| 
 | ||||
|         assertThat(publicIntHandle.coordinateTypes().size() == 1); | ||||
|         assertThat(publicIntHandle.coordinateTypes().get(0) == VariableHandles.class); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenVariableHandleForPrivateVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException { | ||||
|         VarHandle privateIntHandle = MethodHandles | ||||
|           .privateLookupIn(VariableHandlesTest.class, MethodHandles.lookup()) | ||||
|           .findVarHandle(VariableHandlesTest.class, "privateTestVariable", int.class); | ||||
| 
 | ||||
|         assertThat(privateIntHandle.coordinateTypes().size() == 1); | ||||
|         assertThat(privateIntHandle.coordinateTypes().get(0) == VariableHandlesTest.class); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenVariableHandleForArrayVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException { | ||||
|         VarHandle arrayVarHandle = MethodHandles | ||||
|           .arrayElementVarHandle(int[].class); | ||||
| 
 | ||||
|         assertThat(arrayVarHandle.coordinateTypes().size() == 2); | ||||
|         assertThat(arrayVarHandle.coordinateTypes().get(0) == int[].class); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenVarHandle_whenGetIsInvoked_ThenValueOfVariableIsReturned() throws NoSuchFieldException, IllegalAccessException { | ||||
|         VarHandle publicIntHandle = MethodHandles | ||||
|           .lookup() | ||||
|           .in(VariableHandlesTest.class) | ||||
|           .findVarHandle(VariableHandlesTest.class, "publicTestVariable", int.class); | ||||
| 
 | ||||
|         assertThat((int) publicIntHandle.get(this) == 1); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenVarHandle_whenSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { | ||||
|         VarHandle publicIntHandle = MethodHandles | ||||
|           .lookup() | ||||
|           .in(VariableHandlesTest.class) | ||||
|           .findVarHandle(VariableHandlesTest.class, "variableToSet", int.class); | ||||
|         publicIntHandle.set(this, 15); | ||||
| 
 | ||||
|         assertThat((int) publicIntHandle.get(this) == 15); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenVarHandle_whenCompareAndSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { | ||||
|         VarHandle publicIntHandle = MethodHandles | ||||
|           .lookup() | ||||
|           .in(VariableHandlesTest.class) | ||||
|           .findVarHandle(VariableHandlesTest.class, "variableToCompareAndSet", int.class); | ||||
|         publicIntHandle.compareAndSet(this, 1, 100); | ||||
| 
 | ||||
|         assertThat((int) publicIntHandle.get(this) == 100); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenVarHandle_whenGetAndAddIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { | ||||
|         VarHandle publicIntHandle = MethodHandles | ||||
|           .lookup() | ||||
|           .in(VariableHandlesTest.class) | ||||
|           .findVarHandle(VariableHandlesTest.class, "variableToGetAndAdd", int.class); | ||||
|         int before = (int) publicIntHandle.getAndAdd(this, 200); | ||||
| 
 | ||||
|         assertThat(before == 0); | ||||
|         assertThat((int) publicIntHandle.get(this) == 200); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenVarHandle_whenGetAndBitwiseOrIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { | ||||
|         VarHandle publicIntHandle = MethodHandles | ||||
|           .lookup() | ||||
|           .in(VariableHandlesTest.class) | ||||
|           .findVarHandle(VariableHandlesTest.class, "variableToBitwiseOr", byte.class); | ||||
|         byte before = (byte) publicIntHandle.getAndBitwiseOr(this, (byte) 127); | ||||
| 
 | ||||
|         assertThat(before == 0); | ||||
|         assertThat(variableToBitwiseOr == 127); | ||||
|     } | ||||
| } | ||||
| @ -31,3 +31,6 @@ | ||||
| - [Overview of the java.util.concurrent](http://www.baeldung.com/java-util-concurrent) | ||||
| - [Semaphores in Java](http://www.baeldung.com/java-semaphore) | ||||
| - [Daemon Threads in Java](http://www.baeldung.com/java-daemon-thread) | ||||
| - [Implementing a Runnable vs Extending a Thread](http://www.baeldung.com/java-runnable-vs-extending-thread) | ||||
| - [How to Kill a Java Thread](http://www.baeldung.com/java-thread-stop) | ||||
| - [ExecutorService - Waiting for Threads to Finish](http://www.baeldung.com/java-executor-wait-for-threads) | ||||
|  | ||||
| @ -43,8 +43,9 @@ public class ControlSubThread implements Runnable { | ||||
|             try { | ||||
|                 Thread.sleep(interval); | ||||
|             } catch (InterruptedException e) { | ||||
|                 // no-op, just loop again | ||||
|             } | ||||
|             	Thread.currentThread().interrupt(); | ||||
|                 System.out.println("Thread was interrupted, Failed to complete operation"); | ||||
| 	    } | ||||
|             // do something | ||||
|         } | ||||
|         stopped.set(true); | ||||
|  | ||||
| @ -1,5 +1,7 @@ | ||||
| package com.baeldung.concurrent.waitandnotify; | ||||
| 
 | ||||
| import org.slf4j.Logger; | ||||
| 
 | ||||
| public class Data { | ||||
|     private String packet; | ||||
|      | ||||
| @ -11,7 +13,9 @@ public class Data { | ||||
|         while (transfer) { | ||||
|             try { | ||||
|                 wait(); | ||||
|             } catch (InterruptedException e) {} | ||||
|             } catch (InterruptedException e) { | ||||
|                 System.out.println("Thread Interrupted"); | ||||
|             } | ||||
|         } | ||||
|         transfer = true; | ||||
| 
 | ||||
| @ -23,7 +27,9 @@ public class Data { | ||||
|         while (!transfer) { | ||||
|             try {  | ||||
|                 wait(); | ||||
|             } catch (InterruptedException e) {} | ||||
|             } catch (InterruptedException e) { | ||||
|                 System.out.println("Thread Interrupted"); | ||||
|             } | ||||
|         } | ||||
|         transfer = false; | ||||
|          | ||||
|  | ||||
| @ -19,7 +19,9 @@ public class Receiver implements Runnable { | ||||
|             //Thread.sleep() to mimic heavy server-side processing | ||||
|             try { | ||||
|                 Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 5000)); | ||||
|             } catch (InterruptedException e) {} | ||||
|             } catch (InterruptedException e) { | ||||
|                 System.out.println("Thread Interrupted"); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -11,11 +11,11 @@ public class Sender implements Runnable { | ||||
|   | ||||
|     public void run() { | ||||
|         String packets[] = { | ||||
|             "First packet", | ||||
|             "Second packet", | ||||
|             "Third packet", | ||||
|             "Fourth packet", | ||||
|             "End" | ||||
|           "First packet", | ||||
|           "Second packet", | ||||
|           "Third packet", | ||||
|           "Fourth packet", | ||||
|           "End" | ||||
|         }; | ||||
|   | ||||
|         for (String packet : packets) { | ||||
| @ -24,7 +24,9 @@ public class Sender implements Runnable { | ||||
|             //Thread.sleep() to mimic heavy server-side processing | ||||
|             try { | ||||
|                 Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 5000)); | ||||
|             } catch (InterruptedException e) {} | ||||
|             } catch (InterruptedException e) { | ||||
|                 System.out.println("Thread Interrupted"); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -10,9 +10,9 @@ import java.util.concurrent.*; | ||||
| 
 | ||||
| import static junit.framework.TestCase.assertTrue; | ||||
| 
 | ||||
| public class WaitingForThreadsToFinishTest { | ||||
| public class WaitingForThreadsToFinishManualTest { | ||||
| 
 | ||||
|     private static final Logger LOG = LoggerFactory.getLogger(WaitingForThreadsToFinishTest.class); | ||||
|     private static final Logger LOG = LoggerFactory.getLogger(WaitingForThreadsToFinishManualTest.class); | ||||
|     private final static ExecutorService WORKER_THREAD_POOL = Executors.newFixedThreadPool(10); | ||||
| 
 | ||||
|     public void awaitTerminationAfterShutdown(ExecutorService threadPool) { | ||||
| @ -142,66 +142,4 @@ public class WaitingForThreadsToFinishTest { | ||||
|             awaitTerminationAfterShutdown(WORKER_THREAD_POOL); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenMultipleThreads_whenUsingCompletableFutures_thenMainThreadShouldWaitForAllToFinish() { | ||||
| 
 | ||||
|         CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> { | ||||
| 
 | ||||
|             try { | ||||
|                 Thread.sleep(1000); | ||||
|             } catch (InterruptedException e) { | ||||
|                 e.printStackTrace(); | ||||
|             } | ||||
| 
 | ||||
|             return "Hello"; | ||||
|         }); | ||||
| 
 | ||||
|         CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> { | ||||
| 
 | ||||
|             try { | ||||
|                 Thread.sleep(5000); | ||||
|             } catch (InterruptedException e) { | ||||
|                 e.printStackTrace(); | ||||
|             } | ||||
| 
 | ||||
|             return "Beautiful"; | ||||
|         }); | ||||
| 
 | ||||
|         CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> { | ||||
| 
 | ||||
|             try { | ||||
|                 Thread.sleep(3000); | ||||
|             } catch (InterruptedException e) { | ||||
|                 e.printStackTrace(); | ||||
|             } | ||||
| 
 | ||||
|             return "World"; | ||||
|         }); | ||||
| 
 | ||||
|         long startProcessingTime = System.currentTimeMillis(); | ||||
|         CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2, future3); | ||||
|         combinedFuture.join(); | ||||
| 
 | ||||
|         long totalProcessingTime = System.currentTimeMillis() - startProcessingTime; | ||||
|         assertTrue(totalProcessingTime >= 5000 && totalProcessingTime < 6000); | ||||
| 
 | ||||
|         LOG.debug("Responses from all threads are available after " + totalProcessingTime + " milliseconds"); | ||||
| 
 | ||||
|         try { | ||||
|             String thread1Response = future1.get(); | ||||
|             assertTrue(thread1Response.equals("Hello")); | ||||
| 
 | ||||
|             String thread2Response = future2.get(); | ||||
|             assertTrue(thread2Response.equals("Beautiful")); | ||||
| 
 | ||||
|             String thread3Response = future3.get(); | ||||
|             assertTrue(thread3Response.equals("World")); | ||||
| 
 | ||||
|         } catch (InterruptedException | ExecutionException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
| 
 | ||||
|         awaitTerminationAfterShutdown(WORKER_THREAD_POOL); | ||||
|     } | ||||
| } | ||||
| @ -1,20 +1,21 @@ | ||||
| package com.baeldung.concurrent.stopping; | ||||
| 
 | ||||
| import com.jayway.awaitility.Awaitility; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import java.util.concurrent.TimeUnit; | ||||
| 
 | ||||
| import static com.jayway.awaitility.Awaitility.await; | ||||
| import static org.junit.Assert.assertFalse; | ||||
| import static org.junit.Assert.assertTrue; | ||||
| 
 | ||||
| import java.util.concurrent.TimeUnit; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import com.jayway.awaitility.Awaitility; | ||||
| 
 | ||||
| public class StopThreadTest { | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenStoppedThreadIsStopped() throws InterruptedException { | ||||
| 
 | ||||
|         int interval = 100; | ||||
|         int interval = 5; | ||||
| 
 | ||||
|         ControlSubThread controlSubThread = new ControlSubThread(interval); | ||||
|         controlSubThread.start(); | ||||
| @ -33,13 +34,13 @@ public class StopThreadTest { | ||||
|     @Test | ||||
|     public void whenInterruptedThreadIsStopped() throws InterruptedException { | ||||
| 
 | ||||
|         int interval = 5000; | ||||
|         int interval = 50; | ||||
| 
 | ||||
|         ControlSubThread controlSubThread = new ControlSubThread(interval); | ||||
|         controlSubThread.start(); | ||||
| 
 | ||||
|         // Give things a chance to get set up | ||||
|         Thread.sleep(100); | ||||
|         Thread.sleep(interval); | ||||
|         assertTrue(controlSubThread.isRunning()); | ||||
|         assertFalse(controlSubThread.isStopped()); | ||||
| 
 | ||||
| @ -48,6 +49,7 @@ public class StopThreadTest { | ||||
| 
 | ||||
|         // Wait less than the time we would normally sleep, and make sure we exited. | ||||
|         Awaitility.await() | ||||
|             .pollDelay(2, TimeUnit.MILLISECONDS) | ||||
|           .atMost(interval/ 10, TimeUnit.MILLISECONDS) | ||||
|           .until(controlSubThread::isStopped); | ||||
|     } | ||||
|  | ||||
| @ -13,38 +13,38 @@ import org.junit.Test; | ||||
| 
 | ||||
| public class NetworkIntegrationTest { | ||||
| 
 | ||||
| 	private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); | ||||
| 	private final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); | ||||
| 	private String expected; | ||||
|     private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); | ||||
|     private final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); | ||||
|     private String expected; | ||||
|      | ||||
| 	@Before | ||||
| 	public void setUpStreams() { | ||||
| 	    System.setOut(new PrintStream(outContent)); | ||||
| 	    System.setErr(new PrintStream(errContent)); | ||||
| 	} | ||||
|     @Before | ||||
|     public void setUpStreams() { | ||||
|         System.setOut(new PrintStream(outContent)); | ||||
|         System.setErr(new PrintStream(errContent)); | ||||
|     } | ||||
|      | ||||
| 	@Before | ||||
| 	public void setUpExpectedOutput() { | ||||
| 		StringWriter expectedStringWriter = new StringWriter(); | ||||
|     @Before | ||||
|     public void setUpExpectedOutput() { | ||||
|         StringWriter expectedStringWriter = new StringWriter(); | ||||
|          | ||||
| 		PrintWriter printWriter = new PrintWriter(expectedStringWriter); | ||||
| 		printWriter.println("First packet"); | ||||
| 		printWriter.println("Second packet"); | ||||
| 		printWriter.println("Third packet"); | ||||
| 		printWriter.println("Fourth packet"); | ||||
| 		printWriter.close(); | ||||
|         PrintWriter printWriter = new PrintWriter(expectedStringWriter); | ||||
|         printWriter.println("First packet"); | ||||
|         printWriter.println("Second packet"); | ||||
|         printWriter.println("Third packet"); | ||||
|         printWriter.println("Fourth packet"); | ||||
|         printWriter.close(); | ||||
|          | ||||
| 		expected = expectedStringWriter.toString(); | ||||
| 	} | ||||
|         expected = expectedStringWriter.toString(); | ||||
|     } | ||||
| 
 | ||||
| 	@After | ||||
| 	public void cleanUpStreams() { | ||||
| 	    System.setOut(null); | ||||
| 	    System.setErr(null); | ||||
| 	} | ||||
|     @After | ||||
|     public void cleanUpStreams() { | ||||
|         System.setOut(null); | ||||
|         System.setErr(null); | ||||
|     } | ||||
|      | ||||
| 	@Test | ||||
| 	public void givenSenderAndReceiver_whenSendingPackets_thenNetworkSynchronized() { | ||||
|     @Test | ||||
|     public void givenSenderAndReceiver_whenSendingPackets_thenNetworkSynchronized() { | ||||
|         Data data = new Data(); | ||||
|         Thread sender = new Thread(new Sender(data)); | ||||
|         Thread receiver = new Thread(new Receiver(data)); | ||||
| @ -54,12 +54,12 @@ public class NetworkIntegrationTest { | ||||
|          | ||||
|         //wait for sender and receiver to finish before we test against expected | ||||
|         try { | ||||
| 			sender.join(); | ||||
| 			receiver.join(); | ||||
| 		} catch (InterruptedException e) { | ||||
| 			e.printStackTrace(); | ||||
| 		} | ||||
|             sender.join(); | ||||
|             receiver.join(); | ||||
|         } catch (InterruptedException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|          | ||||
| 	    assertEquals(expected, outContent.toString()); | ||||
| 	} | ||||
|         assertEquals(expected, outContent.toString()); | ||||
|     } | ||||
| } | ||||
|  | ||||
							
								
								
									
										26
									
								
								core-java-io/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								core-java-io/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| *.class | ||||
| 
 | ||||
| 0.* | ||||
| 
 | ||||
| #folders# | ||||
| /target | ||||
| /neoDb* | ||||
| /data | ||||
| /src/main/webapp/WEB-INF/classes | ||||
| */META-INF/* | ||||
| .resourceCache | ||||
| 
 | ||||
| # Packaged files # | ||||
| *.jar | ||||
| *.war | ||||
| *.ear | ||||
| 
 | ||||
| # Files generated by integration tests | ||||
| *.txt | ||||
| backup-pom.xml | ||||
| /bin/ | ||||
| /temp | ||||
| 
 | ||||
| #IntelliJ specific | ||||
| .idea/ | ||||
| *.iml | ||||
							
								
								
									
										25
									
								
								core-java-io/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								core-java-io/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | ||||
| ========= | ||||
| 
 | ||||
| ## Core Java IO Cookbooks and Examples | ||||
| 
 | ||||
| ### Relevant Articles:  | ||||
| - [Java - Reading a Large File Efficiently](http://www.baeldung.com/java-read-lines-large-file) | ||||
| - [Java InputStream to String](http://www.baeldung.com/convert-input-stream-to-string) | ||||
| - [Java – Write to File](http://www.baeldung.com/java-write-to-file) | ||||
| - [Java - Convert File to InputStream](http://www.baeldung.com/convert-file-to-input-stream) | ||||
| - [Java Scanner](http://www.baeldung.com/java-scanner) | ||||
| - [Java – Byte Array to Writer](http://www.baeldung.com/java-convert-byte-array-to-writer) | ||||
| - [Java – Directory Size](http://www.baeldung.com/java-folder-size) | ||||
| - [Differences Between the Java WatchService API and the Apache Commons IO Monitor Library](http://www.baeldung.com/java-watchservice-vs-apache-commons-io-monitor-library) | ||||
| - [Calculate the Size of a File in Java](http://www.baeldung.com/java-file-size) | ||||
| - [Comparing getPath(), getAbsolutePath(), and getCanonicalPath() in Java](http://www.baeldung.com/java-path) | ||||
| - [Using Java MappedByteBuffer](http://www.baeldung.com/java-mapped-byte-buffer) | ||||
| - [Copy a File with Java](http://www.baeldung.com/java-copy-file) | ||||
| - [Java – Append Data to a File](http://www.baeldung.com/java-append-to-file) | ||||
| - [FileNotFoundException in Java](http://www.baeldung.com/java-filenotfound-exception) | ||||
| - [How to Read a File in Java](http://www.baeldung.com/reading-file-in-java) | ||||
| - [A Guide To NIO2 Asynchronous File Channel](http://www.baeldung.com/java-nio2-async-file-channel) | ||||
| - [A Guide To NIO2 FileVisitor](http://www.baeldung.com/java-nio2-file-visitor) | ||||
| - [A Guide To NIO2 File Attribute APIs](http://www.baeldung.com/java-nio2-file-attribute) | ||||
| - [Introduction to the Java NIO2 File API](http://www.baeldung.com/java-nio-2-file-api) | ||||
| - [Zipping and Unzipping in Java](http://www.baeldung.com/java-compress-and-uncompress) | ||||
							
								
								
									
										505
									
								
								core-java-io/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										505
									
								
								core-java-io/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,505 @@ | ||||
| <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> | ||||
|     <groupId>com.baeldung</groupId> | ||||
|     <artifactId>core-java-io</artifactId> | ||||
|     <version>0.1.0-SNAPSHOT</version> | ||||
|     <packaging>jar</packaging> | ||||
| 
 | ||||
|     <name>core-java-io</name> | ||||
| 
 | ||||
|     <dependencies> | ||||
| 
 | ||||
|         <!-- utils --> | ||||
|         <dependency> | ||||
|             <groupId>net.sourceforge.collections</groupId> | ||||
|             <artifactId>collections-generic</artifactId> | ||||
|             <version>${collections-generic.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>com.google.guava</groupId> | ||||
|             <artifactId>guava</artifactId> | ||||
|             <version>${guava.version}</version> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>org.apache.commons</groupId> | ||||
|             <artifactId>commons-collections4</artifactId> | ||||
|             <version>${commons-collections4.version}</version> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>commons-io</groupId> | ||||
|             <artifactId>commons-io</artifactId> | ||||
|             <version>${commons-io.version}</version> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>org.apache.commons</groupId> | ||||
|             <artifactId>commons-lang3</artifactId> | ||||
|             <version>${commons-lang3.version}</version> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>org.apache.commons</groupId> | ||||
|             <artifactId>commons-math3</artifactId> | ||||
|             <version>${commons-math3.version}</version> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>org.decimal4j</groupId> | ||||
|             <artifactId>decimal4j</artifactId> | ||||
|             <version>${decimal4j.version}</version> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>org.bouncycastle</groupId> | ||||
|             <artifactId>bcprov-jdk15on</artifactId> | ||||
|             <version>${bouncycastle.version}</version> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>org.unix4j</groupId> | ||||
|             <artifactId>unix4j-command</artifactId> | ||||
|             <version>${unix4j.version}</version> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>com.googlecode.grep4j</groupId> | ||||
|             <artifactId>grep4j</artifactId> | ||||
|             <version>${grep4j.version}</version> | ||||
|         </dependency> | ||||
|         <!-- web --> | ||||
| 
 | ||||
|         <!-- marshalling --> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>com.fasterxml.jackson.core</groupId> | ||||
|             <artifactId>jackson-databind</artifactId> | ||||
|             <version>${jackson.version}</version> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <!-- logging --> | ||||
|         <dependency> | ||||
|             <groupId>log4j</groupId> | ||||
|             <artifactId>log4j</artifactId> | ||||
|             <version>1.2.17</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.slf4j</groupId> | ||||
|             <artifactId>slf4j-api</artifactId> | ||||
|             <version>${org.slf4j.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>ch.qos.logback</groupId> | ||||
|             <artifactId>logback-classic</artifactId> | ||||
|             <version>${logback.version}</version> | ||||
|             <!-- <scope>runtime</scope> --> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.slf4j</groupId> | ||||
|             <artifactId>jcl-over-slf4j</artifactId> | ||||
|             <version>${org.slf4j.version}</version> | ||||
|             <!-- <scope>runtime</scope> --> <!-- some spring dependencies need to compile against jcl --> | ||||
|         </dependency> | ||||
|         <dependency> <!-- needed to bridge to slf4j for projects that use the log4j APIs directly --> | ||||
|             <groupId>org.slf4j</groupId> | ||||
|             <artifactId>log4j-over-slf4j</artifactId> | ||||
|             <version>${org.slf4j.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.projectlombok</groupId> | ||||
|             <artifactId>lombok</artifactId> | ||||
|             <version>${lombok.version}</version> | ||||
|             <scope>provided</scope> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <!-- test scoped --> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>org.hamcrest</groupId> | ||||
|             <artifactId>hamcrest-all</artifactId> | ||||
|             <version>1.3</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>junit</groupId> | ||||
|             <artifactId>junit</artifactId> | ||||
|             <version>${junit.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>org.hamcrest</groupId> | ||||
|             <artifactId>hamcrest-core</artifactId> | ||||
|             <version>${org.hamcrest.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.hamcrest</groupId> | ||||
|             <artifactId>hamcrest-library</artifactId> | ||||
|             <version>${org.hamcrest.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>org.assertj</groupId> | ||||
|             <artifactId>assertj-core</artifactId> | ||||
|             <version>${assertj.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>org.mockito</groupId> | ||||
|             <artifactId>mockito-core</artifactId> | ||||
|             <version>${mockito.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>com.jayway.awaitility</groupId> | ||||
|             <artifactId>awaitility</artifactId> | ||||
|             <version>${avaitility.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>commons-codec</groupId> | ||||
|             <artifactId>commons-codec</artifactId> | ||||
|             <version>${commons-codec.version}</version> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>org.javamoney</groupId> | ||||
|             <artifactId>moneta</artifactId> | ||||
|             <version>1.1</version> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>org.owasp.esapi</groupId> | ||||
|             <artifactId>esapi</artifactId> | ||||
|             <version>2.1.0.1</version> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>com.sun.messaging.mq</groupId> | ||||
|             <artifactId>fscontext</artifactId> | ||||
|             <version>${fscontext.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>com.codepoetics</groupId> | ||||
|             <artifactId>protonpack</artifactId> | ||||
|             <version>${protonpack.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>one.util</groupId> | ||||
|             <artifactId>streamex</artifactId> | ||||
|             <version>${streamex.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>io.vavr</groupId> | ||||
|             <artifactId>vavr</artifactId> | ||||
|             <version>${vavr.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.openjdk.jmh</groupId> | ||||
|             <artifactId>jmh-core</artifactId> | ||||
|             <version>1.19</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.openjdk.jmh</groupId> | ||||
|             <artifactId>jmh-generator-annprocess</artifactId> | ||||
|             <version>1.19</version> | ||||
|         </dependency> | ||||
| 		<dependency> | ||||
| 		    <groupId>org.springframework</groupId> | ||||
| 		    <artifactId>spring-web</artifactId> | ||||
| 		    <version>4.3.4.RELEASE</version> | ||||
| 		</dependency> | ||||
|  		<dependency> | ||||
| 			<groupId>org.springframework.boot</groupId> | ||||
| 			<artifactId>spring-boot-starter</artifactId> | ||||
| 			<version>1.5.8.RELEASE</version> | ||||
| 		</dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.hsqldb</groupId> | ||||
|             <artifactId>hsqldb</artifactId> | ||||
|             <version>2.4.0</version> | ||||
|             <scope>runtime</scope> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
| 
 | ||||
|     <build> | ||||
|         <finalName>core-java-io</finalName> | ||||
|         <resources> | ||||
|             <resource> | ||||
|                 <directory>src/main/resources</directory> | ||||
|                 <filtering>true</filtering> | ||||
|             </resource> | ||||
|         </resources> | ||||
| 
 | ||||
|         <plugins> | ||||
| 
 | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-compiler-plugin</artifactId> | ||||
|                 <version>${maven-compiler-plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <source>1.8</source> | ||||
|                     <target>1.8</target> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
| 
 | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-surefire-plugin</artifactId> | ||||
|                 <configuration> | ||||
|                     <excludes> | ||||
|                         <exclude>**/*LiveTest.java</exclude> | ||||
|                         <exclude>**/*IntegrationTest.java</exclude> | ||||
|                         <exclude>**/*LongRunningUnitTest.java</exclude> | ||||
|                         <exclude>**/*ManualTest.java</exclude> | ||||
|                     </excludes> | ||||
|                     <testFailureIgnore>true</testFailureIgnore> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
| 
 | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-dependency-plugin</artifactId> | ||||
|                 <executions> | ||||
|                     <execution> | ||||
|                         <id>copy-dependencies</id> | ||||
|                         <phase>prepare-package</phase> | ||||
|                         <goals> | ||||
|                             <goal>copy-dependencies</goal> | ||||
|                         </goals> | ||||
|                         <configuration> | ||||
|                             <outputDirectory>${project.build.directory}/libs</outputDirectory> | ||||
|                         </configuration> | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|             </plugin> | ||||
| 
 | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-jar-plugin</artifactId> | ||||
|                 <configuration> | ||||
|                     <archive> | ||||
|                         <manifest> | ||||
|                             <addClasspath>true</addClasspath> | ||||
|                             <classpathPrefix>libs/</classpathPrefix> | ||||
|                             <mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass> | ||||
|                         </manifest> | ||||
|                     </archive> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
| 
 | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-assembly-plugin</artifactId> | ||||
|                 <executions> | ||||
|                     <execution> | ||||
|                         <phase>package</phase> | ||||
|                         <goals> | ||||
|                             <goal>single</goal> | ||||
|                         </goals> | ||||
|                         <configuration> | ||||
|                             <archiveBaseDirectory>${project.basedir}</archiveBaseDirectory> | ||||
|                             <archive> | ||||
|                                 <manifest> | ||||
|                                     <mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass> | ||||
|                                 </manifest> | ||||
|                             </archive> | ||||
|                             <descriptorRefs> | ||||
|                                 <descriptorRef>jar-with-dependencies</descriptorRef> | ||||
|                             </descriptorRefs> | ||||
|                         </configuration> | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|             </plugin> | ||||
| 
 | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-shade-plugin</artifactId> | ||||
|                 <executions> | ||||
|                     <execution> | ||||
|                         <goals> | ||||
|                             <goal>shade</goal> | ||||
|                         </goals> | ||||
|                         <configuration> | ||||
|                             <shadedArtifactAttached>true</shadedArtifactAttached> | ||||
|                             <transformers> | ||||
|                                 <transformer | ||||
|                                         implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> | ||||
|                                     <mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass> | ||||
|                                 </transformer> | ||||
|                             </transformers> | ||||
|                         </configuration> | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|             </plugin> | ||||
| 
 | ||||
|             <plugin> | ||||
|                 <groupId>com.jolira</groupId> | ||||
|                 <artifactId>onejar-maven-plugin</artifactId> | ||||
|                 <executions> | ||||
|                     <execution> | ||||
|                         <configuration> | ||||
|                             <mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass> | ||||
|                             <attachToBuild>true</attachToBuild> | ||||
|                             <filename>${project.build.finalName}-onejar.${project.packaging}</filename> | ||||
|                         </configuration> | ||||
|                         <goals> | ||||
|                             <goal>one-jar</goal> | ||||
|                         </goals> | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|             </plugin> | ||||
| 
 | ||||
|             <plugin> | ||||
|                 <groupId>org.springframework.boot</groupId> | ||||
|                 <artifactId>spring-boot-maven-plugin</artifactId> | ||||
|                 <executions> | ||||
|                     <execution> | ||||
|                         <goals> | ||||
|                             <goal>repackage</goal> | ||||
|                         </goals> | ||||
|                         <configuration> | ||||
|                             <classifier>spring-boot</classifier> | ||||
|                             <mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass> | ||||
|                         </configuration> | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|             </plugin> | ||||
| 
 | ||||
|             <plugin> | ||||
|                 <groupId>org.codehaus.mojo</groupId> | ||||
|                 <artifactId>exec-maven-plugin</artifactId> | ||||
|                 <version>1.6.0</version> | ||||
|                 <configuration> | ||||
|                     <executable>java</executable> | ||||
|                     <mainClass>com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed</mainClass> | ||||
|                     <arguments> | ||||
|                         <argument>-Xmx300m</argument> | ||||
|                         <argument>-XX:+UseParallelGC</argument> | ||||
|                         <argument>-classpath</argument> | ||||
|                         <classpath/> | ||||
|                         <argument>com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed</argument> | ||||
|                     </arguments> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|              | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-javadoc-plugin</artifactId> | ||||
|                 <version>3.0.0-M1</version> | ||||
|                 <configuration> | ||||
|                     <source>1.8</source> | ||||
| 	                <target>1.8</target> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
| 
 | ||||
| 
 | ||||
|         </plugins> | ||||
| 
 | ||||
|     </build> | ||||
| 
 | ||||
|     <profiles> | ||||
|         <profile> | ||||
|             <id>integration</id> | ||||
|             <build> | ||||
|                 <plugins> | ||||
|                     <plugin> | ||||
|                         <groupId>org.apache.maven.plugins</groupId> | ||||
|                         <artifactId>maven-surefire-plugin</artifactId> | ||||
|                         <executions> | ||||
|                             <execution> | ||||
|                                 <phase>integration-test</phase> | ||||
|                                 <goals> | ||||
|                                     <goal>test</goal> | ||||
|                                 </goals> | ||||
|                                 <configuration> | ||||
|                                     <excludes> | ||||
|                                         <exclude>**/*ManualTest.java</exclude> | ||||
|                                     </excludes> | ||||
|                                     <includes> | ||||
|                                         <include>**/*IntegrationTest.java</include> | ||||
|                                     </includes> | ||||
|                                 </configuration> | ||||
|                             </execution> | ||||
|                         </executions> | ||||
|                         <configuration> | ||||
|                             <systemPropertyVariables> | ||||
|                                 <test.mime>json</test.mime> | ||||
|                             </systemPropertyVariables> | ||||
|                         </configuration> | ||||
|                     </plugin> | ||||
|                     <plugin> | ||||
|                         <groupId>org.codehaus.mojo</groupId> | ||||
|                         <artifactId>exec-maven-plugin</artifactId> | ||||
| 
 | ||||
|                         <executions> | ||||
|                             <execution> | ||||
|                                 <id>run-benchmarks</id> | ||||
|                             <!--    <phase>integration-test</phase>--> | ||||
|                                 <phase>none</phase> | ||||
|                                 <goals> | ||||
|                                     <goal>exec</goal> | ||||
|                                 </goals> | ||||
|                                 <configuration> | ||||
|                                     <classpathScope>test</classpathScope> | ||||
|                                     <executable>java</executable> | ||||
|                                     <arguments> | ||||
|                                         <argument>-classpath</argument> | ||||
|                                         <classpath/> | ||||
|                                         <argument>org.openjdk.jmh.Main</argument> | ||||
|                                         <argument>.*</argument> | ||||
|                                     </arguments> | ||||
|                                 </configuration> | ||||
|                             </execution> | ||||
|                         </executions> | ||||
|                     </plugin> | ||||
|                 </plugins> | ||||
|             </build> | ||||
|         </profile> | ||||
|     </profiles> | ||||
| 
 | ||||
|     <properties> | ||||
|         <!-- marshalling --> | ||||
|         <jackson.version>2.8.5</jackson.version> | ||||
| 
 | ||||
|         <!-- logging --> | ||||
|         <org.slf4j.version>1.7.21</org.slf4j.version> | ||||
|         <logback.version>1.1.7</logback.version> | ||||
| 
 | ||||
|         <!-- util --> | ||||
|         <guava.version>22.0</guava.version> | ||||
|         <commons-lang3.version>3.5</commons-lang3.version> | ||||
|         <bouncycastle.version>1.55</bouncycastle.version> | ||||
|         <commons-codec.version>1.10</commons-codec.version> | ||||
|         <commons-math3.version>3.6.1</commons-math3.version> | ||||
|         <decimal4j.version>1.0.3</decimal4j.version> | ||||
|         <commons-io.version>2.5</commons-io.version> | ||||
|         <commons-collections4.version>4.1</commons-collections4.version> | ||||
|         <collections-generic.version>4.01</collections-generic.version> | ||||
|         <unix4j.version>0.4</unix4j.version> | ||||
|         <grep4j.version>1.8.7</grep4j.version> | ||||
|         <lombok.version>1.16.12</lombok.version> | ||||
|         <fscontext.version>4.6-b01</fscontext.version> | ||||
|         <protonpack.version>1.13</protonpack.version> | ||||
|         <streamex.version>0.6.5</streamex.version> | ||||
|         <vavr.version>0.9.0</vavr.version> | ||||
|          | ||||
|         <!-- testing --> | ||||
|         <org.hamcrest.version>1.3</org.hamcrest.version> | ||||
|         <junit.version>4.12</junit.version> | ||||
|         <mockito.version>2.8.9</mockito.version> | ||||
|         <assertj.version>3.6.1</assertj.version> | ||||
|         <avaitility.version>1.7.0</avaitility.version> | ||||
| 
 | ||||
|         <!-- maven plugins --> | ||||
|         <maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version> | ||||
|         <maven-surefire-plugin.version>2.19.1</maven-surefire-plugin.version> | ||||
|     </properties> | ||||
| </project> | ||||
| @ -0,0 +1,42 @@ | ||||
| package com.baeldung.filesystem.jndi; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.util.Hashtable; | ||||
| 
 | ||||
| import javax.naming.Context; | ||||
| import javax.naming.InitialContext; | ||||
| import javax.naming.NamingException; | ||||
| 
 | ||||
| public class LookupFSJNDI { | ||||
|     private InitialContext ctx = null; | ||||
| 
 | ||||
|     public LookupFSJNDI() throws NamingException { | ||||
|         super(); | ||||
|         init(); | ||||
|     } | ||||
| 
 | ||||
|     private void init() throws NamingException { | ||||
|         Hashtable<String, String> env = new Hashtable<String, String>(); | ||||
| 
 | ||||
|         env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); | ||||
|         // URI to namespace (actual directory) | ||||
|         env.put(Context.PROVIDER_URL, "file:./src/test/resources"); | ||||
| 
 | ||||
|         ctx = new InitialContext(env); | ||||
|     } | ||||
| 
 | ||||
|     public InitialContext getCtx() { | ||||
|         return ctx; | ||||
|     } | ||||
| 
 | ||||
|     public File getFile(String fileName) { | ||||
|         File file; | ||||
|         try { | ||||
|             file = (File) getCtx().lookup(fileName); | ||||
|         } catch (NamingException e) { | ||||
|             file = null; | ||||
|         } | ||||
|         return file; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										48
									
								
								core-java-io/src/main/java/com/baeldung/stream/FileCopy.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								core-java-io/src/main/java/com/baeldung/stream/FileCopy.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | ||||
| package com.baeldung.stream; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileInputStream; | ||||
| import java.io.FileOutputStream; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.io.OutputStream; | ||||
| import java.nio.channels.FileChannel; | ||||
| import java.nio.file.Files; | ||||
| 
 | ||||
| import org.apache.commons.io.FileUtils; | ||||
| 
 | ||||
| public class FileCopy { | ||||
| 
 | ||||
|     public static void copyFileUsingStream(File source, File dest) throws IOException { | ||||
|         InputStream is = null; | ||||
|         OutputStream os = null; | ||||
|         is = new FileInputStream(source); | ||||
|         os = new FileOutputStream(dest); | ||||
|         byte[] buffer = new byte[1024]; | ||||
|         int length; | ||||
|         while ((length = is.read(buffer)) > 0) { | ||||
|             os.write(buffer, 0, length); | ||||
|         } | ||||
|         is.close(); | ||||
|         os.close(); | ||||
|     } | ||||
| 
 | ||||
|     public static void copyFileUsingChannel(File source, File dest) throws IOException { | ||||
|         FileChannel sourceChannel = null; | ||||
|         FileChannel destChannel = null; | ||||
|         sourceChannel = new FileInputStream(source).getChannel(); | ||||
|         destChannel = new FileOutputStream(dest).getChannel(); | ||||
|         destChannel.transferFrom(sourceChannel, 0, sourceChannel.size()); | ||||
|         sourceChannel.close(); | ||||
|         destChannel.close(); | ||||
|     } | ||||
| 
 | ||||
|     public static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException { | ||||
|         FileUtils.copyFile(source, dest); | ||||
|     } | ||||
| 
 | ||||
|     public static void copyFileUsingJavaFiles(File source, File dest) throws IOException { | ||||
|         Files.copy(source.toPath(), dest.toPath()); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										453
									
								
								core-java-io/src/main/resources/ESAPI.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										453
									
								
								core-java-io/src/main/resources/ESAPI.properties
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,453 @@ | ||||
| # | ||||
| # OWASP Enterprise Security API (ESAPI) Properties file -- PRODUCTION Version | ||||
| #  | ||||
| # This file is part of the Open Web Application Security Project (OWASP) | ||||
| # Enterprise Security API (ESAPI) project. For details, please see | ||||
| # http://www.owasp.org/index.php/ESAPI. | ||||
| # | ||||
| # Copyright (c) 2008,2009 - The OWASP Foundation | ||||
| # | ||||
| # DISCUSS: This may cause a major backwards compatibility issue, etc. but | ||||
| #		   from a name space perspective, we probably should have prefaced | ||||
| #		   all the property names with ESAPI or at least OWASP. Otherwise | ||||
| #		   there could be problems is someone loads this properties file into | ||||
| #		   the System properties.  We could also put this file into the | ||||
| #		   esapi.jar file (perhaps as a ResourceBundle) and then allow an external | ||||
| #		   ESAPI properties be defined that would overwrite these defaults. | ||||
| #		   That keeps the application's properties relatively simple as usually | ||||
| #		   they will only want to override a few properties. If looks like we | ||||
| #		   already support multiple override levels of this in the | ||||
| #		   DefaultSecurityConfiguration class, but I'm suggesting placing the | ||||
| #		   defaults in the esapi.jar itself. That way, if the jar is signed, | ||||
| #		   we could detect if those properties had been tampered with. (The | ||||
| #		   code to check the jar signatures is pretty simple... maybe 70-90 LOC, | ||||
| #		   but off course there is an execution penalty (similar to the way | ||||
| #		   that the separate sunjce.jar used to be when a class from it was | ||||
| #		   first loaded). Thoughts? | ||||
| ############################################################################### | ||||
| # | ||||
| # WARNING: Operating system protection should be used to lock down the .esapi | ||||
| # resources directory and all the files inside and all the directories all the | ||||
| # way up to the root directory of the file system.  Note that if you are using | ||||
| # file-based implementations, that some files may need to be read-write as they | ||||
| # get updated dynamically. | ||||
| # | ||||
| # Before using, be sure to update the MasterKey and MasterSalt as described below. | ||||
| # N.B.: If you had stored data that you have previously encrypted with ESAPI 1.4, | ||||
| #		you *must* FIRST decrypt it using ESAPI 1.4 and then (if so desired) | ||||
| #		re-encrypt it with ESAPI 2.0. If you fail to do this, you will NOT be | ||||
| #		able to decrypt your data with ESAPI 2.0. | ||||
| # | ||||
| #		YOU HAVE BEEN WARNED!!! More details are in the ESAPI 2.0 Release Notes. | ||||
| # | ||||
| #=========================================================================== | ||||
| # ESAPI Configuration | ||||
| # | ||||
| # If true, then print all the ESAPI properties set here when they are loaded. | ||||
| # If false, they are not printed. Useful to reduce output when running JUnit tests. | ||||
| # If you need to troubleshoot a properties related problem, turning this on may help. | ||||
| # This is 'false' in the src/test/resources/.esapi version. It is 'true' by | ||||
| # default for reasons of backward compatibility with earlier ESAPI versions. | ||||
| ESAPI.printProperties=true | ||||
| 
 | ||||
| # ESAPI is designed to be easily extensible. You can use the reference implementation | ||||
| # or implement your own providers to take advantage of your enterprise's security | ||||
| # infrastructure. The functions in ESAPI are referenced using the ESAPI locator, like: | ||||
| # | ||||
| #    String ciphertext = | ||||
| #		ESAPI.encryptor().encrypt("Secret message");   // Deprecated in 2.0 | ||||
| #    CipherText cipherText = | ||||
| #		ESAPI.encryptor().encrypt(new PlainText("Secret message")); // Preferred | ||||
| # | ||||
| # Below you can specify the classname for the provider that you wish to use in your | ||||
| # application. The only requirement is that it implement the appropriate ESAPI interface. | ||||
| # This allows you to switch security implementations in the future without rewriting the | ||||
| # entire application. | ||||
| # | ||||
| # ExperimentalAccessController requires ESAPI-AccessControlPolicy.xml in .esapi directory | ||||
| ESAPI.AccessControl=org.owasp.esapi.reference.DefaultAccessController | ||||
| # FileBasedAuthenticator requires users.txt file in .esapi directory | ||||
| ESAPI.Authenticator=org.owasp.esapi.reference.FileBasedAuthenticator | ||||
| ESAPI.Encoder=org.owasp.esapi.reference.DefaultEncoder | ||||
| ESAPI.Encryptor=org.owasp.esapi.reference.crypto.JavaEncryptor | ||||
| 
 | ||||
| ESAPI.Executor=org.owasp.esapi.reference.DefaultExecutor | ||||
| ESAPI.HTTPUtilities=org.owasp.esapi.reference.DefaultHTTPUtilities | ||||
| ESAPI.IntrusionDetector=org.owasp.esapi.reference.DefaultIntrusionDetector | ||||
| # Log4JFactory Requires log4j.xml or log4j.properties in classpath - http://www.laliluna.de/log4j-tutorial.html | ||||
| ESAPI.Logger=org.owasp.esapi.reference.Log4JLogFactory | ||||
| #ESAPI.Logger=org.owasp.esapi.reference.JavaLogFactory | ||||
| ESAPI.Randomizer=org.owasp.esapi.reference.DefaultRandomizer | ||||
| ESAPI.Validator=org.owasp.esapi.reference.DefaultValidator | ||||
| 
 | ||||
| #=========================================================================== | ||||
| # ESAPI Authenticator | ||||
| # | ||||
| Authenticator.AllowedLoginAttempts=3 | ||||
| Authenticator.MaxOldPasswordHashes=13 | ||||
| Authenticator.UsernameParameterName=username | ||||
| Authenticator.PasswordParameterName=password | ||||
| # RememberTokenDuration (in days) | ||||
| Authenticator.RememberTokenDuration=14 | ||||
| # Session Timeouts (in minutes) | ||||
| Authenticator.IdleTimeoutDuration=20 | ||||
| Authenticator.AbsoluteTimeoutDuration=120 | ||||
| 
 | ||||
| #=========================================================================== | ||||
| # ESAPI Encoder | ||||
| # | ||||
| # ESAPI canonicalizes input before validation to prevent bypassing filters with encoded attacks. | ||||
| # Failure to canonicalize input is a very common mistake when implementing validation schemes. | ||||
| # Canonicalization is automatic when using the ESAPI Validator, but you can also use the | ||||
| # following code to canonicalize data. | ||||
| # | ||||
| #      ESAPI.Encoder().canonicalize( "%22hello world"" ); | ||||
| #   | ||||
| # Multiple encoding is when a single encoding format is applied multiple times. Allowing | ||||
| # multiple encoding is strongly discouraged. | ||||
| Encoder.AllowMultipleEncoding=false | ||||
| 
 | ||||
| # Mixed encoding is when multiple different encoding formats are applied, or when  | ||||
| # multiple formats are nested. Allowing multiple encoding is strongly discouraged. | ||||
| Encoder.AllowMixedEncoding=false | ||||
| 
 | ||||
| # The default list of codecs to apply when canonicalizing untrusted data. The list should include the codecs | ||||
| # for all downstream interpreters or decoders. For example, if the data is likely to end up in a URL, HTML, or | ||||
| # inside JavaScript, then the list of codecs below is appropriate. The order of the list is not terribly important. | ||||
| Encoder.DefaultCodecList=HTMLEntityCodec,PercentCodec,JavaScriptCodec | ||||
| 
 | ||||
| 
 | ||||
| #=========================================================================== | ||||
| # ESAPI Encryption | ||||
| # | ||||
| # The ESAPI Encryptor provides basic cryptographic functions with a simplified API. | ||||
| # To get started, generate a new key using java -classpath esapi.jar org.owasp.esapi.reference.crypto.JavaEncryptor | ||||
| # There is not currently any support for key rotation, so be careful when changing your key and salt as it | ||||
| # will invalidate all signed, encrypted, and hashed data. | ||||
| # | ||||
| # WARNING: Not all combinations of algorithms and key lengths are supported. | ||||
| # If you choose to use a key length greater than 128, you MUST download the | ||||
| # unlimited strength policy files and install in the lib directory of your JRE/JDK. | ||||
| # See http://java.sun.com/javase/downloads/index.jsp for more information. | ||||
| # | ||||
| # Backward compatibility with ESAPI Java 1.4 is supported by the two deprecated API | ||||
| # methods, Encryptor.encrypt(String) and Encryptor.decrypt(String). However, whenever | ||||
| # possible, these methods should be avoided as they use ECB cipher mode, which in almost | ||||
| # all circumstances a poor choice because of it's weakness. CBC cipher mode is the default | ||||
| # for the new Encryptor encrypt / decrypt methods for ESAPI Java 2.0.  In general, you | ||||
| # should only use this compatibility setting if you have persistent data encrypted with | ||||
| # version 1.4 and even then, you should ONLY set this compatibility mode UNTIL | ||||
| # you have decrypted all of your old encrypted data and then re-encrypted it with | ||||
| # ESAPI 2.0 using CBC mode. If you have some reason to mix the deprecated 1.4 mode | ||||
| # with the new 2.0 methods, make sure that you use the same cipher algorithm for both | ||||
| # (256-bit AES was the default for 1.4; 128-bit is the default for 2.0; see below for | ||||
| # more details.) Otherwise, you will have to use the new 2.0 encrypt / decrypt methods | ||||
| # where you can specify a SecretKey. (Note that if you are using the 256-bit AES, | ||||
| # that requires downloading the special jurisdiction policy files mentioned above.) | ||||
| # | ||||
| #		***** IMPORTANT: Do NOT forget to replace these with your own values! ***** | ||||
| # To calculate these values, you can run: | ||||
| #		java -classpath esapi.jar org.owasp.esapi.reference.crypto.JavaEncryptor | ||||
| # | ||||
| Encryptor.MasterKey=tzfztf56ftv | ||||
| Encryptor.MasterSalt=123456ztrewq | ||||
| 
 | ||||
| # Provides the default JCE provider that ESAPI will "prefer" for its symmetric | ||||
| # encryption and hashing. (That is it will look to this provider first, but it | ||||
| # will defer to other providers if the requested algorithm is not implemented | ||||
| # by this provider.) If left unset, ESAPI will just use your Java VM's current | ||||
| # preferred JCE provider, which is generally set in the file | ||||
| # "$JAVA_HOME/jre/lib/security/java.security". | ||||
| # | ||||
| # The main intent of this is to allow ESAPI symmetric encryption to be | ||||
| # used with a FIPS 140-2 compliant crypto-module. For details, see the section | ||||
| # "Using ESAPI Symmetric Encryption with FIPS 140-2 Cryptographic Modules" in | ||||
| # the ESAPI 2.0 Symmetric Encryption User Guide, at: | ||||
| # http://owasp-esapi-java.googlecode.com/svn/trunk/documentation/esapi4java-core-2.0-symmetric-crypto-user-guide.html | ||||
| # However, this property also allows you to easily use an alternate JCE provider | ||||
| # such as "Bouncy Castle" without having to make changes to "java.security". | ||||
| # See Javadoc for SecurityProviderLoader for further details. If you wish to use | ||||
| # a provider that is not known to SecurityProviderLoader, you may specify the | ||||
| # fully-qualified class name of the JCE provider class that implements | ||||
| # java.security.Provider. If the name contains a '.', this is interpreted as | ||||
| # a fully-qualified class name that implements java.security.Provider. | ||||
| # | ||||
| # NOTE: Setting this property has the side-effect of changing it in your application | ||||
| #       as well, so if you are using JCE in your application directly rather than | ||||
| #       through ESAPI (you wouldn't do that, would you? ;-), it will change the | ||||
| #       preferred JCE provider there as well. | ||||
| # | ||||
| # Default: Keeps the JCE provider set to whatever JVM sets it to. | ||||
| Encryptor.PreferredJCEProvider= | ||||
| 
 | ||||
| # AES is the most widely used and strongest encryption algorithm. This | ||||
| # should agree with your Encryptor.CipherTransformation property. | ||||
| # By default, ESAPI Java 1.4 uses "PBEWithMD5AndDES" and which is | ||||
| # very weak. It is essentially a password-based encryption key, hashed | ||||
| # with MD5 around 1K times and then encrypted with the weak DES algorithm | ||||
| # (56-bits) using ECB mode and an unspecified padding (it is | ||||
| # JCE provider specific, but most likely "NoPadding"). However, 2.0 uses | ||||
| # "AES/CBC/PKCSPadding". If you want to change these, change them here. | ||||
| # Warning: This property does not control the default reference implementation for | ||||
| #		   ESAPI 2.0 using JavaEncryptor. Also, this property will be dropped | ||||
| #		   in the future. | ||||
| # @deprecated | ||||
| Encryptor.EncryptionAlgorithm=AES | ||||
| #		For ESAPI Java 2.0 - New encrypt / decrypt methods use this. | ||||
| Encryptor.CipherTransformation=AES/CBC/PKCS5Padding | ||||
| 
 | ||||
| # Applies to ESAPI 2.0 and later only! | ||||
| # Comma-separated list of cipher modes that provide *BOTH* | ||||
| # confidentiality *AND* message authenticity. (NIST refers to such cipher | ||||
| # modes as "combined modes" so that's what we shall call them.) If any of these | ||||
| # cipher modes are used then no MAC is calculated and stored | ||||
| # in the CipherText upon encryption. Likewise, if one of these | ||||
| # cipher modes is used with decryption, no attempt will be made | ||||
| # to validate the MAC contained in the CipherText object regardless | ||||
| # of whether it contains one or not. Since the expectation is that | ||||
| # these cipher modes support support message authenticity already, | ||||
| # injecting a MAC in the CipherText object would be at best redundant. | ||||
| # | ||||
| # Note that as of JDK 1.5, the SunJCE provider does not support *any* | ||||
| # of these cipher modes. Of these listed, only GCM and CCM are currently | ||||
| # NIST approved. YMMV for other JCE providers. E.g., Bouncy Castle supports | ||||
| # GCM and CCM with "NoPadding" mode, but not with "PKCS5Padding" or other | ||||
| # padding modes. | ||||
| Encryptor.cipher_modes.combined_modes=GCM,CCM,IAPM,EAX,OCB,CWC | ||||
| 
 | ||||
| # Applies to ESAPI 2.0 and later only! | ||||
| # Additional cipher modes allowed for ESAPI 2.0 encryption. These | ||||
| # cipher modes are in _addition_ to those specified by the property | ||||
| # 'Encryptor.cipher_modes.combined_modes'. | ||||
| # Note: We will add support for streaming modes like CFB & OFB once | ||||
| # we add support for 'specified' to the property 'Encryptor.ChooseIVMethod' | ||||
| # (probably in ESAPI 2.1). | ||||
| # DISCUSS: Better name? | ||||
| Encryptor.cipher_modes.additional_allowed=CBC | ||||
| 
 | ||||
| # 128-bit is almost always sufficient and appears to be more resistant to | ||||
| # related key attacks than is 256-bit AES. Use '_' to use default key size | ||||
| # for cipher algorithms (where it makes sense because the algorithm supports | ||||
| # a variable key size). Key length must agree to what's provided as the | ||||
| # cipher transformation, otherwise this will be ignored after logging a | ||||
| # warning. | ||||
| # | ||||
| # NOTE: This is what applies BOTH ESAPI 1.4 and 2.0. See warning above about mixing! | ||||
| Encryptor.EncryptionKeyLength=128 | ||||
| 
 | ||||
| # Because 2.0 uses CBC mode by default, it requires an initialization vector (IV). | ||||
| # (All cipher modes except ECB require an IV.) There are two choices: we can either | ||||
| # use a fixed IV known to both parties or allow ESAPI to choose a random IV. While | ||||
| # the IV does not need to be hidden from adversaries, it is important that the | ||||
| # adversary not be allowed to choose it. Also, random IVs are generally much more | ||||
| # secure than fixed IVs. (In fact, it is essential that feed-back cipher modes | ||||
| # such as CFB and OFB use a different IV for each encryption with a given key so | ||||
| # in such cases, random IVs are much preferred. By default, ESAPI 2.0 uses random | ||||
| # IVs. If you wish to use 'fixed' IVs, set 'Encryptor.ChooseIVMethod=fixed' and | ||||
| # uncomment the Encryptor.fixedIV. | ||||
| # | ||||
| # Valid values:		random|fixed|specified		'specified' not yet implemented; planned for 2.1 | ||||
| Encryptor.ChooseIVMethod=random | ||||
| # If you choose to use a fixed IV, then you must place a fixed IV here that | ||||
| # is known to all others who are sharing your secret key. The format should | ||||
| # be a hex string that is the same length as the cipher block size for the | ||||
| # cipher algorithm that you are using. The following is an *example* for AES | ||||
| # from an AES test vector for AES-128/CBC as described in: | ||||
| # NIST Special Publication 800-38A (2001 Edition) | ||||
| # "Recommendation for Block Cipher Modes of Operation". | ||||
| # (Note that the block size for AES is 16 bytes == 128 bits.) | ||||
| # | ||||
| Encryptor.fixedIV=0x000102030405060708090a0b0c0d0e0f | ||||
| 
 | ||||
| # Whether or not CipherText should use a message authentication code (MAC) with it. | ||||
| # This prevents an adversary from altering the IV as well as allowing a more | ||||
| # fool-proof way of determining the decryption failed because of an incorrect | ||||
| # key being supplied. This refers to the "separate" MAC calculated and stored | ||||
| # in CipherText, not part of any MAC that is calculated as a result of a | ||||
| # "combined mode" cipher mode. | ||||
| # | ||||
| # If you are using ESAPI with a FIPS 140-2 cryptographic module, you *must* also | ||||
| # set this property to false. | ||||
| Encryptor.CipherText.useMAC=true | ||||
| 
 | ||||
| # Whether or not the PlainText object may be overwritten and then marked | ||||
| # eligible for garbage collection. If not set, this is still treated as 'true'. | ||||
| Encryptor.PlainText.overwrite=true | ||||
| 
 | ||||
| # Do not use DES except in a legacy situations. 56-bit is way too small key size. | ||||
| #Encryptor.EncryptionKeyLength=56 | ||||
| #Encryptor.EncryptionAlgorithm=DES | ||||
| 
 | ||||
| # TripleDES is considered strong enough for most purposes. | ||||
| #	Note:	There is also a 112-bit version of DESede. Using the 168-bit version | ||||
| #			requires downloading the special jurisdiction policy from Sun. | ||||
| #Encryptor.EncryptionKeyLength=168 | ||||
| #Encryptor.EncryptionAlgorithm=DESede | ||||
| 
 | ||||
| Encryptor.HashAlgorithm=SHA-512 | ||||
| Encryptor.HashIterations=1024 | ||||
| Encryptor.DigitalSignatureAlgorithm=SHA1withDSA | ||||
| Encryptor.DigitalSignatureKeyLength=1024 | ||||
| Encryptor.RandomAlgorithm=SHA1PRNG | ||||
| Encryptor.CharacterEncoding=UTF-8 | ||||
| 
 | ||||
| # This is the Pseudo Random Function (PRF) that ESAPI's Key Derivation Function | ||||
| # (KDF) normally uses. Note this is *only* the PRF used for ESAPI's KDF and | ||||
| # *not* what is used for ESAPI's MAC. (Currently, HmacSHA1 is always used for | ||||
| # the MAC, mostly to keep the overall size at a minimum.) | ||||
| # | ||||
| # Currently supported choices for JDK 1.5 and 1.6 are: | ||||
| #	HmacSHA1 (160 bits), HmacSHA256 (256 bits), HmacSHA384 (384 bits), and | ||||
| #	HmacSHA512 (512 bits). | ||||
| # Note that HmacMD5 is *not* supported for the PRF used by the KDF even though | ||||
| # the JDKs support it.  See the ESAPI 2.0 Symmetric Encryption User Guide | ||||
| # further details. | ||||
| Encryptor.KDF.PRF=HmacSHA256 | ||||
| #=========================================================================== | ||||
| # ESAPI HttpUtilties | ||||
| # | ||||
| # The HttpUtilities provide basic protections to HTTP requests and responses. Primarily these methods  | ||||
| # protect against malicious data from attackers, such as unprintable characters, escaped characters, | ||||
| # and other simple attacks. The HttpUtilities also provides utility methods for dealing with cookies, | ||||
| # headers, and CSRF tokens. | ||||
| # | ||||
| # Default file upload location (remember to escape backslashes with \\) | ||||
| HttpUtilities.UploadDir=C:\\ESAPI\\testUpload | ||||
| HttpUtilities.UploadTempDir=C:\\temp | ||||
| # Force flags on cookies, if you use HttpUtilities to set cookies | ||||
| HttpUtilities.ForceHttpOnlySession=false | ||||
| HttpUtilities.ForceSecureSession=false | ||||
| HttpUtilities.ForceHttpOnlyCookies=true | ||||
| HttpUtilities.ForceSecureCookies=true | ||||
| # Maximum size of HTTP headers | ||||
| HttpUtilities.MaxHeaderSize=4096 | ||||
| # File upload configuration | ||||
| HttpUtilities.ApprovedUploadExtensions=.zip,.pdf,.doc,.docx,.ppt,.pptx,.tar,.gz,.tgz,.rar,.war,.jar,.ear,.xls,.rtf,.properties,.java,.class,.txt,.xml,.jsp,.jsf,.exe,.dll | ||||
| HttpUtilities.MaxUploadFileBytes=500000000 | ||||
| # Using UTF-8 throughout your stack is highly recommended. That includes your database driver, | ||||
| # container, and any other technologies you may be using. Failure to do this may expose you | ||||
| # to Unicode transcoding injection attacks. Use of UTF-8 does not hinder internationalization. | ||||
| HttpUtilities.ResponseContentType=text/html; charset=UTF-8 | ||||
| # This is the name of the cookie used to represent the HTTP session | ||||
| # Typically this will be the default "JSESSIONID"  | ||||
| HttpUtilities.HttpSessionIdName=JSESSIONID | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #=========================================================================== | ||||
| # ESAPI Executor | ||||
| # CHECKME - Not sure what this is used for, but surely it should be made OS independent. | ||||
| Executor.WorkingDirectory=C:\\Windows\\Temp | ||||
| Executor.ApprovedExecutables=C:\\Windows\\System32\\cmd.exe,C:\\Windows\\System32\\runas.exe | ||||
| 
 | ||||
| 
 | ||||
| #=========================================================================== | ||||
| # ESAPI Logging | ||||
| # Set the application name if these logs are combined with other applications | ||||
| Logger.ApplicationName=ExampleApplication | ||||
| # If you use an HTML log viewer that does not properly HTML escape log data, you can set LogEncodingRequired to true | ||||
| Logger.LogEncodingRequired=false | ||||
| # Determines whether ESAPI should log the application name. This might be clutter in some single-server/single-app environments. | ||||
| Logger.LogApplicationName=true | ||||
| # Determines whether ESAPI should log the server IP and port. This might be clutter in some single-server environments. | ||||
| Logger.LogServerIP=true | ||||
| # LogFileName, the name of the logging file. Provide a full directory path (e.g., C:\\ESAPI\\ESAPI_logging_file) if you | ||||
| # want to place it in a specific directory. | ||||
| Logger.LogFileName=ESAPI_logging_file | ||||
| # MaxLogFileSize, the max size (in bytes) of a single log file before it cuts over to a new one (default is 10,000,000) | ||||
| Logger.MaxLogFileSize=10000000 | ||||
| 
 | ||||
| 
 | ||||
| #=========================================================================== | ||||
| # ESAPI Intrusion Detection | ||||
| # | ||||
| # Each event has a base to which .count, .interval, and .action are added | ||||
| # The IntrusionException will fire if we receive "count" events within "interval" seconds | ||||
| # The IntrusionDetector is configurable to take the following actions: log, logout, and disable | ||||
| #  (multiple actions separated by commas are allowed e.g. event.test.actions=log,disable | ||||
| # | ||||
| # Custom Events | ||||
| # Names must start with "event." as the base | ||||
| # Use IntrusionDetector.addEvent( "test" ) in your code to trigger "event.test" here | ||||
| # You can also disable intrusion detection completely by changing | ||||
| # the following parameter to true | ||||
| # | ||||
| IntrusionDetector.Disable=false | ||||
| # | ||||
| IntrusionDetector.event.test.count=2 | ||||
| IntrusionDetector.event.test.interval=10 | ||||
| IntrusionDetector.event.test.actions=disable,log | ||||
| 
 | ||||
| # Exception Events | ||||
| # All EnterpriseSecurityExceptions are registered automatically | ||||
| # Call IntrusionDetector.getInstance().addException(e) for Exceptions that do not extend EnterpriseSecurityException | ||||
| # Use the fully qualified classname of the exception as the base | ||||
| 
 | ||||
| # any intrusion is an attack | ||||
| IntrusionDetector.org.owasp.esapi.errors.IntrusionException.count=1 | ||||
| IntrusionDetector.org.owasp.esapi.errors.IntrusionException.interval=1 | ||||
| IntrusionDetector.org.owasp.esapi.errors.IntrusionException.actions=log,disable,logout | ||||
| 
 | ||||
| # for test purposes | ||||
| # CHECKME: Shouldn't there be something in the property name itself that designates | ||||
| #		   that these are for testing??? | ||||
| IntrusionDetector.org.owasp.esapi.errors.IntegrityException.count=10 | ||||
| IntrusionDetector.org.owasp.esapi.errors.IntegrityException.interval=5 | ||||
| IntrusionDetector.org.owasp.esapi.errors.IntegrityException.actions=log,disable,logout | ||||
| 
 | ||||
| # rapid validation errors indicate scans or attacks in progress | ||||
| # org.owasp.esapi.errors.ValidationException.count=10 | ||||
| # org.owasp.esapi.errors.ValidationException.interval=10 | ||||
| # org.owasp.esapi.errors.ValidationException.actions=log,logout | ||||
| 
 | ||||
| # sessions jumping between hosts indicates session hijacking | ||||
| IntrusionDetector.org.owasp.esapi.errors.AuthenticationHostException.count=2 | ||||
| IntrusionDetector.org.owasp.esapi.errors.AuthenticationHostException.interval=10 | ||||
| IntrusionDetector.org.owasp.esapi.errors.AuthenticationHostException.actions=log,logout | ||||
| 
 | ||||
| 
 | ||||
| #=========================================================================== | ||||
| # ESAPI Validation | ||||
| # | ||||
| # The ESAPI Validator works on regular expressions with defined names. You can define names | ||||
| # either here, or you may define application specific patterns in a separate file defined below. | ||||
| # This allows enterprises to specify both organizational standards as well as application specific | ||||
| # validation rules. | ||||
| # | ||||
| Validator.ConfigurationFile=validation.properties | ||||
| 
 | ||||
| # Validators used by ESAPI | ||||
| Validator.AccountName=^[a-zA-Z0-9]{3,20}$ | ||||
| Validator.SystemCommand=^[a-zA-Z\\-\\/]{1,64}$ | ||||
| Validator.RoleName=^[a-z]{1,20}$ | ||||
| 
 | ||||
| #the word TEST below should be changed to your application  | ||||
| #name - only relative URL's are supported | ||||
| Validator.Redirect=^\\/test.*$ | ||||
| 
 | ||||
| # Global HTTP Validation Rules | ||||
| # Values with Base64 encoded data (e.g. encrypted state) will need at least [a-zA-Z0-9\/+=] | ||||
| Validator.HTTPScheme=^(http|https)$ | ||||
| Validator.HTTPServerName=^[a-zA-Z0-9_.\\-]*$ | ||||
| Validator.HTTPParameterName=^[a-zA-Z0-9_]{1,32}$ | ||||
| Validator.HTTPParameterValue=^[a-zA-Z0-9.\\-\\/+=@_ ]*$ | ||||
| Validator.HTTPCookieName=^[a-zA-Z0-9\\-_]{1,32}$ | ||||
| Validator.HTTPCookieValue=^[a-zA-Z0-9\\-\\/+=_ ]*$ | ||||
| Validator.HTTPHeaderName=^[a-zA-Z0-9\\-_]{1,32}$ | ||||
| Validator.HTTPHeaderValue=^[a-zA-Z0-9()\\-=\\*\\.\\?;,+\\/:&_ ]*$ | ||||
| Validator.HTTPContextPath=^\\/?[a-zA-Z0-9.\\-\\/_]*$ | ||||
| Validator.HTTPServletPath=^[a-zA-Z0-9.\\-\\/_]*$ | ||||
| Validator.HTTPPath=^[a-zA-Z0-9.\\-_]*$ | ||||
| Validator.HTTPQueryString=^[a-zA-Z0-9()\\-=\\*\\.\\?;,+\\/:&_ %]*$ | ||||
| Validator.HTTPURI=^[a-zA-Z0-9()\\-=\\*\\.\\?;,+\\/:&_ ]*$ | ||||
| Validator.HTTPURL=^.*$ | ||||
| Validator.HTTPJSESSIONID=^[A-Z0-9]{10,30}$ | ||||
| 
 | ||||
| # Validation of file related input | ||||
| Validator.FileName=^[a-zA-Z0-9!@#$%^&{}\\[\\]()_+\\-=,.~'` ]{1,255}$ | ||||
| Validator.DirectoryName=^[a-zA-Z0-9:/\\\\!@#$%^&{}\\[\\]()_+\\-=,.~'` ]{1,255}$ | ||||
| 
 | ||||
| # Validation of dates. Controls whether or not 'lenient' dates are accepted. | ||||
| # See DataFormat.setLenient(boolean flag) for further details. | ||||
| Validator.AcceptLenientDates=false | ||||
| 
 | ||||
							
								
								
									
										0
									
								
								spring-boot-actuator/README.MD → core-java-io/src/main/resources/META-INF/BenchmarkList
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								spring-boot-actuator/README.MD → core-java-io/src/main/resources/META-INF/BenchmarkList
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
								
								
									
										20
									
								
								core-java-io/src/main/resources/META-INF/persistence.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								core-java-io/src/main/resources/META-INF/persistence.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" ?> | ||||
| <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" | ||||
|     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence | ||||
|         http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" version="2.1"> | ||||
| 
 | ||||
|     <!-- JDO tutorial "unit" --> | ||||
|     <persistence-unit name="Tutorial"> | ||||
|         <exclude-unlisted-classes/> | ||||
| 		<properties> | ||||
| 			<property name="javax.jdo.PersistenceManagerFactoryClass" value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory"/>		 | ||||
| 		    <property name="javax.jdo.option.ConnectionURL" value="jdbc:h2:mem:mypersistence"/> | ||||
| 		    <property name="javax.jdo.option.ConnectionDriverName" value="org.h2.Driver"/> | ||||
| 		    <property name="javax.jdo.option.ConnectionUserName" value="sa"/> | ||||
| 		    <property name="javax.jdo.option.ConnectionPassword" value=""/> | ||||
| 		    <property name="datanucleus.schema.autoCreateAll" value="true"/> | ||||
| 		</properties> | ||||
|     </persistence-unit> | ||||
| </persistence> | ||||
| 
 | ||||
| @ -0,0 +1 @@ | ||||
| com.baeldung.javac.SampleJavacPlugin | ||||
							
								
								
									
										3
									
								
								core-java-io/src/main/resources/countries.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								core-java-io/src/main/resources/countries.properties
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| UK | ||||
| US | ||||
| Germany | ||||
							
								
								
									
										3
									
								
								core-java-io/src/main/resources/data.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								core-java-io/src/main/resources/data.csv
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| 1|IND|India | ||||
| 2|MY|Malaysia | ||||
| 3|AU|Australia | ||||
| 
 | 
							
								
								
									
										6
									
								
								core-java-io/src/main/resources/datasource.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								core-java-io/src/main/resources/datasource.properties
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| dataSourceClassName=//TBD | ||||
| dataSource.user=//TBD | ||||
| dataSource.password=//TBD | ||||
| dataSource.databaseName=//TBD | ||||
| dataSource.portNumber=//TBD | ||||
| dataSource.serverName=//TBD | ||||
							
								
								
									
										15
									
								
								core-java-io/src/main/resources/js/bind.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								core-java-io/src/main/resources/js/bind.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| var first = { | ||||
|     name: "Whiskey", | ||||
|     age: 5 | ||||
| }; | ||||
| 
 | ||||
| var second = { | ||||
|     volume: 100 | ||||
| }; | ||||
| 
 | ||||
| Object.bindProperties(first, second); | ||||
| 
 | ||||
| print(first.volume); | ||||
| 
 | ||||
| second.volume = 1000; | ||||
| print(first.volume); | ||||
							
								
								
									
										1
									
								
								core-java-io/src/main/resources/js/locations.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								core-java-io/src/main/resources/js/locations.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| print(__FILE__, __LINE__, __DIR__); | ||||
							
								
								
									
										19
									
								
								core-java-io/src/main/resources/js/math_module.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								core-java-io/src/main/resources/js/math_module.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| var math = { | ||||
|     increment: function (num) { | ||||
|         return ++num; | ||||
|     }, | ||||
| 
 | ||||
|     failFunc: function () { | ||||
|         try { | ||||
|             throw "BOOM"; | ||||
|         } catch (e if typeof e === 'string') { | ||||
|             print("String thrown: " + e); | ||||
|         } | ||||
|         catch (e) { | ||||
|             print("this shouldn't happen!"); | ||||
|         } | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| math; | ||||
							
								
								
									
										11
									
								
								core-java-io/src/main/resources/js/no_such.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								core-java-io/src/main/resources/js/no_such.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| var demo = { | ||||
|     __noSuchProperty__: function (propName) { | ||||
|         print("Accessed non-existing property: " + propName); | ||||
|     }, | ||||
| 
 | ||||
|     __noSuchMethod__: function (methodName) { | ||||
|         print("Invoked non-existing method: " + methodName); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| demo; | ||||
							
								
								
									
										1
									
								
								core-java-io/src/main/resources/js/script.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								core-java-io/src/main/resources/js/script.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| function increment(num) ++num; | ||||
							
								
								
									
										2
									
								
								core-java-io/src/main/resources/js/trim.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								core-java-io/src/main/resources/js/trim.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | ||||
| print("   hello world".trimLeft()); | ||||
| print("hello world     ".trimRight()); | ||||
							
								
								
									
										9
									
								
								core-java-io/src/main/resources/js/typed_arrays.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								core-java-io/src/main/resources/js/typed_arrays.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| function arrays(arr) { | ||||
| 
 | ||||
|     var javaIntArray = Java.to(arr, "int[]"); | ||||
|     print(javaIntArray[0]); | ||||
|     print(javaIntArray[1]); | ||||
|     print(javaIntArray[2]); | ||||
| } | ||||
| 
 | ||||
| arrays([100, "1654", true]); | ||||
							
								
								
									
										6
									
								
								core-java-io/src/main/resources/log4j.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								core-java-io/src/main/resources/log4j.properties
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| log4j.rootLogger=DEBUG, A1 | ||||
| 
 | ||||
| log4j.appender.A1=org.apache.log4j.ConsoleAppender | ||||
| 
 | ||||
| log4j.appender.A1.layout=org.apache.log4j.PatternLayout | ||||
| log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n | ||||
| @ -0,0 +1,9 @@ | ||||
| 
 | ||||
| # Root logger  | ||||
| log4j.rootLogger=INFO, file, stdout | ||||
| 
 | ||||
| # Write to console | ||||
| log4j.appender.stdout=org.apache.log4j.ConsoleAppender | ||||
| log4j.appender.stdout.Target=System.out | ||||
| log4j.appender.stdout.layout=org.apache.log4j.PatternLayout | ||||
| log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user