Merge branch 'eugenp:master' into master
This commit is contained in:
commit
7df45847e3
38
.github/ISSUE_TEMPLATE/issue_report.md
vendored
Normal file
38
.github/ISSUE_TEMPLATE/issue_report.md
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
name: Issue Report
|
||||||
|
about: Report an issue to help us improve
|
||||||
|
title: '[ISSUE] '
|
||||||
|
---
|
||||||
|
|
||||||
|
**Article and Module Links**
|
||||||
|
A link to the affected article and the affected module. The link to the module is the one in the "over on GitHub" standard phrase.
|
||||||
|
|
||||||
|
**Describe the Issue**
|
||||||
|
A clear and concise description of what the issue is.
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '....'
|
||||||
|
3. Scroll down to '....'
|
||||||
|
4. See error
|
||||||
|
|
||||||
|
**Expected Behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Environment (please complete the following information):**
|
||||||
|
- OS: [e.g. Windows]
|
||||||
|
- Browser [e.g. chrome, safari]
|
||||||
|
- Version [e.g. 22]
|
||||||
|
|
||||||
|
**Additional Context**
|
||||||
|
Add any other context about the issue here.
|
||||||
|
|
||||||
|
Note that, unfortunately, we can only help with issues that are specifically and directly related to the article - not with your own, custom application.
|
||||||
|
|
||||||
|
StackOverflow is a great place to ask more general questions.
|
||||||
|
|
||||||
|
That's primarily because we get a large number of questions and - while we do try to go through as much as everything and help wherever we can, we can't really get back to all of them.
|
11
CONTRIBUTING.md
Normal file
11
CONTRIBUTING.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Contributing to Baeldung Tutorials
|
||||||
|
First off, thank you for considering contributing to Baeldung Tutorials.
|
||||||
|
|
||||||
|
## Reporting Issues
|
||||||
|
Before you submit an issue, please review the guidelines below:
|
||||||
|
|
||||||
|
1. **No Custom Modifications:** If your issue arises from any custom modifications you've made to the code in the repository, we won't be able to assist. We can only help if the issue is reproducible with the untouched codebase from this repo. If you're working with a modified version, consider asking for help on StackOverflow or other relevant forums.
|
||||||
|
2. **Use a clear and descriptive title** for the issue to identify the problem.
|
||||||
|
3. **Include a link to the article** you're having issues with.
|
||||||
|
4. **Describe the exact steps which reproduce the problem** in as many details as possible.
|
||||||
|
5. **Additional Details:** Offer any other context or descriptions that could be useful. Screenshots, error messages, copy/pasteable snippets, or logs can be immensely helpful.
|
97
apache-poi-3/pom.xml
Normal file
97
apache-poi-3/pom.xml
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>apache-poi-3</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<name>apache-poi-3</name>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-modules</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.poi</groupId>
|
||||||
|
<artifactId>poi-ooxml</artifactId>
|
||||||
|
<version>${poi.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.poi</groupId>
|
||||||
|
<artifactId>poi-scratchpad</artifactId>
|
||||||
|
<version>${poi.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- https://mvnrepository.com/artifact/com.github.ozlerhakan/poiji -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.ozlerhakan</groupId>
|
||||||
|
<artifactId>poiji</artifactId>
|
||||||
|
<version>${poiji.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi/5.2.3 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.poi</groupId>
|
||||||
|
<artifactId>poi</artifactId>
|
||||||
|
<version>${poi.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas/4.1.2 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.poi</groupId>
|
||||||
|
<artifactId>poi-ooxml-schemas</artifactId>
|
||||||
|
<version>4.1.2</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.apache.xmlbeans/xmlbeans/5.1.1 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.xmlbeans</groupId>
|
||||||
|
<artifactId>xmlbeans</artifactId>
|
||||||
|
<version>5.1.1</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-collections4</artifactId>
|
||||||
|
<version>4.4</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.dhatim/fastexcel/0.15.7 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.dhatim</groupId>
|
||||||
|
<artifactId>fastexcel</artifactId>
|
||||||
|
<version>${fastexcel.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.dhatim/fastexcel-reader/0.15.7 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.dhatim</groupId>
|
||||||
|
<artifactId>fastexcel-reader</artifactId>
|
||||||
|
<version>${fastexcel.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl/2.6.12 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.sourceforge.jexcelapi</groupId>
|
||||||
|
<artifactId>jxl</artifactId>
|
||||||
|
<version>${jxl.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-api</artifactId>
|
||||||
|
<version>2.17.1</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-core</artifactId>
|
||||||
|
<version>2.17.1</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<poi.version>5.2.3</poi.version>
|
||||||
|
<poiji.version>4.1.1</poiji.version>
|
||||||
|
<fastexcel.version>0.15.7</fastexcel.version>
|
||||||
|
<jxl.version>2.6.12</jxl.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,54 @@
|
|||||||
|
package com.baeldung.convert.exceldatatolist;
|
||||||
|
|
||||||
|
import com.poiji.annotation.ExcelCellName;
|
||||||
|
|
||||||
|
public class FoodInfo {
|
||||||
|
|
||||||
|
@ExcelCellName("Category")
|
||||||
|
private String category; //food category
|
||||||
|
@ExcelCellName("Name")
|
||||||
|
private String name; // food name
|
||||||
|
@ExcelCellName("Measure")
|
||||||
|
private String measure;
|
||||||
|
@ExcelCellName("Calories")
|
||||||
|
private double calories; //amount of calories in kcal/measure
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "FoodInfo{" + "category='" + category + '\'' + ", name='" + name + '\'' + ", measure='" + measure + '\'' + ", calories=" + calories + "} \n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getCategory() {
|
||||||
|
return category;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCategory(String category) {
|
||||||
|
this.category = category;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMeasure() {
|
||||||
|
return measure;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMeasure(String measure) {
|
||||||
|
this.measure = measure;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getCalories() {
|
||||||
|
return calories;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCalories(double calories) {
|
||||||
|
this.calories = calories;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package com.baeldung.convert.exceldatatolist.fastexcel;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import org.dhatim.fastexcel.reader.ReadableWorkbook;
|
||||||
|
import org.dhatim.fastexcel.reader.Row;
|
||||||
|
import org.dhatim.fastexcel.reader.Sheet;
|
||||||
|
|
||||||
|
import com.baeldung.convert.exceldatatolist.FoodInfo;
|
||||||
|
|
||||||
|
public class ExcelDataToListOfObjectsFastExcel {
|
||||||
|
public static List<FoodInfo> excelDataToListOfObjets_withFastExcel(String fileLocation)throws IOException, NumberFormatException {
|
||||||
|
List<FoodInfo> foodData = new ArrayList<FoodInfo>();
|
||||||
|
|
||||||
|
try (FileInputStream file = new FileInputStream(fileLocation);
|
||||||
|
ReadableWorkbook wb = new ReadableWorkbook(file)) {
|
||||||
|
Sheet sheet = wb.getFirstSheet();
|
||||||
|
for (Row row:
|
||||||
|
sheet.read()
|
||||||
|
) {
|
||||||
|
if(row.getRowNum() == 1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
FoodInfo food = new FoodInfo();
|
||||||
|
food.setCategory(row.getCellText(0));
|
||||||
|
food.setName(row.getCellText(1));
|
||||||
|
food.setMeasure(row.getCellText(2));
|
||||||
|
food.setCalories(Double.parseDouble(row.getCellText(3)));
|
||||||
|
|
||||||
|
foodData.add(food);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return foodData;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package com.baeldung.convert.exceldatatolist.jexcelapi;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.baeldung.convert.exceldatatolist.FoodInfo;
|
||||||
|
|
||||||
|
import jxl.Sheet;
|
||||||
|
import jxl.Workbook;
|
||||||
|
import jxl.read.biff.BiffException;
|
||||||
|
|
||||||
|
public class ExcelDataToListOfObjectsJxl {
|
||||||
|
public static List<FoodInfo> excelDataToListOfObjets_withJxl(String fileLocation) throws IOException, BiffException {
|
||||||
|
|
||||||
|
List<FoodInfo> foodData = new ArrayList<FoodInfo>();
|
||||||
|
|
||||||
|
Workbook workbook = Workbook.getWorkbook(new File(fileLocation));
|
||||||
|
Sheet sheet = workbook.getSheet(0);
|
||||||
|
|
||||||
|
int rows = sheet.getRows();
|
||||||
|
|
||||||
|
for (int i = 1; i < rows; i++) {
|
||||||
|
FoodInfo foodInfo = new FoodInfo();
|
||||||
|
|
||||||
|
foodInfo.setCategory(sheet.getCell(0, i).getContents());
|
||||||
|
foodInfo.setName(sheet.getCell(1, i).getContents());
|
||||||
|
foodInfo.setMeasure(sheet.getCell(2, i).getContents());
|
||||||
|
foodInfo.setCalories(Double.parseDouble(sheet.getCell(3, i).getContents()));
|
||||||
|
|
||||||
|
foodData.add(foodInfo);
|
||||||
|
|
||||||
|
}
|
||||||
|
return foodData;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package com.baeldung.convert.exceldatatolist.poi;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.DataFormatter;
|
||||||
|
import org.apache.poi.ss.usermodel.Row;
|
||||||
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
|
||||||
|
import com.baeldung.convert.exceldatatolist.FoodInfo;
|
||||||
|
|
||||||
|
public class ExcelDataToListApachePOI {
|
||||||
|
public static List<FoodInfo> excelDataToListOfObjets_withApachePOI(String fileLocation) throws IOException {
|
||||||
|
FileInputStream file = new FileInputStream(new File(fileLocation));
|
||||||
|
Workbook workbook = new XSSFWorkbook(file);
|
||||||
|
Sheet sheet = workbook.getSheetAt(0);
|
||||||
|
List<FoodInfo> foodData = new ArrayList<FoodInfo>();
|
||||||
|
DataFormatter dataFormatter = new DataFormatter();
|
||||||
|
for (int n = 1; n < sheet.getPhysicalNumberOfRows(); n++) {
|
||||||
|
Row row = sheet.getRow(n);
|
||||||
|
FoodInfo foodInfo = new FoodInfo();
|
||||||
|
int i = row.getFirstCellNum();
|
||||||
|
|
||||||
|
foodInfo.setCategory(dataFormatter.formatCellValue(row.getCell(i)));
|
||||||
|
foodInfo.setName(dataFormatter.formatCellValue(row.getCell(++i)));
|
||||||
|
foodInfo.setMeasure(dataFormatter.formatCellValue(row.getCell(++i)));
|
||||||
|
foodInfo.setCalories(Double.parseDouble(dataFormatter.formatCellValue(row.getCell(++i))));
|
||||||
|
|
||||||
|
foodData.add(foodInfo);
|
||||||
|
|
||||||
|
}
|
||||||
|
return foodData;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.baeldung.convert.exceldatatolist.poiji;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.baeldung.convert.exceldatatolist.FoodInfo;
|
||||||
|
import com.poiji.bind.Poiji;
|
||||||
|
|
||||||
|
public class ExcelDataToListOfObjectsPOIJI {
|
||||||
|
public static List<FoodInfo> excelDataToListOfObjets_withPOIJI(String fileLocation){
|
||||||
|
return Poiji.fromExcel(new File(fileLocation), FoodInfo.class);
|
||||||
|
}
|
||||||
|
}
|
BIN
apache-poi-3/src/main/resources/food_info.xls
Normal file
BIN
apache-poi-3/src/main/resources/food_info.xls
Normal file
Binary file not shown.
BIN
apache-poi-3/src/main/resources/food_info.xlsx
Normal file
BIN
apache-poi-3/src/main/resources/food_info.xlsx
Normal file
Binary file not shown.
@ -0,0 +1,53 @@
|
|||||||
|
package com.baeldung.convert.exceldatatolist;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
// import org.junit.jupiter.api.Test;
|
||||||
|
// import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.baeldung.convert.exceldatatolist.fastexcel.ExcelDataToListOfObjectsFastExcel;
|
||||||
|
import com.baeldung.convert.exceldatatolist.jexcelapi.ExcelDataToListOfObjectsJxl;
|
||||||
|
import com.baeldung.convert.exceldatatolist.poi.ExcelDataToListApachePOI;
|
||||||
|
import com.baeldung.convert.exceldatatolist.poiji.ExcelDataToListOfObjectsPOIJI;
|
||||||
|
|
||||||
|
import jxl.read.biff.BiffException;
|
||||||
|
|
||||||
|
public class ExcelDataToListOfObjectsUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenParsingExcelFileWithPOIJI_thenConvertsToList() throws IOException {
|
||||||
|
List<FoodInfo> foodInfoList = ExcelDataToListOfObjectsPOIJI.excelDataToListOfObjets_withPOIJI("src/main/resources/food_info.xlsx");
|
||||||
|
|
||||||
|
assertEquals("Beverages", foodInfoList.get(0).getCategory());
|
||||||
|
assertEquals("Dairy", foodInfoList.get(3).getCategory());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenParsingExcelFileWithApachePOI_thenConvertsToList() throws IOException {
|
||||||
|
List<FoodInfo> foodInfoList = ExcelDataToListApachePOI.excelDataToListOfObjets_withApachePOI("src/main/resources/food_info.xlsx");
|
||||||
|
|
||||||
|
assertEquals("Beverages", foodInfoList.get(0).getCategory());
|
||||||
|
assertEquals("Dairy", foodInfoList.get(3).getCategory());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenParsingExcelFileWithFastExcel_thenConvertsToList() throws IOException {
|
||||||
|
List<FoodInfo> foodInfoList = ExcelDataToListOfObjectsFastExcel.excelDataToListOfObjets_withFastExcel("src/main/resources/food_info.xlsx");
|
||||||
|
|
||||||
|
assertEquals("Beverages", foodInfoList.get(0).getCategory());
|
||||||
|
assertEquals("Dairy", foodInfoList.get(3).getCategory());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenParsingExcelFileWithJxl_thenConvertsToList() throws IOException, BiffException {
|
||||||
|
List<FoodInfo> foodInfoList = ExcelDataToListOfObjectsJxl.excelDataToListOfObjets_withJxl("src/main/resources/food_info.xls");
|
||||||
|
|
||||||
|
assertEquals("Beverages", foodInfoList.get(0).getCategory());
|
||||||
|
assertEquals("Dairy", foodInfoList.get(3).getCategory());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
package com.baeldung.poi.excel.expandcolumn;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.*;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class ExpandColumnUnitTest {
|
||||||
|
|
||||||
|
private Workbook workbook;
|
||||||
|
private Sheet sheet;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void prepareSpreadsheet() {
|
||||||
|
workbook = new XSSFWorkbook();
|
||||||
|
sheet = workbook.createSheet();
|
||||||
|
|
||||||
|
Row headerRow = sheet.createRow(0);
|
||||||
|
Cell headerCell1 = headerRow.createCell(0);
|
||||||
|
headerCell1.setCellValue("Full Name");
|
||||||
|
Cell headerCell2 = headerRow.createCell(1);
|
||||||
|
headerCell2.setCellValue("Abbreviation");
|
||||||
|
|
||||||
|
Row dataRow = sheet.createRow(1);
|
||||||
|
Cell dataCell1 = dataRow.createCell(0);
|
||||||
|
dataCell1.setCellValue("Java Virtual Machine");
|
||||||
|
Cell dataCell2 = dataRow.createCell(1);
|
||||||
|
dataCell2.setCellValue("JVM");
|
||||||
|
|
||||||
|
dataRow = sheet.createRow(2);
|
||||||
|
dataCell1 = dataRow.createCell(0);
|
||||||
|
dataCell1.setCellValue("Java Runtime Environment");
|
||||||
|
dataCell2 = dataRow.createCell(1);
|
||||||
|
dataCell2.setCellValue("JRE");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenSetColumnWidth_thenColumnSetToTheSpecifiedWidth() {
|
||||||
|
|
||||||
|
Row row = sheet.getRow(2);
|
||||||
|
String cellValue = row.getCell(0).getStringCellValue();
|
||||||
|
int targetWidth = cellValue.length() * 256;
|
||||||
|
|
||||||
|
sheet.setColumnWidth(0, targetWidth);
|
||||||
|
|
||||||
|
assertEquals(targetWidth, sheet.getColumnWidth(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenAutoSizeColumn_thenColumnExpands() {
|
||||||
|
|
||||||
|
int originalWidth = sheet.getColumnWidth(0);
|
||||||
|
|
||||||
|
sheet.autoSizeColumn(0);
|
||||||
|
|
||||||
|
assertThat(sheet.getColumnWidth(0)).isGreaterThan(originalWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
void cleanup() throws IOException {
|
||||||
|
workbook.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -4,7 +4,7 @@ This module contains articles about Simple Storage Service (S3) on AWS
|
|||||||
|
|
||||||
### Relevant articles
|
### Relevant articles
|
||||||
|
|
||||||
- [AWS S3 with Java](https://www.baeldung.com/aws-s3-java)
|
- [AWS S3 with Java](https://www.baeldung.com/java-aws-s3)
|
||||||
- [Multipart Uploads in Amazon S3 with Java](https://www.baeldung.com/aws-s3-multipart-upload)
|
- [Multipart Uploads in Amazon S3 with Java](https://www.baeldung.com/aws-s3-multipart-upload)
|
||||||
- [Using the JetS3t Java Client With Amazon S3](https://www.baeldung.com/jets3t-amazon-s3)
|
- [Using the JetS3t Java Client With Amazon S3](https://www.baeldung.com/jets3t-amazon-s3)
|
||||||
- [Check if a Specified Key Exists in a Given S3 Bucket Using Java](https://www.baeldung.com/java-aws-s3-check-specified-key-exists)
|
- [Check if a Specified Key Exists in a Given S3 Bucket Using Java](https://www.baeldung.com/java-aws-s3-check-specified-key-exists)
|
||||||
|
@ -0,0 +1,49 @@
|
|||||||
|
package com.baeldung.value_based_class;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import jdk.internal.ValueBased;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is written with the intention that it can serve as an example of
|
||||||
|
* what a Value-based class could be.
|
||||||
|
*/
|
||||||
|
|
||||||
|
@ValueBased
|
||||||
|
public final class Point {
|
||||||
|
private final int x;
|
||||||
|
private final int y;
|
||||||
|
private final int z;
|
||||||
|
|
||||||
|
private static Point ORIGIN = new Point(0, 0, 0);
|
||||||
|
|
||||||
|
private Point(int x, int y, int z) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.z = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Point valueOfPoint(int x, int y, int z) {
|
||||||
|
// returns a cached instance if it is origin, or a new instance
|
||||||
|
if (isOrigin(x, y, z))
|
||||||
|
return ORIGIN;
|
||||||
|
return new Point(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object other) {
|
||||||
|
if (other == null || getClass() != other.getClass())
|
||||||
|
return false;
|
||||||
|
Point point = (Point) other;
|
||||||
|
return x == point.x && y == point.y && z == point.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isOrigin(int x, int y, int z) {
|
||||||
|
return x == 0 && y == 0 && z == 0;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
package com.baeldung.value_based_class;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class ValueBasedClassUnitTest {
|
||||||
|
@Test
|
||||||
|
public void givenAutoboxedAndPrimitive_whenCompared_thenReturnEquals() {
|
||||||
|
int primitive_a = 125;
|
||||||
|
Integer obj_a = 125; // this is autoboxed
|
||||||
|
Assert.assertSame(primitive_a, obj_a);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenValueBasedPoint_whenCreated_thenReturnsObjects() {
|
||||||
|
Point p1 = Point.valueOfPoint(1, 2, 3);
|
||||||
|
Point p2 = Point.valueOfPoint(2, 3, 4);
|
||||||
|
|
||||||
|
Assert.assertNotEquals(p1, p2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenValueBasedPoint_whenCompared_thenReturnEquals() {
|
||||||
|
Point p1 = Point.valueOfPoint(1, 2, 3);
|
||||||
|
Point p2 = Point.valueOfPoint(1, 2, 3);
|
||||||
|
|
||||||
|
Assert.assertEquals(p1, p2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenValueBasedPoint_whenOrigin_thenReturnCachedInstance() {
|
||||||
|
Point p1 = Point.valueOfPoint(0, 0, 0);
|
||||||
|
Point p2 = Point.valueOfPoint(0, 0, 0);
|
||||||
|
Point p3 = Point.valueOfPoint(1, 2, 3);
|
||||||
|
|
||||||
|
// the following should not be assumed for value-based classes
|
||||||
|
|
||||||
|
Assert.assertTrue(p1 == p2);
|
||||||
|
Assert.assertFalse(p1 == p3);
|
||||||
|
}
|
||||||
|
}
|
@ -1 +1,2 @@
|
|||||||
## Relevant Articles
|
## Relevant Articles
|
||||||
|
- [Sequenced Collections in Java 21](https://www.baeldung.com/java-21-sequenced-collections)
|
||||||
|
@ -12,23 +12,22 @@
|
|||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<!-- <build>-->
|
<build>
|
||||||
<!-- <plugins>-->
|
<plugins>
|
||||||
<!-- <plugin>-->
|
<plugin>
|
||||||
<!-- <groupId>org.apache.maven.plugins</groupId>-->
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<!-- <artifactId>maven-compiler-plugin</artifactId>-->
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<!-- <configuration>-->
|
<configuration>
|
||||||
<!-- <source>{maven.compiler.source.version}</source>-->
|
<source>21</source>
|
||||||
<!-- <target>{maven.compiler.target.version}</target>-->
|
<target>21</target>
|
||||||
<!-- </configuration>-->
|
<compilerArgs>--enable-preview</compilerArgs>
|
||||||
<!-- </plugin>-->
|
</configuration>
|
||||||
<!-- </plugins>-->
|
</plugin>
|
||||||
<!-- </build>-->
|
</plugins>
|
||||||
|
</build>
|
||||||
<!-- <properties>-->
|
<properties>
|
||||||
<!-- <maven.compiler.source.version>21</maven.compiler.source.version>-->
|
<maven.compiler.source.version>21</maven.compiler.source.version>
|
||||||
<!-- <maven.compiler.target.version>21</maven.compiler.target.version>-->
|
<maven.compiler.target.version>21</maven.compiler.target.version>
|
||||||
<!-- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>-->
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<!-- </properties>-->
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
@ -0,0 +1,37 @@
|
|||||||
|
package com.baeldung.stringtemplates;
|
||||||
|
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
|
||||||
|
public class StringCompositionTechniques {
|
||||||
|
String composeUsingPlus(String feelsLike, String temperature, String unit) {
|
||||||
|
return "Today's weather is " + feelsLike + ", with a temperature of " + temperature + " degrees " + unit;
|
||||||
|
}
|
||||||
|
|
||||||
|
String composeUsingStringBuffer(String feelsLike, String temperature, String unit) {
|
||||||
|
return new StringBuffer().append("Today's weather is ")
|
||||||
|
.append(feelsLike)
|
||||||
|
.append(", with a temperature of ")
|
||||||
|
.append(temperature)
|
||||||
|
.append(" degrees ")
|
||||||
|
.append(unit)
|
||||||
|
.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
String composeUsingStringBuilder(String feelsLike, String temperature, String unit) {
|
||||||
|
return new StringBuilder().append("Today's weather is ")
|
||||||
|
.append(feelsLike)
|
||||||
|
.append(", with a temperature of ")
|
||||||
|
.append(temperature)
|
||||||
|
.append(" degrees ")
|
||||||
|
.append(unit)
|
||||||
|
.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
String composeUsingFormatters(String feelsLike, String temperature, String unit) {
|
||||||
|
return String.format("Today's weather is %s, with a temperature of %s degrees %s", feelsLike, temperature, unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
String composeUsingMessageFormatter(String feelsLike, String temperature, String unit) {
|
||||||
|
return MessageFormat.format("Today''s weather is {0}, with a temperature of {1} degrees {2}", feelsLike, temperature, unit);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
package com.baeldung.stringtemplates;
|
||||||
|
|
||||||
|
import static java.lang.StringTemplate.RAW;
|
||||||
|
import static java.util.FormatProcessor.FMT;
|
||||||
|
|
||||||
|
public class StringTemplateExamples {
|
||||||
|
String interpolationUsingSTRProcessor(String feelsLike, String temperature, String unit) {
|
||||||
|
return STR
|
||||||
|
. "Today's weather is \{ feelsLike }, with a temperature of \{ temperature } degrees \{ unit }" ;
|
||||||
|
}
|
||||||
|
|
||||||
|
String interpolationOfJSONBlock(String feelsLike, String temperature, String unit) {
|
||||||
|
return STR
|
||||||
|
. """
|
||||||
|
{
|
||||||
|
"feelsLike": "\{ feelsLike }",
|
||||||
|
"temperature": "\{ temperature }",
|
||||||
|
"unit": "\{ unit }"
|
||||||
|
}
|
||||||
|
""" ;
|
||||||
|
}
|
||||||
|
|
||||||
|
String interpolationWithExpressions() {
|
||||||
|
return STR
|
||||||
|
. "Today's weather is \{ getFeelsLike() }, with a temperature of \{ getTemperature() } degrees \{ getUnit() }" ;
|
||||||
|
}
|
||||||
|
|
||||||
|
String interpolationWithTemplates() {
|
||||||
|
StringTemplate str = RAW
|
||||||
|
. "Today's weather is \{ getFeelsLike() }, with a temperature of \{ getTemperature() } degrees \{ getUnit() }" ;
|
||||||
|
return STR.process(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
String interpolationOfJSONBlockWithFMT(String feelsLike, float temperature, String unit) {
|
||||||
|
return FMT
|
||||||
|
. """
|
||||||
|
{
|
||||||
|
"feelsLike": "%1s\{ feelsLike }",
|
||||||
|
"temperature": "%2.2f\{ temperature }",
|
||||||
|
"unit": "%1s\{ unit }"
|
||||||
|
}
|
||||||
|
""" ;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getFeelsLike() {
|
||||||
|
return "pleasant";
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getTemperature() {
|
||||||
|
return "25";
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getUnit() {
|
||||||
|
return "Celsius";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,67 @@
|
|||||||
|
package com.baeldung.stringtemplates;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class StringTemplatesUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenStringConcat_thenReturnComposedString() {
|
||||||
|
StringCompositionTechniques stringCompositionTechniques = new StringCompositionTechniques();
|
||||||
|
Assert.assertEquals("Today's weather is pleasant, with a temperature of 25 degrees Celsius", stringCompositionTechniques.composeUsingPlus("pleasant", "25", "Celsius"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenStringBuffer_thenReturnComposedString() {
|
||||||
|
StringCompositionTechniques stringCompositionTechniques = new StringCompositionTechniques();
|
||||||
|
Assert.assertEquals("Today's weather is pleasant, with a temperature of 25 degrees Celsius", stringCompositionTechniques.composeUsingStringBuffer("pleasant", "25", "Celsius"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenStringBuilder_thenReturnComposedString() {
|
||||||
|
StringCompositionTechniques stringCompositionTechniques = new StringCompositionTechniques();
|
||||||
|
Assert.assertEquals("Today's weather is pleasant, with a temperature of 25 degrees Celsius", stringCompositionTechniques.composeUsingStringBuilder("pleasant", "25", "Celsius"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenStringFormatter_thenReturnComposedFormattedString() {
|
||||||
|
StringCompositionTechniques stringCompositionTechniques = new StringCompositionTechniques();
|
||||||
|
Assert.assertEquals("Today's weather is pleasant, with a temperature of 25 degrees Celsius", stringCompositionTechniques.composeUsingFormatters("pleasant", "25", "Celsius"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenMessageFormatter_thenReturnComposedFormattedString() {
|
||||||
|
StringCompositionTechniques stringCompositionTechniques = new StringCompositionTechniques();
|
||||||
|
Assert.assertEquals("Today's weather is pleasant, with a temperature of 25 degrees Celsius", stringCompositionTechniques.composeUsingMessageFormatter("pleasant", "25", "Celsius"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUsingStringTemplateSTR_thenReturnInterpolatedString() {
|
||||||
|
StringTemplateExamples templateExamples = new StringTemplateExamples();
|
||||||
|
Assert.assertEquals("Today's weather is pleasant, with a temperature of 25 degrees Celsius", templateExamples.interpolationUsingSTRProcessor("pleasant", "25", "Celsius"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUsingMultilineStringTemplateSTR_thenReturnInterpolatedString() {
|
||||||
|
StringTemplateExamples templateExamples = new StringTemplateExamples();
|
||||||
|
Assert.assertEquals("{\n" + " \"feelsLike\": \"pleasant\",\n" + " \"temperature\": \"25\",\n" + " \"unit\": \"Celsius\"\n" + "}\n", templateExamples.interpolationOfJSONBlock("pleasant", "25", "Celsius"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUsingExpressionSTR_thenReturnInterpolatedString() {
|
||||||
|
StringTemplateExamples templateExamples = new StringTemplateExamples();
|
||||||
|
Assert.assertEquals("Today's weather is pleasant, with a temperature of 25 degrees Celsius", templateExamples.interpolationWithExpressions());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUsingExpressionRAW_thenReturnInterpolatedString() {
|
||||||
|
StringTemplateExamples templateExamples = new StringTemplateExamples();
|
||||||
|
Assert.assertEquals("Today's weather is pleasant, with a temperature of 25 degrees Celsius", templateExamples.interpolationWithTemplates());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUsingExpressionFMT_thenReturnInterpolatedString() {
|
||||||
|
StringTemplateExamples templateExamples = new StringTemplateExamples();
|
||||||
|
Assert.assertEquals("{\n" + " \"feelsLike\": \"pleasant\",\n" + " \"temperature\": \"25.86\",\n" + " \"unit\": \"Celsius\"\n" + "}\n", templateExamples.interpolationOfJSONBlockWithFMT("pleasant", 25.8636F, "Celsius"));
|
||||||
|
}
|
||||||
|
}
|
@ -5,4 +5,5 @@
|
|||||||
- [Parsing Date Strings with Varying Formats](https://www.baeldung.com/java-parsing-dates-many-formats)
|
- [Parsing Date Strings with Varying Formats](https://www.baeldung.com/java-parsing-dates-many-formats)
|
||||||
- [How Many Days Are There in a Particular Month of a Given Year?](https://www.baeldung.com/days-particular-month-given-year)
|
- [How Many Days Are There in a Particular Month of a Given Year?](https://www.baeldung.com/days-particular-month-given-year)
|
||||||
- [Difference Between Instant and LocalDateTime](https://www.baeldung.com/java-instant-vs-localdatetime)
|
- [Difference Between Instant and LocalDateTime](https://www.baeldung.com/java-instant-vs-localdatetime)
|
||||||
|
- [Add Minutes to a Time String in Java](https://www.baeldung.com/java-string-time-add-mins)
|
||||||
- [[<-- Prev]](/core-java-modules/core-java-datetime-java8-1)
|
- [[<-- Prev]](/core-java-modules/core-java-datetime-java8-1)
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
package com.baeldung.stringtime;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.time.LocalTime;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
public class AddMinuteStringTimeUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenTimeStringUsingSimpleDateFormat_whenIncrementedWith10Minutes_thenResultShouldBeCorrect() throws ParseException {
|
||||||
|
String timeString = "23:45";
|
||||||
|
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
|
||||||
|
Date date = timeFormat.parse(timeString);
|
||||||
|
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
cal.setTime(date);
|
||||||
|
cal.add(Calendar.MINUTE, 10);
|
||||||
|
String result = timeFormat.format(cal.getTime());
|
||||||
|
assertEquals("23:55", result);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenTimeStringUsingLocalTime_whenIncrementedWith10Minutes_thenResultShouldBeCorrect() {
|
||||||
|
String timeString = "23:45";
|
||||||
|
LocalTime time = LocalTime.parse(timeString);
|
||||||
|
LocalTime newTime = time.plusMinutes(10);
|
||||||
|
String result = newTime.toString();
|
||||||
|
assertEquals("23:55", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -3,9 +3,11 @@ package com.baeldung.dateapi;
|
|||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.time.LocalTime;
|
import java.time.LocalTime;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
|
|
||||||
@ -19,7 +21,7 @@ public class JavaDurationUnitTest {
|
|||||||
LocalTime finalTime = initialTime.plus(Duration.ofSeconds(30));
|
LocalTime finalTime = initialTime.plus(Duration.ofSeconds(30));
|
||||||
|
|
||||||
long seconds = Duration.between(initialTime, finalTime)
|
long seconds = Duration.between(initialTime, finalTime)
|
||||||
.getSeconds();
|
.getSeconds();
|
||||||
|
|
||||||
assertThat(seconds).isEqualTo(30);
|
assertThat(seconds).isEqualTo(30);
|
||||||
}
|
}
|
||||||
@ -34,6 +36,22 @@ public class JavaDurationUnitTest {
|
|||||||
assertThat(seconds).isEqualTo(30);
|
assertThat(seconds).isEqualTo(30);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenADuration_whenCallingisZeroAndisNegative_thenGetExpectedResult() {
|
||||||
|
LocalDateTime start = LocalDateTime.parse("2020-01-01T08:00:00");
|
||||||
|
LocalDateTime end = LocalDateTime.parse("2020-01-01T12:00:00");
|
||||||
|
assertFalse(Duration.between(start, end)
|
||||||
|
.isNegative());
|
||||||
|
assertTrue(Duration.between(end, start)
|
||||||
|
.isNegative());
|
||||||
|
|
||||||
|
LocalDateTime theTime = LocalDateTime.parse("2023-09-09T08:00:00");
|
||||||
|
assertTrue(Duration.between(theTime, theTime)
|
||||||
|
.isZero());
|
||||||
|
assertFalse(Duration.between(theTime, theTime)
|
||||||
|
.isNegative());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test2() {
|
public void test2() {
|
||||||
Instant start = Instant.parse("2017-10-03T10:15:30.00Z");
|
Instant start = Instant.parse("2017-10-03T10:15:30.00Z");
|
||||||
@ -53,17 +71,17 @@ public class JavaDurationUnitTest {
|
|||||||
assertEquals(1, fromMinutes.toHours());
|
assertEquals(1, fromMinutes.toHours());
|
||||||
|
|
||||||
assertEquals(120, duration.plusSeconds(60)
|
assertEquals(120, duration.plusSeconds(60)
|
||||||
.getSeconds());
|
.getSeconds());
|
||||||
assertEquals(30, duration.minusSeconds(30)
|
assertEquals(30, duration.minusSeconds(30)
|
||||||
.getSeconds());
|
.getSeconds());
|
||||||
|
|
||||||
assertEquals(120, duration.plus(60, ChronoUnit.SECONDS)
|
assertEquals(120, duration.plus(60, ChronoUnit.SECONDS)
|
||||||
.getSeconds());
|
.getSeconds());
|
||||||
assertEquals(30, duration.minus(30, ChronoUnit.SECONDS)
|
assertEquals(30, duration.minus(30, ChronoUnit.SECONDS)
|
||||||
.getSeconds());
|
.getSeconds());
|
||||||
|
|
||||||
Duration fromChar1 = Duration.parse("P1DT1H10M10.5S");
|
Duration fromChar1 = Duration.parse("P1DT1H10M10.5S");
|
||||||
Duration fromChar2 = Duration.parse("PT10M");
|
Duration fromChar2 = Duration.parse("PT10M");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,96 @@
|
|||||||
|
package com.baeldung.mergeandremoveduplicate;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
public class MergeArraysAndRemoveDuplicate {
|
||||||
|
|
||||||
|
public static int[] removeDuplicateOnSortedArray(int[] arr) {
|
||||||
|
// Initialize a new array to store unique elements
|
||||||
|
int[] uniqueArray = new int[arr.length];
|
||||||
|
uniqueArray[0] = arr[0];
|
||||||
|
int uniqueCount = 1;
|
||||||
|
|
||||||
|
// Iterate through the sorted array to remove duplicates
|
||||||
|
for (int i = 1; i < arr.length; i++) {
|
||||||
|
if (arr[i] != arr[i - 1]) {
|
||||||
|
uniqueArray[uniqueCount] = arr[i];
|
||||||
|
uniqueCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int[] truncatedArray = new int[uniqueCount];
|
||||||
|
System.arraycopy(uniqueArray, 0, truncatedArray, 0, uniqueCount);
|
||||||
|
return truncatedArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int[] mergeAndRemoveDuplicatesUsingStream(int[] arr1, int[] arr2) {
|
||||||
|
Stream<Integer> s1 = Arrays.stream(arr1).boxed();
|
||||||
|
Stream<Integer> s2 = Arrays.stream(arr2).boxed();
|
||||||
|
return Stream.concat(s1, s2)
|
||||||
|
.distinct()
|
||||||
|
.mapToInt(Integer::intValue)
|
||||||
|
.toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int[] mergeAndRemoveDuplicatesUsingSet(int[] arr1, int[] arr2) {
|
||||||
|
int[] mergedArr = mergeArrays(arr1, arr2);
|
||||||
|
Set<Integer> uniqueInts = new HashSet<>();
|
||||||
|
|
||||||
|
for (int el : mergedArr) {
|
||||||
|
uniqueInts.add(el);
|
||||||
|
}
|
||||||
|
|
||||||
|
return getArrayFromSet(uniqueInts);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int[] getArrayFromSet(Set<Integer> set) {
|
||||||
|
int[] mergedArrWithoutDuplicated = new int[set.size()];
|
||||||
|
int i = 0;
|
||||||
|
for (Integer el: set) {
|
||||||
|
mergedArrWithoutDuplicated[i] = el;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return mergedArrWithoutDuplicated;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int[] mergeAndRemoveDuplicates(int[] arr1, int[] arr2) {
|
||||||
|
return removeDuplicate(mergeArrays(arr1, arr2));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int[] mergeAndRemoveDuplicatesOnSortedArray(int[] arr1, int[] arr2) {
|
||||||
|
return removeDuplicateOnSortedArray(mergeArrays(arr1, arr2));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int[] mergeArrays(int[] arr1, int[] arr2) {
|
||||||
|
int[] mergedArrays = new int[arr1.length + arr2.length];
|
||||||
|
System.arraycopy(arr1, 0, mergedArrays, 0, arr1.length);
|
||||||
|
System.arraycopy(arr2, 0, mergedArrays, arr1.length, arr2.length);
|
||||||
|
|
||||||
|
return mergedArrays;
|
||||||
|
}
|
||||||
|
private static int[] removeDuplicate(int[] arr) {
|
||||||
|
int[] withoutDuplicates = new int[arr.length];
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for(int element : arr) {
|
||||||
|
if(!isElementPresent(withoutDuplicates, element)) {
|
||||||
|
withoutDuplicates[i] = element;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int[] truncatedArray = new int[i];
|
||||||
|
System.arraycopy(withoutDuplicates, 0, truncatedArray, 0, i);
|
||||||
|
return truncatedArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isElementPresent(int[] arr, int element) {
|
||||||
|
for(int el : arr) {
|
||||||
|
if(el == element) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,74 @@
|
|||||||
|
package com.baeldung.mergeandremoveduplicate;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
|
||||||
|
|
||||||
|
public class MergeArraysAndRemoveDuplicateUnitTest {
|
||||||
|
|
||||||
|
private final Logger logger = LoggerFactory.getLogger(MergeArraysAndRemoveDuplicateUnitTest.class);
|
||||||
|
|
||||||
|
private static String getCommaDelimited(int[] arr) {
|
||||||
|
return Arrays.stream(arr)
|
||||||
|
.mapToObj(Integer::toString)
|
||||||
|
.collect(Collectors.joining(", "));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenNoLibraryAndUnSortedArrays_whenArr1andArr2_thenMergeAndRemoveDuplicates() {
|
||||||
|
int[] arr1 = {3, 2, 1, 4, 5, 6, 8, 7, 9};
|
||||||
|
int[] arr2 = {8, 9, 10, 11, 12, 13, 15, 14, 15, 14, 16, 17};
|
||||||
|
int[] expectedArr = {3, 2, 1, 4, 5, 6, 8, 7, 9, 10, 11, 12, 13, 15, 14, 16, 17};
|
||||||
|
|
||||||
|
int[] mergedArr = MergeArraysAndRemoveDuplicate.mergeAndRemoveDuplicates(arr1, arr2);
|
||||||
|
|
||||||
|
//merged array maintains the order of the elements in the arrays
|
||||||
|
assertArrayEquals(expectedArr, mergedArr);
|
||||||
|
|
||||||
|
logger.info(getCommaDelimited(mergedArr));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenNoLibraryAndSortedArrays_whenArr1andArr2_thenMergeAndRemoveDuplicates() {
|
||||||
|
int[] arr1 = {1, 2, 3, 4, 5, 5, 6, 7, 7, 8};
|
||||||
|
int[] arr2 = {8, 9, 10, 11, 12, 13, 14, 15, 15, 16, 17};
|
||||||
|
int[] expectedArr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17};
|
||||||
|
|
||||||
|
int[] mergedArr = MergeArraysAndRemoveDuplicate.mergeAndRemoveDuplicatesOnSortedArray(arr1, arr2);
|
||||||
|
|
||||||
|
assertArrayEquals(expectedArr, mergedArr);
|
||||||
|
|
||||||
|
logger.info(getCommaDelimited(mergedArr));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSet_whenArr1andArr2_thenMergeAndRemoveDuplicates() {
|
||||||
|
int[] arr1 = {3, 2, 1, 4, 5, 6, 8, 7, 9};
|
||||||
|
int[] arr2 = {8, 9, 10, 11, 12, 13, 15, 14, 15, 14, 16, 17};
|
||||||
|
int[] expectedArr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17};
|
||||||
|
|
||||||
|
int[] mergedArr = MergeArraysAndRemoveDuplicate.mergeAndRemoveDuplicatesUsingSet(arr1, arr2);
|
||||||
|
|
||||||
|
assertArrayEquals(expectedArr, mergedArr);
|
||||||
|
|
||||||
|
logger.info(getCommaDelimited(mergedArr));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenStream_whenArr1andArr2_thenMergeAndRemoveDuplicates() {
|
||||||
|
int[] arr1 = {3, 2, 1, 4, 5, 6, 8, 7, 9};
|
||||||
|
int[] arr2 = {8, 9, 10, 11, 12, 13, 15, 14, 15, 14, 16, 17};
|
||||||
|
int[] expectedArr = {3, 2, 1, 4, 5, 6, 8, 7, 9, 10, 11, 12, 13, 15, 14, 16, 17};
|
||||||
|
|
||||||
|
int[] mergedArr = MergeArraysAndRemoveDuplicate.mergeAndRemoveDuplicatesUsingStream(arr1, arr2);
|
||||||
|
|
||||||
|
assertArrayEquals(expectedArr, mergedArr);
|
||||||
|
|
||||||
|
logger.info(getCommaDelimited(mergedArr));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>core-java-arrays-operations-advanced-2</artifactId>
|
||||||
|
<name>core-java-arrays-operations-advanced-2</name>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<artifactId>core-java-modules</artifactId>
|
||||||
|
<groupId>com.baeldung.core-java-modules</groupId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
<version>${commons-lang3.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-assembly-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<descriptorRefs>
|
||||||
|
<descriptorRef>jar-with-dependencies</descriptorRef>
|
||||||
|
</descriptorRefs>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>make-assembly</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>single</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
@ -62,4 +62,4 @@ public class MiddleOfArray {
|
|||||||
return array[mid];
|
return array[mid];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -86,4 +86,4 @@ public class MiddleOfArrayUnitTest {
|
|||||||
MiddleOfArray middleOfArray = new MiddleOfArray();
|
MiddleOfArray middleOfArray = new MiddleOfArray();
|
||||||
Assert.assertEquals(expectMedian, middleOfArray.medianOfArray(array, 0, 100));
|
Assert.assertEquals(expectMedian, middleOfArray.medianOfArray(array, 0, 100));
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package com.baeldung.collectionsvsarrays;
|
||||||
|
|
||||||
|
import com.baeldung.collectionsvsarrays.sorting.Quicksort;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class NonStableSortExample {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
List<Task> tasks = Tasks.supplier.get();
|
||||||
|
Quicksort.sort(tasks, Comparator.comparingInt(Task::getPriority));
|
||||||
|
System.out.println("After sorting by priority:");
|
||||||
|
for (Task task : tasks) {
|
||||||
|
System.out.println(task);
|
||||||
|
}
|
||||||
|
Quicksort.sort(tasks, Comparator.comparing(Task::getDueDate));
|
||||||
|
System.out.println("\nAfter sorting by due date:");
|
||||||
|
for (Task task : tasks) {
|
||||||
|
System.out.println(task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
package com.baeldung.collectionsvsarrays;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import org.openjdk.jmh.annotations.Benchmark;
|
||||||
|
import org.openjdk.jmh.annotations.BenchmarkMode;
|
||||||
|
import org.openjdk.jmh.annotations.Fork;
|
||||||
|
import org.openjdk.jmh.annotations.Measurement;
|
||||||
|
import org.openjdk.jmh.annotations.Mode;
|
||||||
|
import org.openjdk.jmh.annotations.Scope;
|
||||||
|
import org.openjdk.jmh.annotations.State;
|
||||||
|
import org.openjdk.jmh.annotations.Warmup;
|
||||||
|
import org.openjdk.jmh.infra.Blackhole;
|
||||||
|
|
||||||
|
@Measurement(iterations = 2, time = 10, timeUnit = TimeUnit.MINUTES)
|
||||||
|
@Warmup(iterations = 5, time = 10)
|
||||||
|
@Fork(value = 2)
|
||||||
|
public class ObjectOverheadBenchmark {
|
||||||
|
|
||||||
|
private static final ThreadLocalRandom RANDOM = ThreadLocalRandom.current();
|
||||||
|
|
||||||
|
@State(Scope.Benchmark)
|
||||||
|
public static class Input {
|
||||||
|
public Supplier<List<Integer>> randomNumbers = () -> RANDOM.ints().limit(10000).boxed().collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
@BenchmarkMode(Mode.Throughput)
|
||||||
|
public void sortingPrimitiveArray(Input input, Blackhole blackhole) {
|
||||||
|
final int[] array = input.randomNumbers.get().stream().mapToInt(Integer::intValue).toArray();
|
||||||
|
Arrays.sort(array);
|
||||||
|
final List<Integer> result = Arrays.stream(array).boxed().collect(Collectors.toList());
|
||||||
|
blackhole.consume(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
@BenchmarkMode(Mode.Throughput)
|
||||||
|
public void sortingObjectArray(Input input, Blackhole blackhole) {
|
||||||
|
final Integer[] array = input.randomNumbers.get().toArray(new Integer[0]);
|
||||||
|
Arrays.sort(array);
|
||||||
|
blackhole.consume(array);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
@BenchmarkMode(Mode.Throughput)
|
||||||
|
public void sortingObjects(Input input, Blackhole blackhole) {
|
||||||
|
final List<Integer> list = input.randomNumbers.get();
|
||||||
|
Collections.sort(list);
|
||||||
|
blackhole.consume(list);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
package com.baeldung.collectionsvsarrays;
|
||||||
|
|
||||||
|
import com.baeldung.collectionsvsarrays.sorting.MergeSort;
|
||||||
|
import com.baeldung.collectionsvsarrays.sorting.Quicksort;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
import org.openjdk.jmh.annotations.Benchmark;
|
||||||
|
import org.openjdk.jmh.annotations.BenchmarkMode;
|
||||||
|
import org.openjdk.jmh.annotations.Fork;
|
||||||
|
import org.openjdk.jmh.annotations.Measurement;
|
||||||
|
import org.openjdk.jmh.annotations.Mode;
|
||||||
|
import org.openjdk.jmh.annotations.Warmup;
|
||||||
|
|
||||||
|
@Measurement(iterations = 2, time = 10, timeUnit = TimeUnit.MINUTES)
|
||||||
|
@Warmup(iterations = 5, time = 10)
|
||||||
|
public class PerformanceBenchmark {
|
||||||
|
|
||||||
|
private static final Random RANDOM = new Random();
|
||||||
|
private static final int ARRAY_SIZE = 10000;
|
||||||
|
private static final int[] randomNumbers = RANDOM.ints(ARRAY_SIZE).toArray();
|
||||||
|
private static final int[] sameNumbers = IntStream.generate(() -> 42).limit(ARRAY_SIZE).toArray();
|
||||||
|
public static final Supplier<int[]> randomNumbersSupplier = randomNumbers::clone;
|
||||||
|
public static final Supplier<int[]> sameNumbersSupplier = sameNumbers::clone;
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
@BenchmarkMode(Mode.Throughput)
|
||||||
|
@Fork(value = 1, jvmArgs = {"-Xlog:gc:file=gc-logs-quick-sort-same-number-%t.txt,filesize=900m -Xmx6gb -Xms6gb"})
|
||||||
|
public void quickSortSameNumber() {
|
||||||
|
Quicksort.sort(sameNumbersSupplier.get());
|
||||||
|
}
|
||||||
|
@Benchmark
|
||||||
|
@BenchmarkMode(Mode.Throughput)
|
||||||
|
@Fork(value = 1, jvmArgs = {"-Xlog:gc:file=gc-logs-quick-sort-random-number-%t.txt,filesize=900m -Xmx6gb -Xms6gb"})
|
||||||
|
public void quickSortRandomNumber() {
|
||||||
|
Quicksort.sort(randomNumbersSupplier.get());
|
||||||
|
}
|
||||||
|
@Benchmark
|
||||||
|
@BenchmarkMode(Mode.Throughput)
|
||||||
|
@Fork(value = 1, jvmArgs = {"-Xlog:gc:file=gc-logs-merge-sort-same-number-%t.txt,filesize=900m -Xmx6gb -Xms6gb"})
|
||||||
|
public void mergeSortSameNumber() {
|
||||||
|
MergeSort.sort(sameNumbersSupplier.get());
|
||||||
|
}
|
||||||
|
@Benchmark
|
||||||
|
@BenchmarkMode(Mode.Throughput)
|
||||||
|
@Fork(value = 1, jvmArgs = {"-Xlog:gc:file=gc-logs-merge-sort-random-number-%t.txt,filesize=900m -Xmx6gb -Xms6gb"})
|
||||||
|
public void mergeSortRandomNumber() {
|
||||||
|
MergeSort.sort(randomNumbersSupplier.get());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
package com.baeldung.collectionsvsarrays;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class StableSortExample {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
final List<Task> tasks = Tasks.supplier.get();
|
||||||
|
Collections.sort(tasks, Comparator.comparingInt(Task::getPriority));
|
||||||
|
System.out.println("After sorting by priority:");
|
||||||
|
for (Task task : tasks) {
|
||||||
|
System.out.println(task);
|
||||||
|
}
|
||||||
|
Collections.sort(tasks, Comparator.comparing(Task::getDueDate));
|
||||||
|
System.out.println("\nAfter sorting by due date:");
|
||||||
|
for (Task task : tasks) {
|
||||||
|
System.out.println(task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package com.baeldung.collectionsvsarrays;
|
||||||
|
|
||||||
|
public class Task {
|
||||||
|
private final long id;
|
||||||
|
private final int priority;
|
||||||
|
private final String dueDate;
|
||||||
|
|
||||||
|
public Task(final long id, int priority, String dueDate) {
|
||||||
|
this.id = id;
|
||||||
|
this.priority = priority;
|
||||||
|
this.dueDate = dueDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format("Task: #%-2d | Priority: %d | Due Date: %s", getId(), getPriority(), getDueDate());
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPriority() {
|
||||||
|
return priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDueDate() {
|
||||||
|
return dueDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
private long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package com.baeldung.collectionsvsarrays;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public class Tasks {
|
||||||
|
|
||||||
|
private static final List<Task> tasks;
|
||||||
|
public static final Supplier<List<Task>> supplier;
|
||||||
|
|
||||||
|
static {
|
||||||
|
tasks = new ArrayList<>();
|
||||||
|
tasks.add(new Task(1, 1, "2023-09-01"));
|
||||||
|
tasks.add(new Task(2, 2, "2023-08-30"));
|
||||||
|
tasks.add(new Task(3, 1, "2023-08-29"));
|
||||||
|
tasks.add(new Task(4, 2, "2023-09-02"));
|
||||||
|
tasks.add(new Task(5, 3, "2023-09-05"));
|
||||||
|
tasks.add(new Task(6, 1, "2023-09-03"));
|
||||||
|
tasks.add(new Task(7, 3, "2023-08-28"));
|
||||||
|
tasks.add(new Task(8, 2, "2023-09-01"));
|
||||||
|
tasks.add(new Task(9, 1, "2023-08-28"));
|
||||||
|
tasks.add(new Task(10, 2, "2023-09-04"));
|
||||||
|
tasks.add(new Task(11, 3, "2023-08-31"));
|
||||||
|
tasks.add(new Task(12, 1, "2023-08-30"));
|
||||||
|
tasks.add(new Task(13, 3, "2023-09-02"));
|
||||||
|
|
||||||
|
supplier = () -> new ArrayList<>(tasks);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
package com.baeldung.collectionsvsarrays.sorting;
|
||||||
|
|
||||||
|
public class MergeSort {
|
||||||
|
|
||||||
|
public static void sort(int[] a) {
|
||||||
|
sort(a, a.length);
|
||||||
|
}
|
||||||
|
public static void sort(int[] a, int n) {
|
||||||
|
if (n < 2) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int mid = n / 2;
|
||||||
|
int[] l = new int[mid];
|
||||||
|
int[] r = new int[n - mid];
|
||||||
|
|
||||||
|
for (int i = 0; i < mid; i++) {
|
||||||
|
l[i] = a[i];
|
||||||
|
}
|
||||||
|
for (int i = mid; i < n; i++) {
|
||||||
|
r[i - mid] = a[i];
|
||||||
|
}
|
||||||
|
sort(l, mid);
|
||||||
|
sort(r, n - mid);
|
||||||
|
|
||||||
|
merge(a, l, r, mid, n - mid);
|
||||||
|
}
|
||||||
|
private static void merge(
|
||||||
|
int[] a, int[] l, int[] r, int left, int right) {
|
||||||
|
|
||||||
|
int i = 0, j = 0, k = 0;
|
||||||
|
while (i < left && j < right) {
|
||||||
|
if (l[i] <= r[j]) {
|
||||||
|
a[k++] = l[i++];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
a[k++] = r[j++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (i < left) {
|
||||||
|
a[k++] = l[i++];
|
||||||
|
}
|
||||||
|
while (j < right) {
|
||||||
|
a[k++] = r[j++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,72 @@
|
|||||||
|
package com.baeldung.collectionsvsarrays.sorting;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Quicksort {
|
||||||
|
|
||||||
|
public static void sort(int arr[]) {
|
||||||
|
sort(arr, 0, arr.length - 1);
|
||||||
|
}
|
||||||
|
public static void sort(int arr[], int begin, int end) {
|
||||||
|
if (begin < end) {
|
||||||
|
int partitionIndex = partition(arr, begin, end);
|
||||||
|
|
||||||
|
sort(arr, begin, partitionIndex-1);
|
||||||
|
sort(arr, partitionIndex+1, end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private static int partition(int arr[], int begin, int end) {
|
||||||
|
int pivot = arr[end];
|
||||||
|
int i = (begin-1);
|
||||||
|
|
||||||
|
for (int j = begin; j < end; j++) {
|
||||||
|
if (arr[j] <= pivot) {
|
||||||
|
i++;
|
||||||
|
|
||||||
|
int swapTemp = arr[i];
|
||||||
|
arr[i] = arr[j];
|
||||||
|
arr[j] = swapTemp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int swapTemp = arr[i+1];
|
||||||
|
arr[i+1] = arr[end];
|
||||||
|
arr[end] = swapTemp;
|
||||||
|
|
||||||
|
return i+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> void sort(List<T> list, Comparator<T> comparator) {
|
||||||
|
sort(list, 0, list.size() - 1, comparator);
|
||||||
|
}
|
||||||
|
public static <T> void sort(List<T> list, int low, int high, Comparator<T> comparator) {
|
||||||
|
if (low < high) {
|
||||||
|
int partitionIndex = partition(list, low, high, comparator);
|
||||||
|
|
||||||
|
sort(list, low, partitionIndex - 1, comparator);
|
||||||
|
sort(list, partitionIndex + 1, high, comparator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <T> int partition(List<T> list, int begin, int end, Comparator<T> comparator) {
|
||||||
|
T pivot = list.get(end);
|
||||||
|
int i = (begin-1);
|
||||||
|
|
||||||
|
for (int j = begin; j < end; j++) {
|
||||||
|
if (comparator.compare(list.get(j), pivot) <= 0) {
|
||||||
|
i++;
|
||||||
|
|
||||||
|
T swapTemp = list.get(i);
|
||||||
|
list.set(i, list.get(j));
|
||||||
|
list.set(j, swapTemp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
T swapTemp = list.get(i+1);
|
||||||
|
list.set(i+1,list.get(end));
|
||||||
|
list.set(end, swapTemp);
|
||||||
|
|
||||||
|
return i+1;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
## Java Collections Cookbooks and Examples
|
||||||
|
|
||||||
|
This module contains articles about conversions among Collection types in Java.
|
||||||
|
|
||||||
|
### Relevant Articles:
|
@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>core-java-collections-conversions-3</artifactId>
|
||||||
|
<name>core-java-collections-conversions-3</name>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung.core-java-modules</groupId>
|
||||||
|
<artifactId>core-java-modules</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<finalName>core-java-collections-conversions-3</finalName>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/resources</directory>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,66 @@
|
|||||||
|
package com.baeldung.hashmaptoarraylist;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
import com.google.common.collect.Maps.EntryTransformer;
|
||||||
|
|
||||||
|
public class HashMapToArrayListConverterUtils {
|
||||||
|
|
||||||
|
static ArrayList<String> convertUsingConstructor(HashMap<Integer, String> hashMap) {
|
||||||
|
if (hashMap == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new ArrayList<String>(hashMap.values());
|
||||||
|
}
|
||||||
|
|
||||||
|
static ArrayList<String> convertUsingAddAllMethod(HashMap<Integer, String> hashMap) {
|
||||||
|
if (hashMap == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayList<String> arrayList = new ArrayList<String>(hashMap.size());
|
||||||
|
arrayList.addAll(hashMap.values());
|
||||||
|
|
||||||
|
return arrayList;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ArrayList<String> convertUsingStreamApi(HashMap<Integer, String> hashMap) {
|
||||||
|
if (hashMap == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return hashMap.values()
|
||||||
|
.stream()
|
||||||
|
.collect(Collectors.toCollection(ArrayList::new));
|
||||||
|
}
|
||||||
|
|
||||||
|
static ArrayList<String> convertUsingForLoop(HashMap<Integer, String> hashMap) {
|
||||||
|
if (hashMap == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayList<String> arrayList = new ArrayList<String>(hashMap.size());
|
||||||
|
for (Map.Entry<Integer, String> entry : hashMap.entrySet()) {
|
||||||
|
arrayList.add(entry.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
return arrayList;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public ArrayList<String> convertUsingGuava(HashMap<Integer, String> hashMap) {
|
||||||
|
if (hashMap == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
EntryTransformer<Integer, String, String> entryMapTransformer = (key, value) -> value;
|
||||||
|
|
||||||
|
return Lists.newArrayList(Maps.transformEntries(hashMap, entryMapTransformer)
|
||||||
|
.values());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
package com.baeldung.hashmaptoarraylist;
|
||||||
|
|
||||||
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
|
import static org.hamcrest.Matchers.containsInAnyOrder;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class HashMapToArrayListConverterUtilsUnitTest {
|
||||||
|
|
||||||
|
private HashMap<Integer, String> hashMap;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void beforeEach() {
|
||||||
|
hashMap = new HashMap<>();
|
||||||
|
hashMap.put(1, "AAA");
|
||||||
|
hashMap.put(2, "BBB");
|
||||||
|
hashMap.put(3, "CCC");
|
||||||
|
hashMap.put(4, "DDD");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAHashMap_whenConvertUsingConstructor_thenReturnArrayList() {
|
||||||
|
ArrayList<String> myList = HashMapToArrayListConverterUtils.convertUsingConstructor(hashMap);
|
||||||
|
|
||||||
|
assertThat(hashMap.values(), containsInAnyOrder(myList.toArray()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAHashMap_whenConvertUsingAddAllMethod_thenReturnArrayList() {
|
||||||
|
ArrayList<String> myList = HashMapToArrayListConverterUtils.convertUsingAddAllMethod(hashMap);
|
||||||
|
|
||||||
|
assertThat(hashMap.values(), containsInAnyOrder(myList.toArray()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAHashMap_whenConvertUsingForLoop_thenReturnArrayList() {
|
||||||
|
ArrayList<String> myList = HashMapToArrayListConverterUtils.convertUsingForLoop(hashMap);
|
||||||
|
|
||||||
|
assertThat(hashMap.values(), containsInAnyOrder(myList.toArray()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAHashMap_whenConvertUsingStreamApi_thenReturnArrayList() {
|
||||||
|
ArrayList<String> myList = HashMapToArrayListConverterUtils.convertUsingStreamApi(hashMap);
|
||||||
|
|
||||||
|
assertThat(hashMap.values(), containsInAnyOrder(myList.toArray()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAHashMap_whenConvertUsingGuava_thenReturnArrayList() {
|
||||||
|
ArrayList<String> myList = HashMapToArrayListConverterUtils.convertUsingGuava(hashMap);
|
||||||
|
|
||||||
|
assertThat(hashMap.values(), containsInAnyOrder(myList.toArray()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -53,7 +53,7 @@ public class IdentityHashMapDemonstrator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class Book {
|
static class Book {
|
||||||
String title;
|
String title;
|
||||||
int year;
|
int year;
|
||||||
|
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
package com.baeldung.map.identity;
|
package com.baeldung.map.identity;
|
||||||
|
|
||||||
|
import com.baeldung.map.identity.IdentityHashMapDemonstrator.Book;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import java.util.IdentityHashMap;
|
import java.util.IdentityHashMap;
|
||||||
|
import org.junit.jupiter.api.condition.EnabledForJreRange;
|
||||||
|
import org.junit.jupiter.api.condition.JRE;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
@ -18,4 +21,44 @@ public class IdentityHashMapDemonstratorUnitTest {
|
|||||||
assertEquals("Fantasy", identityHashMap.get("genre"));
|
assertEquals("Fantasy", identityHashMap.get("genre"));
|
||||||
assertEquals("Drama", identityHashMap.get(newGenreKey));
|
assertEquals("Drama", identityHashMap.get(newGenreKey));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@EnabledForJreRange(max = JRE.JAVA_19)
|
||||||
|
public void removeEntryComparingValueByEquality() {
|
||||||
|
Book book = new Book("A Passage to India", 1924);
|
||||||
|
IdentityHashMap<Book, String> identityHashMap = new IdentityHashMap<>(10);
|
||||||
|
identityHashMap.put(book, "A great work of fiction");
|
||||||
|
identityHashMap.remove(book, new String("A great work of fiction"));
|
||||||
|
assertEquals(null, identityHashMap.get(book));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@EnabledForJreRange(max = JRE.JAVA_19)
|
||||||
|
public void replaceEntryComparingValueByEquality() {
|
||||||
|
Book book = new Book("A Passage to India", 1924);
|
||||||
|
IdentityHashMap<Book, String> identityHashMap = new IdentityHashMap<>(10);
|
||||||
|
identityHashMap.put(book, "A great work of fiction");
|
||||||
|
identityHashMap.replace(book, new String("A great work of fiction"), "One of the greatest books");
|
||||||
|
assertEquals("One of the greatest books", identityHashMap.get(book));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@EnabledForJreRange(min = JRE.JAVA_20)
|
||||||
|
public void dontRemoveEntryComparingValueByEquality() {
|
||||||
|
Book book = new Book("A Passage to India", 1924);
|
||||||
|
IdentityHashMap<Book, String> identityHashMap = new IdentityHashMap<>(10);
|
||||||
|
identityHashMap.put(book, "A great work of fiction");
|
||||||
|
identityHashMap.remove(book, new String("A great work of fiction"));
|
||||||
|
assertEquals("A great work of fiction", identityHashMap.get(book));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@EnabledForJreRange(min = JRE.JAVA_20)
|
||||||
|
public void dontReplaceEntryComparingValueByEquality() {
|
||||||
|
Book book = new Book("A Passage to India", 1924);
|
||||||
|
IdentityHashMap<Book, String> identityHashMap = new IdentityHashMap<>(10);
|
||||||
|
identityHashMap.put(book, "A great work of fiction");
|
||||||
|
identityHashMap.replace(book, new String("A great work of fiction"), "One of the greatest books");
|
||||||
|
assertEquals("A great work of fiction", identityHashMap.get(book));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,4 +5,5 @@
|
|||||||
- [Sorting a HashSet in Java](https://www.baeldung.com/java-sort-hashset)
|
- [Sorting a HashSet in Java](https://www.baeldung.com/java-sort-hashset)
|
||||||
- [How to Get First Item From a Java Set](https://www.baeldung.com/first-item-set)
|
- [How to Get First Item From a Java Set](https://www.baeldung.com/first-item-set)
|
||||||
- [Cartesian Product of Any Number of Sets in Java](https://www.baeldung.com/java-cartesian-product-sets)
|
- [Cartesian Product of Any Number of Sets in Java](https://www.baeldung.com/java-cartesian-product-sets)
|
||||||
|
- [How to Get Index of an Item in Java Set](https://www.baeldung.com/java-set-element-find-index)
|
||||||
- More articles: [[<-- prev]](/core-java-modules/core-java-collections-set)
|
- More articles: [[<-- prev]](/core-java-modules/core-java-collections-set)
|
||||||
|
@ -5,4 +5,5 @@
|
|||||||
- [Java Concurrent HashSet Equivalent to ConcurrentHashMap](https://www.baeldung.com/java-concurrent-hashset-concurrenthashmap)
|
- [Java Concurrent HashSet Equivalent to ConcurrentHashMap](https://www.baeldung.com/java-concurrent-hashset-concurrenthashmap)
|
||||||
- [Reading and Writing With a ConcurrentHashMap](https://www.baeldung.com/concurrenthashmap-reading-and-writing)
|
- [Reading and Writing With a ConcurrentHashMap](https://www.baeldung.com/concurrenthashmap-reading-and-writing)
|
||||||
- [ArrayBlockingQueue vs. LinkedBlockingQueue](https://www.baeldung.com/java-arrayblockingqueue-vs-linkedblockingqueue)
|
- [ArrayBlockingQueue vs. LinkedBlockingQueue](https://www.baeldung.com/java-arrayblockingqueue-vs-linkedblockingqueue)
|
||||||
|
- [Difference Between Hashtable and ConcurrentHashMap in Java](https://www.baeldung.com/java-hashtable-vs-concurrenthashmap)
|
||||||
- [[<-- Prev]](/core-java-modules/core-java-concurrency-collections)
|
- [[<-- Prev]](/core-java-modules/core-java-concurrency-collections)
|
||||||
|
@ -96,7 +96,8 @@ public class DateTimeFormatterUnitTest {
|
|||||||
String newYorkDateTimePattern = "dd.MM.yyyy HH:mm z";
|
String newYorkDateTimePattern = "dd.MM.yyyy HH:mm z";
|
||||||
DateTimeFormatter newYorkDateFormatter = DateTimeFormatter.ofPattern(newYorkDateTimePattern);
|
DateTimeFormatter newYorkDateFormatter = DateTimeFormatter.ofPattern(newYorkDateTimePattern);
|
||||||
LocalDateTime summerDay = LocalDateTime.of(2016, 7, 31, 14, 15);
|
LocalDateTime summerDay = LocalDateTime.of(2016, 7, 31, 14, 15);
|
||||||
Assert.assertEquals("31.07.2016 14:15 EDT", newYorkDateFormatter.format(ZonedDateTime.of(summerDay, ZoneId.of("America/New_York"))));
|
Assert.assertEquals("31.07.2016 14:15 EDT",
|
||||||
|
newYorkDateFormatter.format(ZonedDateTime.of(summerDay, ZoneId.of("America/New_York"))));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -121,8 +122,10 @@ public class DateTimeFormatterUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
public void shouldPrintFormattedDateTimeWithPredefined() {
|
public void shouldPrintFormattedDateTimeWithPredefined() {
|
||||||
Assert.assertEquals("2018-03-09", DateTimeFormatter.ISO_LOCAL_DATE.format(LocalDate.of(2018, 3, 9)));
|
Assert.assertEquals("2018-03-09", DateTimeFormatter.ISO_LOCAL_DATE.format(LocalDate.of(2018, 3, 9)));
|
||||||
Assert.assertEquals("2018-03-09-03:00", DateTimeFormatter.ISO_OFFSET_DATE.format(LocalDate.of(2018, 3, 9).atStartOfDay(ZoneId.of("UTC-3"))));
|
Assert.assertEquals("2018-03-09-03:00",
|
||||||
Assert.assertEquals("Fri, 9 Mar 2018 00:00:00 -0300", DateTimeFormatter.RFC_1123_DATE_TIME.format(LocalDate.of(2018, 3, 9).atStartOfDay(ZoneId.of("UTC-3"))));
|
DateTimeFormatter.ISO_OFFSET_DATE.format(LocalDate.of(2018, 3, 9).atStartOfDay(ZoneId.of("UTC-3"))));
|
||||||
|
Assert.assertEquals("Fri, 9 Mar 2018 00:00:00 -0300",
|
||||||
|
DateTimeFormatter.RFC_1123_DATE_TIME.format(LocalDate.of(2018, 3, 9).atStartOfDay(ZoneId.of("UTC-3"))));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -165,30 +168,62 @@ public class DateTimeFormatterUnitTest {
|
|||||||
public void shouldPrintFormattedZonedDateTime() {
|
public void shouldPrintFormattedZonedDateTime() {
|
||||||
ZonedDateTime zonedDateTime = ZonedDateTime.of(2021, 02, 15, 0, 0, 0, 0, ZoneId.of("Europe/Paris"));
|
ZonedDateTime zonedDateTime = ZonedDateTime.of(2021, 02, 15, 0, 0, 0, 0, ZoneId.of("Europe/Paris"));
|
||||||
String formattedZonedDateTime = DateTimeFormatter.ISO_INSTANT.format(zonedDateTime);
|
String formattedZonedDateTime = DateTimeFormatter.ISO_INSTANT.format(zonedDateTime);
|
||||||
|
|
||||||
Assert.assertEquals("2021-02-14T23:00:00Z", formattedZonedDateTime);
|
Assert.assertEquals("2021-02-14T23:00:00Z", formattedZonedDateTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = UnsupportedTemporalTypeException.class)
|
@Test(expected = UnsupportedTemporalTypeException.class)
|
||||||
public void shouldExpectAnExceptionIfInputIsLocalDateTime() {
|
public void shouldExpectAnExceptionIfInputIsLocalDateTime() {
|
||||||
DateTimeFormatter.ISO_INSTANT.format(LocalDate.now());
|
DateTimeFormatter.ISO_INSTANT.format(LocalDate.now());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldParseZonedDateTime() {
|
public void shouldParseZonedDateTime() {
|
||||||
DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT.withZone(ZoneId.systemDefault());
|
DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT.withZone(ZoneId.systemDefault());
|
||||||
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2021-10-01T05:06:20Z", formatter);
|
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2021-10-01T05:06:20Z", formatter);
|
||||||
|
|
||||||
Assert.assertEquals("2021-10-01T05:06:20Z", DateTimeFormatter.ISO_INSTANT.format(zonedDateTime));
|
Assert.assertEquals("2021-10-01T05:06:20Z", DateTimeFormatter.ISO_INSTANT.format(zonedDateTime));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = DateTimeParseException.class)
|
@Test(expected = DateTimeParseException.class)
|
||||||
public void shouldExpectAnExceptionIfTimeZoneIsMissing() {
|
public void shouldExpectAnExceptionIfTimeZoneIsMissing() {
|
||||||
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2021-11-01T05:06:20Z", DateTimeFormatter.ISO_INSTANT);
|
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2021-11-01T05:06:20Z", DateTimeFormatter.ISO_INSTANT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = DateTimeParseException.class)
|
@Test(expected = DateTimeParseException.class)
|
||||||
public void shouldExpectAnExceptionIfSecondIsMissing() {
|
public void shouldExpectAnExceptionIfSecondIsMissing() {
|
||||||
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2021-12-02T08:06Z", DateTimeFormatter.ISO_INSTANT);
|
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2021-12-02T08:06Z", DateTimeFormatter.ISO_INSTANT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUSShortFormatting() {
|
||||||
|
LocalDate date = LocalDate.of(2023, 9, 18);
|
||||||
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yy: EEE").withLocale(Locale.US);
|
||||||
|
String formattedDate = date.format(formatter);
|
||||||
|
Assert.assertEquals("Sep 18, 23: Mon", formattedDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUSFullFormatting() {
|
||||||
|
LocalDate date = LocalDate.of(2023, 9, 18);
|
||||||
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM dd, yyyy: EEEE").withLocale(Locale.US);
|
||||||
|
String formattedDate = date.format(formatter);
|
||||||
|
Assert.assertEquals("September 18, 2023: Monday", formattedDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testKoreanShortFormatting() {
|
||||||
|
LocalDate date = LocalDate.of(2023, 9, 18);
|
||||||
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yy: EEE").withLocale(Locale.KOREA);
|
||||||
|
String formattedDate = date.format(formatter);
|
||||||
|
Assert.assertEquals("9월 18, 23: 월", formattedDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testKoreanFullFormatting() {
|
||||||
|
LocalDate date = LocalDate.of(2023, 9, 18);
|
||||||
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM dd, yyyy: EEEE").withLocale(Locale.KOREA);
|
||||||
|
String formattedDate = date.format(formatter);
|
||||||
|
Assert.assertEquals("9월 18, 2023: 월요일", formattedDate);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,60 @@
|
|||||||
|
package com.baeldung.eofdetections;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.channels.FileChannel;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class EOFDetection {
|
||||||
|
|
||||||
|
public String readWithFileInputStream(String pathFile) throws IOException {
|
||||||
|
try (FileInputStream fis = new FileInputStream(pathFile);
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
|
||||||
|
int data;
|
||||||
|
while ((data = fis.read()) != -1) {
|
||||||
|
baos.write(data);
|
||||||
|
}
|
||||||
|
return baos.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String readWithBufferedReader(String pathFile) throws IOException {
|
||||||
|
try (FileInputStream fis = new FileInputStream(pathFile);
|
||||||
|
InputStreamReader isr = new InputStreamReader(fis);
|
||||||
|
BufferedReader reader = new BufferedReader(isr)) {
|
||||||
|
StringBuilder actualContent = new StringBuilder();
|
||||||
|
String line;
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
actualContent.append(line);
|
||||||
|
}
|
||||||
|
return actualContent.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String readWithScanner(String pathFile) throws IOException {
|
||||||
|
File file = new File(pathFile);
|
||||||
|
Scanner scanner = new Scanner(file);
|
||||||
|
StringBuilder actualContent = new StringBuilder();
|
||||||
|
while (scanner.hasNext()) {
|
||||||
|
String line = scanner.nextLine();
|
||||||
|
actualContent.append(line);
|
||||||
|
}
|
||||||
|
scanner.close();
|
||||||
|
return actualContent.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String readFileWithFileChannelAndByteBuffer(String pathFile) throws IOException {
|
||||||
|
try (FileInputStream fis = new FileInputStream(pathFile);
|
||||||
|
FileChannel channel = fis.getChannel()) {
|
||||||
|
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate((int) channel.size());
|
||||||
|
while (channel.read(buffer) != -1) {
|
||||||
|
buffer.flip();
|
||||||
|
buffer.clear();
|
||||||
|
}
|
||||||
|
return StandardCharsets.UTF_8.decode(buffer).toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,80 @@
|
|||||||
|
package com.baeldung.eofdetections;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.MethodOrderer;
|
||||||
|
import org.junit.jupiter.api.Order;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.TestMethodOrder;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
|
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
||||||
|
public class EOFDetectionUnitTest {
|
||||||
|
|
||||||
|
static final String LOREM_IPSUM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum";
|
||||||
|
String pathToFile = "sample.txt"; // init sample file path
|
||||||
|
EOFDetection eofDetection = new EOFDetection();
|
||||||
|
@Test
|
||||||
|
@Order(1)
|
||||||
|
public void givenDummyText_whenReadWithFileInputStream_returnText() {
|
||||||
|
try {
|
||||||
|
String actualText = eofDetection.readWithFileInputStream(pathToFile);
|
||||||
|
assertEquals(LOREM_IPSUM, actualText);
|
||||||
|
} catch (IOException e) {
|
||||||
|
fail(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(2)
|
||||||
|
public void givenDummyText_whenReadFileWithBufferedReader_returnText() {
|
||||||
|
try {
|
||||||
|
String actualText = eofDetection.readWithBufferedReader(pathToFile);
|
||||||
|
assertEquals(LOREM_IPSUM, actualText);
|
||||||
|
} catch (IOException e) {
|
||||||
|
fail(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(3)
|
||||||
|
public void givenDummyText_whenReadFileWithScanner_returnText() {
|
||||||
|
try {
|
||||||
|
String actualText = eofDetection.readWithScanner(pathToFile);
|
||||||
|
assertEquals(LOREM_IPSUM, actualText);
|
||||||
|
} catch (IOException e) {
|
||||||
|
fail(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(4)
|
||||||
|
public void givenDummyText_whenReadFileWithFileChannelAndByteBuffer_returnText() {
|
||||||
|
try {
|
||||||
|
String actualText = eofDetection.readFileWithFileChannelAndByteBuffer(pathToFile);
|
||||||
|
assertEquals(LOREM_IPSUM, actualText);
|
||||||
|
} catch (IOException e) {
|
||||||
|
fail(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Test
|
||||||
|
@Order(0)
|
||||||
|
public void prepareFileForTest() {
|
||||||
|
File file = new File(pathToFile);
|
||||||
|
|
||||||
|
if (!file.exists()) {
|
||||||
|
try {
|
||||||
|
file.createNewFile();
|
||||||
|
FileWriter writer = new FileWriter(file);
|
||||||
|
writer.write(LOREM_IPSUM);
|
||||||
|
writer.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -12,4 +12,5 @@ This module contains articles about core Java input and output (IO)
|
|||||||
- [Getting a File’s Mime Type in Java](https://www.baeldung.com/java-file-mime-type)
|
- [Getting a File’s Mime Type in Java](https://www.baeldung.com/java-file-mime-type)
|
||||||
- [How to Avoid the Java FileNotFoundException When Loading Resources](https://www.baeldung.com/java-classpath-resource-cannot-be-opened)
|
- [How to Avoid the Java FileNotFoundException When Loading Resources](https://www.baeldung.com/java-classpath-resource-cannot-be-opened)
|
||||||
- [Java – Rename or Move a File](https://www.baeldung.com/java-how-to-rename-or-move-a-file)
|
- [Java – Rename or Move a File](https://www.baeldung.com/java-how-to-rename-or-move-a-file)
|
||||||
|
- [Closing Java IO Streams](https://www.baeldung.com/java-io-streams-closing)
|
||||||
- [[More -->]](/core-java-modules/core-java-io-2)
|
- [[More -->]](/core-java-modules/core-java-io-2)
|
||||||
|
@ -14,7 +14,7 @@ import org.apache.tika.mime.MimeTypeException;
|
|||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import com.j256.simplemagic.ContentInfo;
|
import com.j256.simplemagic.ContentType;
|
||||||
|
|
||||||
public class ExtensionFromMimeTypeUnitTest {
|
public class ExtensionFromMimeTypeUnitTest {
|
||||||
private static final String IMAGE_JPEG_MIME_TYPE = "image/jpeg";
|
private static final String IMAGE_JPEG_MIME_TYPE = "image/jpeg";
|
||||||
@ -39,8 +39,7 @@ public class ExtensionFromMimeTypeUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
public void whenUsingMimetypesFileTypeMap_thenGetFileExtension() {
|
public void whenUsingMimetypesFileTypeMap_thenGetFileExtension() {
|
||||||
List<String> expectedExtensions = Arrays.asList("jpeg", "jpg", "jpe");
|
List<String> expectedExtensions = Arrays.asList("jpeg", "jpg", "jpe");
|
||||||
ContentInfo contentInfo = new ContentInfo("", IMAGE_JPEG_MIME_TYPE, "", true);
|
String[] detectedExtensions = ContentType.fromMimeType(IMAGE_JPEG_MIME_TYPE).getFileExtensions();
|
||||||
String[] detectedExtensions = contentInfo.getFileExtensions();
|
|
||||||
assertThat(detectedExtensions).containsExactlyElementsOf(expectedExtensions);
|
assertThat(detectedExtensions).containsExactlyElementsOf(expectedExtensions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,4 +12,4 @@ This module contains articles about inheritance in Java
|
|||||||
- [Guide to Inheritance in Java](https://www.baeldung.com/java-inheritance)
|
- [Guide to Inheritance in Java](https://www.baeldung.com/java-inheritance)
|
||||||
- [Object Type Casting in Java](https://www.baeldung.com/java-type-casting)
|
- [Object Type Casting in Java](https://www.baeldung.com/java-type-casting)
|
||||||
- [Variable and Method Hiding in Java](https://www.baeldung.com/java-variable-method-hiding)
|
- [Variable and Method Hiding in Java](https://www.baeldung.com/java-variable-method-hiding)
|
||||||
- [Inner Classes Vs. Subclasses in Java](https://www.baeldung.com/java-inner-classes-vs-subclasses)
|
- [Inner Classes vs. Subclasses in Java](https://www.baeldung.com/java-inner-classes-vs-subclasses)
|
||||||
|
@ -24,7 +24,7 @@ public class EchoIntegrationTest {
|
|||||||
|
|
||||||
Executors.newSingleThreadExecutor()
|
Executors.newSingleThreadExecutor()
|
||||||
.submit(() -> new EchoServer().start(port));
|
.submit(() -> new EchoServer().start(port));
|
||||||
Thread.sleep(500);
|
Thread.sleep(2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
private EchoClient client = new EchoClient();
|
private EchoClient client = new EchoClient();
|
||||||
|
@ -27,7 +27,7 @@ public class GreetServerIntegrationTest {
|
|||||||
|
|
||||||
Executors.newSingleThreadExecutor()
|
Executors.newSingleThreadExecutor()
|
||||||
.submit(() -> new GreetServer().start(port));
|
.submit(() -> new GreetServer().start(port));
|
||||||
Thread.sleep(500);
|
Thread.sleep(2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
|
@ -23,7 +23,7 @@ public class SocketEchoMultiIntegrationTest {
|
|||||||
s.close();
|
s.close();
|
||||||
|
|
||||||
Executors.newSingleThreadExecutor().submit(() -> new EchoMultiServer().start(port));
|
Executors.newSingleThreadExecutor().submit(() -> new EchoMultiServer().start(port));
|
||||||
Thread.sleep(500);
|
Thread.sleep(2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -3,4 +3,5 @@
|
|||||||
- [Convert Integer to Hexadecimal in Java](https://www.baeldung.com/java-convert-int-to-hex)
|
- [Convert Integer to Hexadecimal in Java](https://www.baeldung.com/java-convert-int-to-hex)
|
||||||
- [Integer.class vs Integer.TYPE vs int.class](https://www.baeldung.com/java-integer-class-vs-type-vs-int)
|
- [Integer.class vs Integer.TYPE vs int.class](https://www.baeldung.com/java-integer-class-vs-type-vs-int)
|
||||||
- [Does Java Read Integers in Little Endian or Big Endian?](https://www.baeldung.com/java-integers-little-big-endian)
|
- [Does Java Read Integers in Little Endian or Big Endian?](https://www.baeldung.com/java-integers-little-big-endian)
|
||||||
|
- [How to Split an Integer Number Into Digits in Java](https://www.baeldung.com/java-integer-individual-digits)
|
||||||
- More articles: [[<-- prev]](../core-java-numbers-5)
|
- More articles: [[<-- prev]](../core-java-numbers-5)
|
||||||
|
@ -5,3 +5,4 @@ This module contains articles about performance of Java applications
|
|||||||
### Relevant Articles:
|
### Relevant Articles:
|
||||||
- [External Debugging With JMXTerm](https://www.baeldung.com/java-jmxterm-external-debugging)
|
- [External Debugging With JMXTerm](https://www.baeldung.com/java-jmxterm-external-debugging)
|
||||||
- [Create and Detect Memory Leaks in Java](https://www.baeldung.com/java-create-detect-memory-leaks)
|
- [Create and Detect Memory Leaks in Java](https://www.baeldung.com/java-create-detect-memory-leaks)
|
||||||
|
- [Differences Between Heap Dump, Thread Dump and Core Dump](https://www.baeldung.com/java-heap-thread-core-dumps)
|
||||||
|
@ -9,3 +9,4 @@
|
|||||||
- [Invoke a Static Method Using Java Reflection API](https://www.baeldung.com/java-invoke-static-method-reflection)
|
- [Invoke a Static Method Using Java Reflection API](https://www.baeldung.com/java-invoke-static-method-reflection)
|
||||||
- [What Is the JDK com.sun.proxy.$Proxy Class?](https://www.baeldung.com/jdk-com-sun-proxy)
|
- [What Is the JDK com.sun.proxy.$Proxy Class?](https://www.baeldung.com/jdk-com-sun-proxy)
|
||||||
- [Unit Test Private Methods in Java](https://www.baeldung.com/java-unit-test-private-methods)
|
- [Unit Test Private Methods in Java](https://www.baeldung.com/java-unit-test-private-methods)
|
||||||
|
- [Constructing Java Objects From Only the Class Name](https://www.baeldung.com/java-objects-make-using-class-name)
|
||||||
|
@ -4,4 +4,5 @@ This module contains articles about core Java Security
|
|||||||
|
|
||||||
### Relevant Articles:
|
### Relevant Articles:
|
||||||
- [Check if Certificate Is Self-Signed or CA-Signed With Java](https://www.baeldung.com/java-check-certificate-sign)
|
- [Check if Certificate Is Self-Signed or CA-Signed With Java](https://www.baeldung.com/java-check-certificate-sign)
|
||||||
|
- [Extract CN From X509 Certificate in Java](https://www.baeldung.com/java-extract-common-name-x509-certificate)
|
||||||
- More articles: [[<-- prev]](/core-java-modules/core-java-security-3)
|
- More articles: [[<-- prev]](/core-java-modules/core-java-security-3)
|
||||||
|
@ -2,3 +2,4 @@
|
|||||||
- [Difference Between parallelStream() and stream().parallel() in Java](https://www.baeldung.com/java-parallelstream-vs-stream-parallel)
|
- [Difference Between parallelStream() and stream().parallel() in Java](https://www.baeldung.com/java-parallelstream-vs-stream-parallel)
|
||||||
- [Working With Empty Stream in Java](https://www.baeldung.com/java-empty-stream)
|
- [Working With Empty Stream in Java](https://www.baeldung.com/java-empty-stream)
|
||||||
- [Aggregate Runtime Exceptions in Java Streams](https://www.baeldung.com/java-streams-aggregate-exceptions)
|
- [Aggregate Runtime Exceptions in Java Streams](https://www.baeldung.com/java-streams-aggregate-exceptions)
|
||||||
|
- [Streams vs. Loops in Java](https://www.baeldung.com/java-streams-vs-loops)
|
||||||
|
@ -23,6 +23,11 @@
|
|||||||
<artifactId>commons-lang3</artifactId>
|
<artifactId>commons-lang3</artifactId>
|
||||||
<version>${apache-commons-lang3.version}</version>
|
<version>${apache-commons-lang3.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.vdurmont</groupId>
|
||||||
|
<artifactId>emoji-java</artifactId>
|
||||||
|
<version>${emoji-java.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
@ -52,6 +57,7 @@
|
|||||||
<maven.compiler.target>11</maven.compiler.target>
|
<maven.compiler.target>11</maven.compiler.target>
|
||||||
<validator.version>1.7</validator.version>
|
<validator.version>1.7</validator.version>
|
||||||
<apache-commons-lang3.version>3.12.0</apache-commons-lang3.version>
|
<apache-commons-lang3.version>3.12.0</apache-commons-lang3.version>
|
||||||
|
<emoji-java.version>5.1.1</emoji-java.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
@ -0,0 +1,33 @@
|
|||||||
|
package com.baeldung.findemojis;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.vdurmont.emoji.EmojiManager;
|
||||||
|
|
||||||
|
public class FindEmojisUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAWord_whenUsingEmojiJava_thenDetectEmoji() {
|
||||||
|
boolean emoji = EmojiManager.isEmoji("\uD83D\uDC3B");
|
||||||
|
assertTrue(emoji);
|
||||||
|
|
||||||
|
boolean notEmoji = EmojiManager.isEmoji("w");
|
||||||
|
assertFalse(notEmoji);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAWord_whenUsingRegex_thenDetectEmoji() {
|
||||||
|
String regexPattern = "[\uD800-\uDBFF\uDC00-\uDFFF]+";
|
||||||
|
String emojiString = "\uD83D\uDC3B";
|
||||||
|
boolean emoji = emojiString.matches(regexPattern);
|
||||||
|
assertTrue(emoji);
|
||||||
|
|
||||||
|
String notEmojiString = "w";
|
||||||
|
boolean notEmoji = notEmojiString.matches(regexPattern);
|
||||||
|
assertFalse(notEmoji);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -10,4 +10,5 @@
|
|||||||
- [Guide to Splitting a String by Whitespace in Java](https://www.baeldung.com/java-splitting-a-string-by-whitespace)
|
- [Guide to Splitting a String by Whitespace in Java](https://www.baeldung.com/java-splitting-a-string-by-whitespace)
|
||||||
- [Check if the First Letter of a String Is a Number](https://www.baeldung.com/java-check-if-string-starts-with-number)
|
- [Check if the First Letter of a String Is a Number](https://www.baeldung.com/java-check-if-string-starts-with-number)
|
||||||
- [Print “” Quotes Around a String in Java](https://www.baeldung.com/java-string-print-quotes)
|
- [Print “” Quotes Around a String in Java](https://www.baeldung.com/java-string-print-quotes)
|
||||||
- [Remove Punctuation From a String in Java](https://www.baeldung.com/java-remove-punctuation-from-string)
|
- [Remove Punctuation From a String in Java](https://www.baeldung.com/java-remove-punctuation-from-string)
|
||||||
|
- [Replacing Single Quote with \’ in Java String](https://www.baeldung.com/java-replacing-single-quote-string)
|
||||||
|
@ -65,6 +65,7 @@
|
|||||||
<module>core-java-arrays-convert</module>
|
<module>core-java-arrays-convert</module>
|
||||||
<module>core-java-arrays-operations-basic</module>
|
<module>core-java-arrays-operations-basic</module>
|
||||||
<module>core-java-arrays-operations-advanced</module>
|
<module>core-java-arrays-operations-advanced</module>
|
||||||
|
<module>core-java-arrays-operations-advanced-2</module>
|
||||||
<module>core-java-booleans</module>
|
<module>core-java-booleans</module>
|
||||||
<module>core-java-char</module>
|
<module>core-java-char</module>
|
||||||
<module>core-java-collections</module>
|
<module>core-java-collections</module>
|
||||||
|
@ -1,8 +1,15 @@
|
|||||||
package com.baeldung.drools.config;
|
package com.baeldung.drools.config;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.drools.decisiontable.DecisionTableProviderImpl;
|
import org.drools.decisiontable.DecisionTableProviderImpl;
|
||||||
import org.kie.api.KieServices;
|
import org.kie.api.KieServices;
|
||||||
import org.kie.api.builder.*;
|
import org.kie.api.builder.KieBuilder;
|
||||||
|
import org.kie.api.builder.KieFileSystem;
|
||||||
|
import org.kie.api.builder.KieModule;
|
||||||
|
import org.kie.api.builder.KieRepository;
|
||||||
|
import org.kie.api.builder.ReleaseId;
|
||||||
import org.kie.api.io.Resource;
|
import org.kie.api.io.Resource;
|
||||||
import org.kie.api.runtime.KieContainer;
|
import org.kie.api.runtime.KieContainer;
|
||||||
import org.kie.api.runtime.KieSession;
|
import org.kie.api.runtime.KieSession;
|
||||||
@ -10,35 +17,19 @@ import org.kie.internal.builder.DecisionTableConfiguration;
|
|||||||
import org.kie.internal.builder.DecisionTableInputType;
|
import org.kie.internal.builder.DecisionTableInputType;
|
||||||
import org.kie.internal.builder.KnowledgeBuilderFactory;
|
import org.kie.internal.builder.KnowledgeBuilderFactory;
|
||||||
import org.kie.internal.io.ResourceFactory;
|
import org.kie.internal.io.ResourceFactory;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class DroolsBeanFactory {
|
public class DroolsBeanFactory {
|
||||||
|
|
||||||
private static final String RULES_PATH = "com/baeldung/drools/rules/";
|
private static final String RULES_PATH = "com/baeldung/drools/rules/";
|
||||||
private KieServices kieServices = KieServices.Factory.get();
|
private KieServices kieServices = KieServices.Factory.get();
|
||||||
|
|
||||||
private KieFileSystem getKieFileSystem() {
|
private KieFileSystem getKieFileSystem() {
|
||||||
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
|
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
|
||||||
List<String> rules = Arrays.asList("BackwardChaining.drl", "SuggestApplicant.drl", "Product_rules.drl.xls");
|
List<String> rules = Arrays.asList("com/baeldung/drools/rules/BackwardChaining.drl", "com/baeldung/drools/rules/SuggestApplicant.drl", "com/baeldung/drools/rules/Product_rules.drl.xls");
|
||||||
for(String rule:rules) {
|
for (String rule : rules) {
|
||||||
kieFileSystem.write(ResourceFactory.newClassPathResource(rule));
|
kieFileSystem.write(ResourceFactory.newClassPathResource(rule));
|
||||||
}
|
}
|
||||||
return kieFileSystem;
|
return kieFileSystem;
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public KieContainer getKieContainer() {
|
|
||||||
getKieRepository();
|
|
||||||
|
|
||||||
KieBuilder kb = kieServices.newKieBuilder(getKieFileSystem());
|
|
||||||
kb.buildAll();
|
|
||||||
|
|
||||||
KieModule kieModule = kb.getKieModule();
|
|
||||||
KieContainer kContainer = kieServices.newKieContainer(kieModule.getReleaseId());
|
|
||||||
|
|
||||||
return kContainer;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void getKieRepository() {
|
private void getKieRepository() {
|
||||||
@ -47,20 +38,14 @@ public class DroolsBeanFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public KieSession getKieSession() {
|
public KieSession getKieSession() {
|
||||||
getKieRepository();
|
KieBuilder kb = kieServices.newKieBuilder(getKieFileSystem());
|
||||||
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
|
|
||||||
|
|
||||||
kieFileSystem.write(ResourceFactory.newClassPathResource("com/baeldung/drools/rules/BackwardChaining.drl"));
|
|
||||||
kieFileSystem.write(ResourceFactory.newClassPathResource("com/baeldung/drools/rules/SuggestApplicant.drl"));
|
|
||||||
kieFileSystem.write(ResourceFactory.newClassPathResource("com/baeldung/drools/rules/Product_rules.drl.xls"));
|
|
||||||
|
|
||||||
KieBuilder kb = kieServices.newKieBuilder(kieFileSystem);
|
|
||||||
kb.buildAll();
|
kb.buildAll();
|
||||||
KieModule kieModule = kb.getKieModule();
|
|
||||||
|
|
||||||
KieContainer kContainer = kieServices.newKieContainer(kieModule.getReleaseId());
|
KieRepository kieRepository = kieServices.getRepository();
|
||||||
|
ReleaseId krDefaultReleaseId = kieRepository.getDefaultReleaseId();
|
||||||
|
KieContainer kieContainer = kieServices.newKieContainer(krDefaultReleaseId);
|
||||||
|
|
||||||
return kContainer.newKieSession();
|
return kieContainer.newKieSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
public KieSession getKieSession(Resource dt) {
|
public KieSession getKieSession(Resource dt) {
|
||||||
|
@ -2,3 +2,4 @@
|
|||||||
|
|
||||||
- [Run a Java main Method Using Gradle](https://www.baeldung.com/gradle-run-java-main)
|
- [Run a Java main Method Using Gradle](https://www.baeldung.com/gradle-run-java-main)
|
||||||
- [Finding Unused Gradle Dependencies](https://www.baeldung.com/gradle-finding-unused-dependencies)
|
- [Finding Unused Gradle Dependencies](https://www.baeldung.com/gradle-finding-unused-dependencies)
|
||||||
|
- [Intro to Gradle Lint Plugin](https://www.baeldung.com/java-gradle-lint-intro)
|
||||||
|
@ -1,14 +1,21 @@
|
|||||||
plugins{
|
plugins {
|
||||||
id "nebula.lint" version "16.9.0"
|
id "nebula.lint" version "18.1.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
description = "Gradle 5 root project"
|
description = "Gradle 5 root project"
|
||||||
allprojects {
|
allprojects {
|
||||||
apply plugin :"java"
|
apply plugin: "java"
|
||||||
apply plugin :"nebula.lint"
|
apply plugin: "nebula.lint"
|
||||||
gradleLint {
|
gradleLint {
|
||||||
rules=['unused-dependency']
|
rules = [
|
||||||
|
// 'unused-dependency',
|
||||||
|
// 'dependency-parentheses',
|
||||||
|
// 'undeclared-dependency',
|
||||||
|
// 'minimum-dependency-version'
|
||||||
|
]
|
||||||
reportFormat = 'text'
|
reportFormat = 'text'
|
||||||
|
reportOnlyFixableViolations = true
|
||||||
}
|
}
|
||||||
group = "com.baeldung"
|
group = "com.baeldung"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
@ -16,6 +23,6 @@ allprojects {
|
|||||||
targetCompatibility = "1.8"
|
targetCompatibility = "1.8"
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
jcenter()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
}
|
}
|
6
gradle-modules/gradle-5/gradle-lint-intro.gradle
Normal file
6
gradle-modules/gradle-5/gradle-lint-intro.gradle
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
allprojects {
|
||||||
|
apply plugin: "nebula.lint"
|
||||||
|
gradleLint {
|
||||||
|
rules = ['dependency-parenthesis']
|
||||||
|
}
|
||||||
|
}
|
1
gradle-modules/gradle-5/gradle-lint-intro/.gitignore
vendored
Normal file
1
gradle-modules/gradle-5/gradle-lint-intro/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/build/
|
15
gradle-modules/gradle-5/gradle-lint-intro/build.gradle
Normal file
15
gradle-modules/gradle-5/gradle-lint-intro/build.gradle
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
description = "Introduction to Gradle Lint Plugin"
|
||||||
|
|
||||||
|
ext {
|
||||||
|
awsVersion = '2.20.83'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation platform("software.amazon.awssdk:bom:$awsVersion")
|
||||||
|
testImplementation('junit:junit:4.13.1')
|
||||||
|
gradleLint.ignore('unused-dependency', 'dependency-parentheses') {
|
||||||
|
implementation('software.amazon.awssdk:sts')
|
||||||
|
}
|
||||||
|
}
|
@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
|
|||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
|
||||||
|
16
gradle-modules/gradle-5/lint.gradle
Normal file
16
gradle-modules/gradle-5/lint.gradle
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import com.netflix.nebula.lint.plugin.GradleLintPlugin
|
||||||
|
|
||||||
|
initscript {
|
||||||
|
repositories { mavenCentral() }
|
||||||
|
dependencies {
|
||||||
|
classpath 'com.netflix.nebula:gradle-lint-plugin:18.1.0'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
allprojects {
|
||||||
|
apply plugin: GradleLintPlugin
|
||||||
|
gradleLint {
|
||||||
|
rules=[]
|
||||||
|
alwaysRun= false
|
||||||
|
}
|
||||||
|
}
|
@ -2,4 +2,5 @@ rootProject.name='gradle-5'
|
|||||||
include 'java-exec'
|
include 'java-exec'
|
||||||
include 'unused-dependencies'
|
include 'unused-dependencies'
|
||||||
include 'source-sets'
|
include 'source-sets'
|
||||||
include 'cmd-line-args'
|
include 'cmd-line-args'
|
||||||
|
include 'gradle-lint-intro'
|
@ -1,7 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
@ -47,8 +45,8 @@
|
|||||||
<metrics-spring.version>3.1.3</metrics-spring.version>
|
<metrics-spring.version>3.1.3</metrics-spring.version>
|
||||||
<node.version>v6.10.0</node.version>
|
<node.version>v6.10.0</node.version>
|
||||||
<!-- These remain empty unless the corresponding profile is active -->
|
<!-- These remain empty unless the corresponding profile is active -->
|
||||||
<profile.no-liquibase/>
|
<profile.no-liquibase />
|
||||||
<profile.swagger/>
|
<profile.swagger />
|
||||||
<!-- Sonar properties -->
|
<!-- Sonar properties -->
|
||||||
<project.testresult.directory>${project.build.directory}/test-results</project.testresult.directory>
|
<project.testresult.directory>${project.build.directory}/test-results</project.testresult.directory>
|
||||||
<prometheus-simpleclient.version>0.0.20</prometheus-simpleclient.version>
|
<prometheus-simpleclient.version>0.0.20</prometheus-simpleclient.version>
|
||||||
@ -442,7 +440,7 @@
|
|||||||
</goals>
|
</goals>
|
||||||
</pluginExecutionFilter>
|
</pluginExecutionFilter>
|
||||||
<action>
|
<action>
|
||||||
<ignore/>
|
<ignore />
|
||||||
</action>
|
</action>
|
||||||
</pluginExecution>
|
</pluginExecution>
|
||||||
</pluginExecutions>
|
</pluginExecutions>
|
||||||
@ -636,9 +634,9 @@
|
|||||||
<diffChangeLogFile>src/main/resources/config/liquibase/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile>
|
<diffChangeLogFile>src/main/resources/config/liquibase/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile>
|
||||||
<driver>org.h2.Driver</driver>
|
<driver>org.h2.Driver</driver>
|
||||||
<url>jdbc:h2:file:./target/h2db/db/carapp</url>
|
<url>jdbc:h2:file:./target/h2db/db/carapp</url>
|
||||||
<defaultSchemaName/>
|
<defaultSchemaName />
|
||||||
<username>carapp</username>
|
<username>carapp</username>
|
||||||
<password/>
|
<password />
|
||||||
<referenceUrl>hibernate:spring:com.car.app.domain?dialect=org.hibernate.dialect.H2Dialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy</referenceUrl>
|
<referenceUrl>hibernate:spring:com.car.app.domain?dialect=org.hibernate.dialect.H2Dialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy</referenceUrl>
|
||||||
<verbose>true</verbose>
|
<verbose>true</verbose>
|
||||||
<logging>debug</logging>
|
<logging>debug</logging>
|
||||||
@ -685,7 +683,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-war-plugin</artifactId>
|
<artifactId>maven-war-plugin</artifactId>
|
||||||
<configuration/>
|
<configuration />
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
@ -724,7 +722,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-war-plugin</artifactId>
|
<artifactId>maven-war-plugin</artifactId>
|
||||||
<configuration/>
|
<configuration />
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
@ -46,8 +44,8 @@
|
|||||||
<metrics-spring.version>3.1.3</metrics-spring.version>
|
<metrics-spring.version>3.1.3</metrics-spring.version>
|
||||||
<node.version>v6.10.0</node.version>
|
<node.version>v6.10.0</node.version>
|
||||||
<!-- These remain empty unless the corresponding profile is active -->
|
<!-- These remain empty unless the corresponding profile is active -->
|
||||||
<profile.no-liquibase/>
|
<profile.no-liquibase />
|
||||||
<profile.swagger/>
|
<profile.swagger />
|
||||||
<!-- Sonar properties -->
|
<!-- Sonar properties -->
|
||||||
<project.testresult.directory>${project.build.directory}/test-results</project.testresult.directory>
|
<project.testresult.directory>${project.build.directory}/test-results</project.testresult.directory>
|
||||||
<prometheus-simpleclient.version>0.0.20</prometheus-simpleclient.version>
|
<prometheus-simpleclient.version>0.0.20</prometheus-simpleclient.version>
|
||||||
@ -441,7 +439,7 @@
|
|||||||
</goals>
|
</goals>
|
||||||
</pluginExecutionFilter>
|
</pluginExecutionFilter>
|
||||||
<action>
|
<action>
|
||||||
<ignore/>
|
<ignore />
|
||||||
</action>
|
</action>
|
||||||
</pluginExecution>
|
</pluginExecution>
|
||||||
</pluginExecutions>
|
</pluginExecutions>
|
||||||
@ -635,9 +633,9 @@
|
|||||||
<diffChangeLogFile>src/main/resources/config/liquibase/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile>
|
<diffChangeLogFile>src/main/resources/config/liquibase/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile>
|
||||||
<driver>org.h2.Driver</driver>
|
<driver>org.h2.Driver</driver>
|
||||||
<url>jdbc:h2:file:./target/h2db/db/dealerapp</url>
|
<url>jdbc:h2:file:./target/h2db/db/dealerapp</url>
|
||||||
<defaultSchemaName/>
|
<defaultSchemaName />
|
||||||
<username>dealerapp</username>
|
<username>dealerapp</username>
|
||||||
<password/>
|
<password />
|
||||||
<referenceUrl>hibernate:spring:com.dealer.app.domain?dialect=org.hibernate.dialect.H2Dialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy</referenceUrl>
|
<referenceUrl>hibernate:spring:com.dealer.app.domain?dialect=org.hibernate.dialect.H2Dialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy</referenceUrl>
|
||||||
<verbose>true</verbose>
|
<verbose>true</verbose>
|
||||||
<logging>debug</logging>
|
<logging>debug</logging>
|
||||||
@ -684,7 +682,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-war-plugin</artifactId>
|
<artifactId>maven-war-plugin</artifactId>
|
||||||
<configuration/>
|
<configuration />
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
@ -723,7 +721,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-war-plugin</artifactId>
|
<artifactId>maven-war-plugin</artifactId>
|
||||||
<configuration/>
|
<configuration />
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
@ -50,8 +48,8 @@
|
|||||||
<metrics-spring.version>3.1.3</metrics-spring.version>
|
<metrics-spring.version>3.1.3</metrics-spring.version>
|
||||||
<node.version>v6.10.0</node.version>
|
<node.version>v6.10.0</node.version>
|
||||||
<!-- These remain empty unless the corresponding profile is active -->
|
<!-- These remain empty unless the corresponding profile is active -->
|
||||||
<profile.no-liquibase/>
|
<profile.no-liquibase />
|
||||||
<profile.swagger/>
|
<profile.swagger />
|
||||||
<!-- Sonar properties -->
|
<!-- Sonar properties -->
|
||||||
<project.testresult.directory>${project.build.directory}/test-results</project.testresult.directory>
|
<project.testresult.directory>${project.build.directory}/test-results</project.testresult.directory>
|
||||||
<prometheus-simpleclient.version>0.0.20</prometheus-simpleclient.version>
|
<prometheus-simpleclient.version>0.0.20</prometheus-simpleclient.version>
|
||||||
@ -483,7 +481,7 @@
|
|||||||
</goals>
|
</goals>
|
||||||
</pluginExecutionFilter>
|
</pluginExecutionFilter>
|
||||||
<action>
|
<action>
|
||||||
<ignore/>
|
<ignore />
|
||||||
</action>
|
</action>
|
||||||
</pluginExecution>
|
</pluginExecution>
|
||||||
<pluginExecution>
|
<pluginExecution>
|
||||||
@ -499,7 +497,7 @@
|
|||||||
</goals>
|
</goals>
|
||||||
</pluginExecutionFilter>
|
</pluginExecutionFilter>
|
||||||
<action>
|
<action>
|
||||||
<ignore/>
|
<ignore />
|
||||||
</action>
|
</action>
|
||||||
</pluginExecution>
|
</pluginExecution>
|
||||||
</pluginExecutions>
|
</pluginExecutions>
|
||||||
@ -693,9 +691,9 @@
|
|||||||
<diffChangeLogFile>src/main/resources/config/liquibase/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile>
|
<diffChangeLogFile>src/main/resources/config/liquibase/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile>
|
||||||
<driver>org.h2.Driver</driver>
|
<driver>org.h2.Driver</driver>
|
||||||
<url>jdbc:h2:file:./target/h2db/db/gateway</url>
|
<url>jdbc:h2:file:./target/h2db/db/gateway</url>
|
||||||
<defaultSchemaName/>
|
<defaultSchemaName />
|
||||||
<username>gateway</username>
|
<username>gateway</username>
|
||||||
<password/>
|
<password />
|
||||||
<referenceUrl>hibernate:spring:com.gateway.domain?dialect=org.hibernate.dialect.H2Dialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy</referenceUrl>
|
<referenceUrl>hibernate:spring:com.gateway.domain?dialect=org.hibernate.dialect.H2Dialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy</referenceUrl>
|
||||||
<verbose>true</verbose>
|
<verbose>true</verbose>
|
||||||
<logging>debug</logging>
|
<logging>debug</logging>
|
||||||
|
@ -101,6 +101,7 @@
|
|||||||
<module>spring-data-shardingsphere</module>
|
<module>spring-data-shardingsphere</module>
|
||||||
<!-- <module>spring-hibernate-3</module> FAILED -->
|
<!-- <module>spring-hibernate-3</module> FAILED -->
|
||||||
<!-- <module>spring-hibernate-5</module> FAILED --> <!-- long running -->
|
<!-- <module>spring-hibernate-5</module> FAILED --> <!-- long running -->
|
||||||
|
<module>spring-hibernate-6</module>
|
||||||
<module>spring-jpa</module>
|
<module>spring-jpa</module>
|
||||||
<module>spring-jpa-2</module>
|
<module>spring-jpa-2</module>
|
||||||
<module>spring-jdbc</module>
|
<module>spring-jdbc</module>
|
||||||
@ -114,7 +115,7 @@
|
|||||||
<module>java-mongodb</module>
|
<module>java-mongodb</module>
|
||||||
<module>questdb</module>
|
<module>questdb</module>
|
||||||
<module>neo4j</module>
|
<module>neo4j</module>
|
||||||
<module>rethinkdb</module>
|
<!--<module>rethinkdb</module>--> <!-- JAVA-25297 -->
|
||||||
<module>scylladb</module>
|
<module>scylladb</module>
|
||||||
<module>spring-data-cassandra-2</module>
|
<module>spring-data-cassandra-2</module>
|
||||||
<module>spring-data-jpa-repo-3</module>
|
<module>spring-data-jpa-repo-3</module>
|
||||||
|
@ -2,3 +2,4 @@
|
|||||||
|
|
||||||
- [Using Test Containers With Spring Data Cassandra](https://www.baeldung.com/spring-data-cassandra-test-containers)
|
- [Using Test Containers With Spring Data Cassandra](https://www.baeldung.com/spring-data-cassandra-test-containers)
|
||||||
- [Cassandra – Object Mapping with DataStax Java Driver](https://www.baeldung.com/cassandra-object-mapping-datastax-java-driver)
|
- [Cassandra – Object Mapping with DataStax Java Driver](https://www.baeldung.com/cassandra-object-mapping-datastax-java-driver)
|
||||||
|
- [Query With IN Clause in Spring Data Cassandra](https://www.baeldung.com/spring-cassandra-query-in-clause)
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
FROM couchbase/server:community-5.0.1
|
||||||
|
|
||||||
|
COPY configure.sh /configure.sh
|
||||||
|
CMD ["/configure.sh"]
|
@ -0,0 +1,106 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function retry() {
|
||||||
|
for i in $(seq 1 10); do
|
||||||
|
$1 "$2"
|
||||||
|
if [[ $? == 0 ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function bucketCreate(){
|
||||||
|
couchbase-cli bucket-create -c localhost -u Administrator -p password \
|
||||||
|
--bucket="$1" \
|
||||||
|
--bucket-type=couchbase \
|
||||||
|
--bucket-ramsize=512 \
|
||||||
|
--bucket-replica=1 \
|
||||||
|
--wait
|
||||||
|
if [[ $? != 0 ]]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function userCreate(){
|
||||||
|
createOutput=$(couchbase-cli user-manage -c localhost -u Administrator -p password \
|
||||||
|
--set --rbac-username "$1" --rbac-password "$1" \
|
||||||
|
--roles admin --auth-domain local)
|
||||||
|
if [[ $? != 0 ]]; then
|
||||||
|
echo $createOutput >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function clusterUp(){
|
||||||
|
# wait for service to come up
|
||||||
|
until $(curl --output /dev/null --silent --head --fail http://localhost:8091); do
|
||||||
|
printf '.'
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
# initialize cluster
|
||||||
|
initOutput=$(couchbase-cli cluster-init -c localhost \
|
||||||
|
--cluster-username=Administrator \
|
||||||
|
--cluster-password=password \
|
||||||
|
--cluster-port=8091 \
|
||||||
|
--services=data,index,query,fts \
|
||||||
|
--cluster-ramsize=1024 \
|
||||||
|
--cluster-index-ramsize=256 \
|
||||||
|
--cluster-fts-ramsize=256 \
|
||||||
|
--index-storage-setting=default)
|
||||||
|
if [[ $? != 0 ]]; then
|
||||||
|
echo $initOutput >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function main(){
|
||||||
|
set -ex
|
||||||
|
echo "Couchbase UI :8091"
|
||||||
|
echo "Couchbase logs /opt/couchbase/var/lib/couchbase/logs"
|
||||||
|
./entrypoint.sh couchbase-server &
|
||||||
|
if [[ $? != 0 ]]; then
|
||||||
|
echo "Couchbase startup failed. Exiting." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
clusterUp
|
||||||
|
if [[ $? != 0 ]]; then
|
||||||
|
echo "Cluster init failed. Exiting." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
retry userCreate baeldung
|
||||||
|
if [[ $? != 0 ]]; then
|
||||||
|
echo "User create failed. Exiting." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
retry userCreate baeldung2
|
||||||
|
if [[ $? != 0 ]]; then
|
||||||
|
echo "User create failed. Exiting." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
retry bucketCreate baeldung
|
||||||
|
if [[ $? != 0 ]]; then
|
||||||
|
echo "Bucket create failed. Exiting." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
retry bucketCreate baeldung2
|
||||||
|
if [[ $? != 0 ]]; then
|
||||||
|
echo "Bucket create failed. Exiting." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
set +ex
|
||||||
|
|
||||||
|
# entrypoint.sh launches the server but since config.sh is pid 1 we keep it
|
||||||
|
# running so that the docker container does not exit.
|
||||||
|
wait
|
||||||
|
}
|
||||||
|
|
||||||
|
main
|
@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# setup
|
||||||
|
set -ex
|
||||||
|
docker rm couchbase_container -f
|
||||||
|
|
||||||
|
# main
|
||||||
|
docker build -t couchbase_image .
|
||||||
|
|
||||||
|
# cleanup
|
||||||
|
set +ex
|
||||||
|
|
||||||
|
# run
|
||||||
|
docker run -d --name couchbase_container -p 8091-8096:8091-8096 -p 11210-11211:11210-11211 couchbase_image
|
@ -12,16 +12,10 @@ import org.springframework.test.context.support.DependencyInjectionTestExecution
|
|||||||
/**
|
/**
|
||||||
* This LiveTest requires:
|
* This LiveTest requires:
|
||||||
*
|
*
|
||||||
* 1- Couchbase instance running (e.g. with `docker run -d --name db -p 8091-8096:8091-8096 -p 11210-11211:11210-11211 couchbase`)
|
* 1- Couchbase 5 instance Running and Configured.
|
||||||
*
|
* It's enough to execute the "dockerbuild.sh" script in the test/docker folder.
|
||||||
*
|
*
|
||||||
* 2- Couchbase configured with (we can use the console in localhost:8091):
|
* 2.1- Spacial View: Add new spacial view (in Index tab) in document 'campus_spatial', view 'byLocation' with the following function:
|
||||||
*
|
|
||||||
* 2.1- Buckets: named 'baeldung' and 'baeldung2'
|
|
||||||
*
|
|
||||||
* 2.2- Security: users 'baeldung' and 'baeldung2'. Note: in newer versions an empty password is not allowed, then we have to change the passwords in the project)
|
|
||||||
*
|
|
||||||
* 2.3- Spacial View: Add new spacial view (in Index tab) in document 'campus_spatial', view 'byLocation' with the following function:
|
|
||||||
* {@code
|
* {@code
|
||||||
* function (doc) {
|
* function (doc) {
|
||||||
* if (doc.location &&
|
* if (doc.location &&
|
||||||
@ -30,8 +24,9 @@ import org.springframework.test.context.support.DependencyInjectionTestExecution
|
|||||||
* }
|
* }
|
||||||
* }}
|
* }}
|
||||||
*
|
*
|
||||||
* 2.4- MapReduce Views: Add new views in document 'campus':
|
* 2.2- MapReduce Views: Add new views in document 'campus':
|
||||||
* 2.4.1- view 'all' with function:
|
*
|
||||||
|
* 2.2.1- view 'all' with function:
|
||||||
* {@code
|
* {@code
|
||||||
* function (doc, meta) {
|
* function (doc, meta) {
|
||||||
* if(doc._class == "com.baeldung.spring.data.couchbase.model.Campus") {
|
* if(doc._class == "com.baeldung.spring.data.couchbase.model.Campus") {
|
||||||
@ -39,7 +34,7 @@ import org.springframework.test.context.support.DependencyInjectionTestExecution
|
|||||||
* }
|
* }
|
||||||
* }}
|
* }}
|
||||||
*
|
*
|
||||||
* 2.4.2- view 'byName' with function:
|
* 2.2.2- view 'byName' with function:
|
||||||
* {@code
|
* {@code
|
||||||
* function (doc, meta) {
|
* function (doc, meta) {
|
||||||
* if(doc._class == "com.baeldung.spring.data.couchbase.model.Campus" &&
|
* if(doc._class == "com.baeldung.spring.data.couchbase.model.Campus" &&
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
package com.baeldung.spring.data.couchbase;
|
|
||||||
|
|
||||||
import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter;
|
|
||||||
|
|
||||||
public class CustomTypeKeyCouchbaseConfig extends MyCouchbaseConfig {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getConnectionString() {
|
|
||||||
return NODE_LIST;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getUserName() {
|
|
||||||
return BUCKET_USERNAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getPassword() {
|
|
||||||
return BUCKET_PASSWORD;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String typeKey() {
|
|
||||||
return MappingCouchbaseConverter.TYPEKEY_SYNCGATEWAY_COMPATIBLE;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
package com.baeldung.spring.data.couchbase;
|
|
||||||
|
|
||||||
import com.couchbase.client.java.query.QueryScanConsistency;
|
|
||||||
|
|
||||||
public class ReadYourOwnWritesCouchbaseConfig extends MyCouchbaseConfig {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public QueryScanConsistency getDefaultConsistency() {
|
|
||||||
return QueryScanConsistency.REQUEST_PLUS;
|
|
||||||
}
|
|
||||||
}
|
|
@ -8,31 +8,19 @@
|
|||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>parent-spring-5</artifactId>
|
<artifactId>parent-boot-2</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
<relativePath>../../parent-spring-5</relativePath>
|
<relativePath>../../parent-boot-2</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.data</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-data-mongodb</artifactId>
|
<artifactId>spring-boot-starter-data-mongodb</artifactId>
|
||||||
<version>${org.springframework.data.version}</version>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mongodb</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>mongodb-driver-sync</artifactId>
|
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
|
||||||
<version>${mongodb-driver.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.mongodb</groupId>
|
|
||||||
<artifactId>mongodb-driver-reactivestreams</artifactId>
|
|
||||||
<version>${mongodb-reactivestreams.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>io.projectreactor</groupId>
|
|
||||||
<artifactId>reactor-core</artifactId>
|
|
||||||
<version>${projectreactor.version}</version>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.projectreactor</groupId>
|
<groupId>io.projectreactor</groupId>
|
||||||
@ -40,23 +28,6 @@
|
|||||||
<version>${projectreactor.version}</version>
|
<version>${projectreactor.version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework</groupId>
|
|
||||||
<artifactId>spring-core</artifactId>
|
|
||||||
<version>${spring.version}</version>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>commons-logging</artifactId>
|
|
||||||
<groupId>commons-logging</groupId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework</groupId>
|
|
||||||
<artifactId>spring-test</artifactId>
|
|
||||||
<version>${spring.version}</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.querydsl</groupId>
|
<groupId>com.querydsl</groupId>
|
||||||
<artifactId>querydsl-mongodb</artifactId>
|
<artifactId>querydsl-mongodb</artifactId>
|
||||||
@ -103,12 +74,9 @@
|
|||||||
</build>
|
</build>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<org.springframework.data.version>3.4.7</org.springframework.data.version>
|
|
||||||
<querydsl.version>5.0.0</querydsl.version>
|
<querydsl.version>5.0.0</querydsl.version>
|
||||||
<mysema.maven.version>1.1.3</mysema.maven.version>
|
<mysema.maven.version>1.1.3</mysema.maven.version>
|
||||||
<mongodb-reactivestreams.version>4.1.0</mongodb-reactivestreams.version>
|
|
||||||
<projectreactor.version>3.5.4</projectreactor.version>
|
<projectreactor.version>3.5.4</projectreactor.version>
|
||||||
<mongodb-driver.version>4.6.1</mongodb-driver.version>
|
|
||||||
<embed.mongo.version>4.6.3</embed.mongo.version>
|
<embed.mongo.version>4.6.3</embed.mongo.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@ import com.baeldung.model.User;
|
|||||||
*
|
*
|
||||||
* This test requires:
|
* This test requires:
|
||||||
* * mongodb instance running on the environment
|
* * mongodb instance running on the environment
|
||||||
|
* Run the src/live-test/resources/live-test-setup.sh
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@RunWith(SpringJUnit4ClassRunner.class)
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
|
@ -26,6 +26,7 @@ import com.baeldung.repository.UserRepository;
|
|||||||
*
|
*
|
||||||
* This test requires:
|
* This test requires:
|
||||||
* * mongodb instance running on the environment
|
* * mongodb instance running on the environment
|
||||||
|
* Run the src/live-test/resources/live-test-setup.sh
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@RunWith(SpringJUnit4ClassRunner.class)
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
|
@ -4,10 +4,7 @@ This module contains articles about Hibernate 5 with Spring.
|
|||||||
|
|
||||||
### Relevant articles
|
### Relevant articles
|
||||||
|
|
||||||
- [Programmatic Transactions in the Spring TestContext Framework](https://www.baeldung.com/spring-test-programmatic-transactions)
|
|
||||||
- [Introduction to Hibernate Search](https://www.baeldung.com/hibernate-search)
|
- [Introduction to Hibernate Search](https://www.baeldung.com/hibernate-search)
|
||||||
- [@DynamicUpdate with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-dynamicupdate)
|
|
||||||
- [Hibernate Second-Level Cache](http://www.baeldung.com/hibernate-second-level-cache)
|
- [Hibernate Second-Level Cache](http://www.baeldung.com/hibernate-second-level-cache)
|
||||||
- [Deleting Objects with Hibernate](http://www.baeldung.com/delete-with-hibernate)
|
- [Deleting Objects with Hibernate](http://www.baeldung.com/delete-with-hibernate)
|
||||||
- [Spring, Hibernate and a JNDI Datasource](http://www.baeldung.com/spring-persistence-jpa-jndi-datasource)
|
- [Spring, Hibernate and a JNDI Datasource](http://www.baeldung.com/spring-persistence-jpa-jndi-datasource)
|
||||||
- [Bootstrapping Hibernate 5 with Spring](https://www.baeldung.com/hibernate-5-spring)
|
|
||||||
|
@ -1,24 +0,0 @@
|
|||||||
package com.baeldung.hibernate.bootstrap;
|
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
|
||||||
import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.context.annotation.ImportResource;
|
|
||||||
import org.springframework.context.annotation.PropertySource;
|
|
||||||
import org.springframework.core.env.Environment;
|
|
||||||
import org.springframework.orm.hibernate5.HibernateTransactionManager;
|
|
||||||
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
|
|
||||||
import org.springframework.transaction.PlatformTransactionManager;
|
|
||||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
|
||||||
import java.util.Properties;
|
|
||||||
|
|
||||||
@Configuration
|
|
||||||
@EnableTransactionManagement
|
|
||||||
@ImportResource({ "classpath:hibernate5Configuration.xml" })
|
|
||||||
public class HibernateXMLConf {
|
|
||||||
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
package com.baeldung.hibernate.dynamicupdate;
|
|
||||||
|
|
||||||
import javax.transaction.Transactional;
|
|
||||||
|
|
||||||
import org.junit.FixMethodOrder;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.junit.runners.MethodSorters;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.test.annotation.Commit;
|
|
||||||
import org.springframework.test.context.ContextConfiguration;
|
|
||||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
|
||||||
import org.springframework.test.context.support.AnnotationConfigContextLoader;
|
|
||||||
|
|
||||||
import com.baeldung.hibernate.dynamicupdate.model.Account;
|
|
||||||
|
|
||||||
@RunWith(SpringJUnit4ClassRunner.class)
|
|
||||||
@ContextConfiguration(classes = DynamicUpdateConfig.class, loader = AnnotationConfigContextLoader.class)
|
|
||||||
@Transactional
|
|
||||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
|
||||||
public class DynamicUpdateIntegrationTest {
|
|
||||||
|
|
||||||
private static final Integer ACCOUNT_ID = 1;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private AccountRepository accountRepository;
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Commit
|
|
||||||
public void testA_whenTestAccountIsSaved_thenSuccess() {
|
|
||||||
Account account = new Account(ACCOUNT_ID, "account1", "regional", true);
|
|
||||||
accountRepository.save(account);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Commit
|
|
||||||
// Enable Hibernate's debug logging in logback.xml to see the generated SQL statement.
|
|
||||||
public void testB_whenAccountNameUpdated_thenSuccess() {
|
|
||||||
Account account = accountRepository.findOne(ACCOUNT_ID);
|
|
||||||
account.setName("Test Account");
|
|
||||||
accountRepository.save(account);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
13
persistence-modules/spring-hibernate-6/.gitignore
vendored
Normal file
13
persistence-modules/spring-hibernate-6/.gitignore
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
*.class
|
||||||
|
|
||||||
|
#folders#
|
||||||
|
/target
|
||||||
|
/neoDb*
|
||||||
|
/data
|
||||||
|
/src/main/webapp/WEB-INF/classes
|
||||||
|
*/META-INF/*
|
||||||
|
|
||||||
|
# Packaged files #
|
||||||
|
*.jar
|
||||||
|
*.war
|
||||||
|
*.ear
|
9
persistence-modules/spring-hibernate-6/README.md
Normal file
9
persistence-modules/spring-hibernate-6/README.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
## Hibernate 6 with Spring
|
||||||
|
|
||||||
|
This module contains articles about Hibernate 6 with Spring.
|
||||||
|
|
||||||
|
### Relevant articles
|
||||||
|
|
||||||
|
- [Programmatic Transactions in the Spring TestContext Framework](https://www.baeldung.com/spring-test-programmatic-transactions)
|
||||||
|
- [@DynamicUpdate with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-dynamicupdate)
|
||||||
|
- [Bootstrapping Hibernate 5 with Spring](https://www.baeldung.com/hibernate-5-spring)
|
109
persistence-modules/spring-hibernate-6/pom.xml
Normal file
109
persistence-modules/spring-hibernate-6/pom.xml
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>spring-hibernate-6</artifactId>
|
||||||
|
<version>0.1-SNAPSHOT</version>
|
||||||
|
<name>spring-hibernate-6</name>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>persistence-modules</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<!-- Spring -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-context</artifactId>
|
||||||
|
<version>${org.springframework.version}</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>commons-logging</artifactId>
|
||||||
|
<groupId>commons-logging</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-aspects</artifactId>
|
||||||
|
<version>${org.springframework.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- persistence -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-orm</artifactId>
|
||||||
|
<version>${org.springframework.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.data</groupId>
|
||||||
|
<artifactId>spring-data-jpa</artifactId>
|
||||||
|
<version>${org.springframework.data.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hibernate.orm</groupId>
|
||||||
|
<artifactId>hibernate-core</artifactId>
|
||||||
|
<version>${hibernate.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tomcat</groupId>
|
||||||
|
<artifactId>tomcat-dbcp</artifactId>
|
||||||
|
<version>${tomcat-dbcp.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- validation -->
|
||||||
|
<!-- utils -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.guava</groupId>
|
||||||
|
<artifactId>guava</artifactId>
|
||||||
|
<version>${guava.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- test scoped -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
<version>${commons-lang3.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-test</artifactId>
|
||||||
|
<version>${org.springframework.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.security</groupId>
|
||||||
|
<artifactId>spring-security-test</artifactId>
|
||||||
|
<version>${org.springframework.security.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hsqldb</groupId>
|
||||||
|
<artifactId>hsqldb</artifactId>
|
||||||
|
<version>${hsqldb.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
<version>${mysql-connector-java.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.h2database</groupId>
|
||||||
|
<artifactId>h2</artifactId>
|
||||||
|
<version>${h2.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<!-- Spring -->
|
||||||
|
<org.springframework.version>6.0.11</org.springframework.version>
|
||||||
|
<org.springframework.data.version>3.1.3</org.springframework.data.version>
|
||||||
|
<org.springframework.security.version>6.1.3</org.springframework.security.version>
|
||||||
|
<!-- persistence -->
|
||||||
|
<hibernate.version>6.2.8.Final</hibernate.version>
|
||||||
|
<mysql-connector-java.version>8.0.7-dmr</mysql-connector-java.version>
|
||||||
|
<tomcat-dbcp.version>9.0.80</tomcat-dbcp.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.baeldung.hibernate.bootstrap;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.ImportResource;
|
||||||
|
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@EnableTransactionManagement
|
||||||
|
@ImportResource({ "classpath:hibernate6Configuration.xml" })
|
||||||
|
public class HibernateXMLConf {
|
||||||
|
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
package com.baeldung.hibernate.bootstrap.model;
|
package com.baeldung.hibernate.bootstrap.model;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
public class TestEntity {
|
public class TestEntity {
|
@ -2,7 +2,7 @@ package com.baeldung.hibernate.dynamicupdate;
|
|||||||
|
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import javax.persistence.EntityManagerFactory;
|
import jakarta.persistence.EntityManagerFactory;
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
|
|
||||||
import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
|
import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
|
@ -2,9 +2,9 @@ package com.baeldung.hibernate.dynamicupdate.model;
|
|||||||
|
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import javax.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
|
|
||||||
import org.hibernate.annotations.DynamicUpdate;
|
import org.hibernate.annotations.DynamicUpdate;
|
||||||
|
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.baeldung.persistence.dao;
|
||||||
|
|
||||||
|
import com.baeldung.persistence.model.Foo;
|
||||||
|
import com.baeldung.persistence.dao.common.IOperations;
|
||||||
|
|
||||||
|
public interface IFooDao extends IOperations<Foo> {
|
||||||
|
//
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.baeldung.persistence.dao.common;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import com.google.common.base.Preconditions;
|
||||||
|
|
||||||
|
public abstract class AbstractDao<T extends Serializable> implements IOperations<T> {
|
||||||
|
|
||||||
|
protected Class<T> clazz;
|
||||||
|
|
||||||
|
protected final void setClazz(final Class<T> clazzToSet) {
|
||||||
|
clazz = Preconditions.checkNotNull(clazzToSet);
|
||||||
|
}
|
||||||
|
}
|
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