2021-08-05
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,3 +4,4 @@
|
|||||||
/.idea/
|
/.idea/
|
||||||
/build/
|
/build/
|
||||||
/**/build/**
|
/**/build/**
|
||||||
|
/test.db
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ dependencies {
|
|||||||
annotationProcessor("org.projectlombok:lombok:1.18.20")
|
annotationProcessor("org.projectlombok:lombok:1.18.20")
|
||||||
testAnnotationProcessor("org.projectlombok:lombok:1.18.20")
|
testAnnotationProcessor("org.projectlombok:lombok:1.18.20")
|
||||||
|
|
||||||
testImplementation("ch.qos.logback:logback-classic:1.2.3")
|
implementation("ch.qos.logback:logback-classic:1.2.3")
|
||||||
testImplementation("org.junit.jupiter:junit-jupiter:5.7.2")
|
testImplementation("org.junit.jupiter:junit-jupiter:5.7.2")
|
||||||
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.2")
|
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.2")
|
||||||
}
|
}
|
||||||
|
|||||||
20
hibernate/logback.xml
Normal file
20
hibernate/logback.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Examples for Java
|
||||||
|
~
|
||||||
|
~ Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
~ https://www.elex-project.com/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
|
||||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="TRACE">
|
||||||
|
<appender-ref ref="CONSOLE" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
18
jackson/build.gradle.kts
Normal file
18
jackson/build.gradle.kts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id("elex-java")
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation ("com.fasterxml.jackson.core:jackson-databind:2.12.1")
|
||||||
|
|
||||||
|
implementation ("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.12.1")
|
||||||
|
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.12.1")
|
||||||
|
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.12.1")
|
||||||
|
}
|
||||||
20
jackson/logback.xml
Normal file
20
jackson/logback.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Examples for Java
|
||||||
|
~
|
||||||
|
~ Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
~ https://www.elex-project.com/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
|
||||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="TRACE">
|
||||||
|
<appender-ref ref="CONSOLE" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
27
jackson/src/main/java/kr/pe/elex/examples/Person.java
Normal file
27
jackson/src/main/java/kr/pe/elex/examples/Person.java
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kr.pe.elex.examples;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@JsonPropertyOrder({"name", "age", "male"})
|
||||||
|
public class Person {
|
||||||
|
@JsonProperty
|
||||||
|
private String name;
|
||||||
|
@JsonProperty
|
||||||
|
private int age;
|
||||||
|
@JsonProperty
|
||||||
|
private boolean male;
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kr.pe.elex.examples;
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kr.pe.elex.examples;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.MappingIterator;
|
||||||
|
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
|
||||||
|
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
|
||||||
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
class JacksonCsvTest {
|
||||||
|
private static List<Person> list;
|
||||||
|
|
||||||
|
@BeforeAll
|
||||||
|
private static void beforeAll() {
|
||||||
|
list = new ArrayList<>();
|
||||||
|
list.add(new Person("Charlie", 11, true));
|
||||||
|
list.add(new Person("Steve", 34, true));
|
||||||
|
list.add(new Person("Jane", 22, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void writeToCsv() throws IOException {
|
||||||
|
CsvMapper mapper = new CsvMapper();
|
||||||
|
CsvSchema schema = mapper
|
||||||
|
.schemaFor(Person.class)
|
||||||
|
.withHeader();
|
||||||
|
|
||||||
|
//String csvOut = mapper.writer(schema).writeValueAsString(list);
|
||||||
|
//System.out.println(csvOut);
|
||||||
|
|
||||||
|
mapper.writer(schema)
|
||||||
|
.writeValue(new File("test.csv"), list);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void readFromCsv() throws IOException {
|
||||||
|
CsvMapper mapper = new CsvMapper();
|
||||||
|
CsvSchema schema = mapper
|
||||||
|
.schemaFor(Person.class)
|
||||||
|
.withHeader();
|
||||||
|
|
||||||
|
MappingIterator<Person> iterator = mapper.readerFor(Person.class)
|
||||||
|
.with(schema)
|
||||||
|
.readValues(new File("test.csv"));
|
||||||
|
while(iterator.hasNext()){
|
||||||
|
System.out.println(iterator.next());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kr.pe.elex.examples;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||||
|
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
|
||||||
|
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
class JacksonXmlTest {
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void write() throws IOException {
|
||||||
|
XmlMapper mapper = XmlMapper.builder()
|
||||||
|
.defaultUseWrapper(false)
|
||||||
|
.enable(SerializationFeature.INDENT_OUTPUT)
|
||||||
|
.build();
|
||||||
|
mapper
|
||||||
|
.writeValue(new File("test.xml"), new Person("Charlie", 11, true));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void read() throws IOException {
|
||||||
|
|
||||||
|
ObjectMapper mapper = new XmlMapper();
|
||||||
|
Person person = mapper.readValue(new File("test.xml"), Person.class);
|
||||||
|
|
||||||
|
System.out.println(person);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kr.pe.elex.examples;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
class JacksonYamlTest {
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void write() throws IOException {
|
||||||
|
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
|
||||||
|
mapper.writeValue(new File("test.yaml"), new Person("Charlie", 11, true));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void read() throws IOException {
|
||||||
|
|
||||||
|
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
|
||||||
|
Person person = mapper.readValue(new File("test.yaml"), Person.class);
|
||||||
|
|
||||||
|
System.out.println(person);
|
||||||
|
}
|
||||||
|
}
|
||||||
4
jackson/test.csv
Normal file
4
jackson/test.csv
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
name,age,male
|
||||||
|
Charlie,11,true
|
||||||
|
Steve,34,true
|
||||||
|
Jane,22,false
|
||||||
|
5
jackson/test.xml
Normal file
5
jackson/test.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<Person>
|
||||||
|
<name>Charlie</name>
|
||||||
|
<age>11</age>
|
||||||
|
<male>true</male>
|
||||||
|
</Person>
|
||||||
4
jackson/test.yaml
Normal file
4
jackson/test.yaml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
name: "Charlie"
|
||||||
|
age: 11
|
||||||
|
male: true
|
||||||
15
jdbc-sqlite/build.gradle.kts
Normal file
15
jdbc-sqlite/build.gradle.kts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id("elex-java")
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
|
||||||
|
runtimeOnly ("org.xerial:sqlite-jdbc:3.36.0.1")
|
||||||
|
}
|
||||||
20
jdbc-sqlite/logback.xml
Normal file
20
jdbc-sqlite/logback.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Examples for Java
|
||||||
|
~
|
||||||
|
~ Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
~ https://www.elex-project.com/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
|
||||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="TRACE">
|
||||||
|
<appender-ref ref="CONSOLE" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kr.pe.elex.examples;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class JdbcSample {
|
||||||
|
public static void main(String... args) throws SQLException {
|
||||||
|
Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");
|
||||||
|
|
||||||
|
Statement stat = conn.createStatement();
|
||||||
|
stat.executeUpdate("drop table if exists people;");
|
||||||
|
stat.executeUpdate("create table people (name, occupation);");
|
||||||
|
|
||||||
|
PreparedStatement prep = conn.prepareStatement("insert into people values (?, ?);");
|
||||||
|
|
||||||
|
prep.setString(1, "Gandhi");
|
||||||
|
prep.setString(2, "politics");
|
||||||
|
prep.addBatch();
|
||||||
|
prep.setString(1, "Turing");
|
||||||
|
prep.setString(2, "computers");
|
||||||
|
prep.addBatch();
|
||||||
|
prep.setString(1, "Wittgenstein");
|
||||||
|
prep.setString(2, "smartypants");
|
||||||
|
prep.addBatch();
|
||||||
|
|
||||||
|
conn.setAutoCommit(false);
|
||||||
|
prep.executeBatch();
|
||||||
|
conn.setAutoCommit(true);
|
||||||
|
|
||||||
|
|
||||||
|
ResultSet rs = stat.executeQuery("select * from people;");
|
||||||
|
while (rs.next()) {
|
||||||
|
System.out.println("name = " + rs.getString("name"));
|
||||||
|
System.out.println("job = " + rs.getString("occupation"));
|
||||||
|
}
|
||||||
|
rs.close();
|
||||||
|
conn.close();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kr.pe.elex.examples;
|
||||||
3
json-web-token/README.md
Normal file
3
json-web-token/README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# JSON Web Token
|
||||||
|
|
||||||
|
https://github.com/jwtk/jjwt
|
||||||
20
json-web-token/logback.xml
Normal file
20
json-web-token/logback.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Examples for Java
|
||||||
|
~
|
||||||
|
~ Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
~ https://www.elex-project.com/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
|
||||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="TRACE">
|
||||||
|
<appender-ref ref="CONSOLE" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
@@ -11,16 +11,19 @@ import io.jsonwebtoken.*;
|
|||||||
import io.jsonwebtoken.security.InvalidKeyException;
|
import io.jsonwebtoken.security.InvalidKeyException;
|
||||||
import io.jsonwebtoken.security.Keys;
|
import io.jsonwebtoken.security.Keys;
|
||||||
import io.jsonwebtoken.security.SignatureException;
|
import io.jsonwebtoken.security.SignatureException;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
public class JwtSample {
|
public class JwtSample {
|
||||||
private static final byte[] key;
|
private static final byte[] key;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
// HMACSHA256을 사용하므로 키의 길이는 32바이트이다.
|
||||||
key = new byte[32];
|
key = new byte[32];
|
||||||
new Random().nextBytes(key);
|
new Random().nextBytes(key);
|
||||||
}
|
}
|
||||||
@@ -35,16 +38,35 @@ public class JwtSample {
|
|||||||
.compact();
|
.compact();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param token 토큰
|
||||||
|
* @return
|
||||||
|
* @throws UnsupportedJwtException
|
||||||
|
* @throws MalformedJwtException
|
||||||
|
* @throws SignatureException
|
||||||
|
* @throws ExpiredJwtException
|
||||||
|
* @throws MissingClaimException
|
||||||
|
* @throws IncorrectClaimException
|
||||||
|
*/
|
||||||
public static Jws<Claims> parseToken(final String token)
|
public static Jws<Claims> parseToken(final String token)
|
||||||
throws UnsupportedJwtException, MalformedJwtException, SignatureException, ExpiredJwtException {
|
throws UnsupportedJwtException, MalformedJwtException, SignatureException, ExpiredJwtException,
|
||||||
|
MissingClaimException, IncorrectClaimException {
|
||||||
|
|
||||||
return Jwts.parserBuilder()
|
return Jwts.parserBuilder()
|
||||||
.setSigningKey(key)
|
.setSigningKey(key)
|
||||||
|
.requireIssuer("Elex") // 토큰의 Issuer 일치 여부 확인
|
||||||
.build()
|
.build()
|
||||||
.parseClaimsJws(parseHeader(token));
|
.parseClaimsJws(parseHeader(token));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String parseHeader(final String authenticationHeader) {
|
/**
|
||||||
|
* Http 헤더에서 토큰 부분만 추출
|
||||||
|
* @param authenticationHeader http header
|
||||||
|
* @return 토큰 부분만 반환
|
||||||
|
*/
|
||||||
|
private static String parseHeader(final String authenticationHeader)
|
||||||
|
throws MalformedJwtException {
|
||||||
final String[] authentication = authenticationHeader.split(" ");
|
final String[] authentication = authenticationHeader.split(" ");
|
||||||
if (authentication.length == 2 && authentication[0].matches("[bB]earer")) {
|
if (authentication.length == 2 && authentication[0].matches("[bB]earer")) {
|
||||||
return authentication[1];
|
return authentication[1];
|
||||||
@@ -56,11 +78,13 @@ public class JwtSample {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String... args) {
|
public static void main(String... args) {
|
||||||
String token = generateToken();
|
final String token = generateToken();
|
||||||
System.out.println(token);
|
System.out.println(token);
|
||||||
|
|
||||||
String authHeader = "Bearer " + token;
|
final String authHeader = "Bearer " + token;
|
||||||
Jws<Claims> claims = parseToken(authHeader);
|
Jws<Claims> claims = parseToken(authHeader);
|
||||||
System.out.println(claims);
|
System.out.println(claims);
|
||||||
|
final int userId = claims.getBody().get("userId", Integer.class);
|
||||||
|
System.out.println("User Id: " + userId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
15
jsoup/build.gradle.kts
Normal file
15
jsoup/build.gradle.kts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id("elex-java")
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
// https://mvnrepository.com/artifact/org.jsoup/jsoup
|
||||||
|
implementation( "org.jsoup:jsoup:1.13.1")
|
||||||
|
}
|
||||||
20
jsoup/logback.xml
Normal file
20
jsoup/logback.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Examples for Java
|
||||||
|
~
|
||||||
|
~ Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
~ https://www.elex-project.com/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
|
||||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="TRACE">
|
||||||
|
<appender-ref ref="CONSOLE" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kr.pe.elex.examples;
|
||||||
22
jsoup/src/test/java/kr/pe/elex/examples/JsoupTest.java
Normal file
22
jsoup/src/test/java/kr/pe/elex/examples/JsoupTest.java
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kr.pe.elex.examples;
|
||||||
|
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class JsoupTest {
|
||||||
|
@Test
|
||||||
|
void read_url() throws IOException {
|
||||||
|
Document doc = Jsoup.connect("http://example.com/").get();
|
||||||
|
//doc.body().
|
||||||
|
}
|
||||||
|
}
|
||||||
16
logback.xml
16
logback.xml
@@ -7,8 +7,6 @@
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<property name="LOG_FILE" value="LogFile" />
|
|
||||||
<property name="LOG_DIR" value="/var/log/application" />
|
|
||||||
|
|
||||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
<encoder>
|
<encoder>
|
||||||
@@ -16,20 +14,6 @@
|
|||||||
</encoder>
|
</encoder>
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
|
||||||
<file>${LOG_DIR}/${LOG_FILE}.log</file>
|
|
||||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
|
||||||
<!-- daily rollover -->
|
|
||||||
<fileNamePattern>${LOG_DIR}/%d{yyyy/MM}/${LOG_FILE}.gz</fileNamePattern>
|
|
||||||
<!-- keep 30 days' worth of history capped at 3GB total size -->
|
|
||||||
<maxHistory>30</maxHistory>
|
|
||||||
<totalSizeCap>3GB</totalSizeCap>
|
|
||||||
</rollingPolicy>
|
|
||||||
<encoder>
|
|
||||||
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
|
||||||
</encoder>
|
|
||||||
</appender>
|
|
||||||
|
|
||||||
<root level="TRACE">
|
<root level="TRACE">
|
||||||
<appender-ref ref="CONSOLE" />
|
<appender-ref ref="CONSOLE" />
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
20
mockito/logback.xml
Normal file
20
mockito/logback.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Examples for Java
|
||||||
|
~
|
||||||
|
~ Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
~ https://www.elex-project.com/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
|
||||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="TRACE">
|
||||||
|
<appender-ref ref="CONSOLE" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
20
mosquitto/logback.xml
Normal file
20
mosquitto/logback.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Examples for Java
|
||||||
|
~
|
||||||
|
~ Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
~ https://www.elex-project.com/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
|
||||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="TRACE">
|
||||||
|
<appender-ref ref="CONSOLE" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
20
rabbit-mq/logback.xml
Normal file
20
rabbit-mq/logback.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Examples for Java
|
||||||
|
~
|
||||||
|
~ Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
~ https://www.elex-project.com/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
|
||||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="TRACE">
|
||||||
|
<appender-ref ref="CONSOLE" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
@@ -6,8 +6,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
rootProject.name = "java-examples"
|
rootProject.name = "java-examples"
|
||||||
include("json-web-token", "mockito",
|
include(
|
||||||
|
"json-web-token", "mockito",
|
||||||
"mosquitto", "rabbit-mq",
|
"mosquitto", "rabbit-mq",
|
||||||
"ssh",
|
"ssh",
|
||||||
"web-socket-servlet", "web-socket-client",
|
"web-socket-servlet", "web-socket-client",
|
||||||
"thread", "hibernate")
|
"thread", "hibernate", "jdbc-sqlite",
|
||||||
|
"xml", "jackson", "jsoup"
|
||||||
|
)
|
||||||
|
|||||||
20
ssh/logback.xml
Normal file
20
ssh/logback.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Examples for Java
|
||||||
|
~
|
||||||
|
~ Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
~ https://www.elex-project.com/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
|
||||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="TRACE">
|
||||||
|
<appender-ref ref="CONSOLE" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
20
thread/logback.xml
Normal file
20
thread/logback.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Examples for Java
|
||||||
|
~
|
||||||
|
~ Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
~ https://www.elex-project.com/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
|
||||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="TRACE">
|
||||||
|
<appender-ref ref="CONSOLE" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
@@ -13,6 +13,7 @@ import java.time.Duration;
|
|||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.Period;
|
import java.time.Period;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
|
import java.time.temporal.TemporalUnit;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
@@ -27,11 +28,11 @@ public class Sample {
|
|||||||
executor.scheduleAtFixedRate(new Runnable() {
|
executor.scheduleAtFixedRate(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
System.out.println("Hi~");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Duration.between(LocalDateTime.now(), startTime).abs().get(ChronoUnit.MILLIS),
|
Duration.between(LocalDateTime.now(), startTime).abs().toMillis(),
|
||||||
Period.ofDays(1).get(ChronoUnit.MILLIS),
|
Duration.ofDays(1).toMillis(),
|
||||||
TimeUnit.MILLISECONDS);
|
TimeUnit.MILLISECONDS);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
20
web-socket-client/logback.xml
Normal file
20
web-socket-client/logback.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Examples for Java
|
||||||
|
~
|
||||||
|
~ Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
~ https://www.elex-project.com/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
|
||||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="TRACE">
|
||||||
|
<appender-ref ref="CONSOLE" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
20
web-socket-servlet/logback.xml
Normal file
20
web-socket-servlet/logback.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Examples for Java
|
||||||
|
~
|
||||||
|
~ Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
~ https://www.elex-project.com/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
|
||||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="TRACE">
|
||||||
|
<appender-ref ref="CONSOLE" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
14
xml/build.gradle.kts
Normal file
14
xml/build.gradle.kts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id("elex-java")
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
|
||||||
|
}
|
||||||
20
xml/logback.xml
Normal file
20
xml/logback.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ Examples for Java
|
||||||
|
~
|
||||||
|
~ Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
~ https://www.elex-project.com/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
|
||||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="TRACE">
|
||||||
|
<appender-ref ref="CONSOLE" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
73
xml/src/main/java/kr/pe/elex/examples/DOMParser.java
Normal file
73
xml/src/main/java/kr/pe/elex/examples/DOMParser.java
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kr.pe.elex.examples;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.transform.OutputKeys;
|
||||||
|
import javax.xml.transform.Transformer;
|
||||||
|
import javax.xml.transform.TransformerException;
|
||||||
|
import javax.xml.transform.TransformerFactory;
|
||||||
|
import javax.xml.transform.dom.DOMSource;
|
||||||
|
import javax.xml.transform.stream.StreamResult;
|
||||||
|
import java.io.*;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class DOMParser {
|
||||||
|
|
||||||
|
public static Document newDocument() throws ParserConfigurationException {
|
||||||
|
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
||||||
|
DocumentBuilder builder = factory.newDocumentBuilder();
|
||||||
|
return builder.newDocument();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Document parse(final String xml)
|
||||||
|
throws ParserConfigurationException, IOException, SAXException {
|
||||||
|
return parse(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Document parse(final InputStream xml)
|
||||||
|
throws ParserConfigurationException, IOException, SAXException {
|
||||||
|
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
||||||
|
DocumentBuilder builder = factory.newDocumentBuilder();
|
||||||
|
|
||||||
|
return builder.parse(xml);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void toString(Document document, Writer writer) throws TransformerException {
|
||||||
|
TransformerFactory transformerFactory = TransformerFactory.newInstance();
|
||||||
|
Transformer transformer = transformerFactory.newTransformer();
|
||||||
|
DOMSource source = new DOMSource(document);
|
||||||
|
StreamResult result = new StreamResult(writer);
|
||||||
|
transformer.transform(source, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void toString(Document document, OutputStream outputStream) throws TransformerException {
|
||||||
|
toString(document, new OutputStreamWriter(outputStream));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void toString(Document document, Writer writer, int indent) throws TransformerException {
|
||||||
|
TransformerFactory transformerFactory = TransformerFactory.newInstance();
|
||||||
|
Transformer transformer = transformerFactory.newTransformer();
|
||||||
|
|
||||||
|
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
|
||||||
|
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
|
||||||
|
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", String.valueOf(indent));
|
||||||
|
|
||||||
|
DOMSource source = new DOMSource(document);
|
||||||
|
StreamResult result = new StreamResult(writer);
|
||||||
|
transformer.transform(source, result);
|
||||||
|
}
|
||||||
|
}
|
||||||
34
xml/src/main/java/kr/pe/elex/examples/SAXParser.java
Normal file
34
xml/src/main/java/kr/pe/elex/examples/SAXParser.java
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kr.pe.elex.examples;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
import org.xml.sax.helpers.DefaultHandler;
|
||||||
|
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.parsers.SAXParserFactory;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class SAXParser {
|
||||||
|
public static void parse(String xml, DefaultHandler handler)
|
||||||
|
throws ParserConfigurationException, SAXException, IOException {
|
||||||
|
parse(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)), handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void parse(InputStream xml, DefaultHandler handler)
|
||||||
|
throws ParserConfigurationException, SAXException, IOException {
|
||||||
|
SAXParserFactory factory = SAXParserFactory.newInstance();
|
||||||
|
javax.xml.parsers.SAXParser saxParser = factory.newSAXParser();
|
||||||
|
saxParser.parse(xml, handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
65
xml/src/main/java/kr/pe/elex/examples/StAXParser.java
Normal file
65
xml/src/main/java/kr/pe/elex/examples/StAXParser.java
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kr.pe.elex.examples;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
import javax.xml.stream.*;
|
||||||
|
import javax.xml.stream.events.Characters;
|
||||||
|
import javax.xml.stream.events.EndElement;
|
||||||
|
import javax.xml.stream.events.StartElement;
|
||||||
|
import javax.xml.stream.events.XMLEvent;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class StAXParser {
|
||||||
|
|
||||||
|
public static XMLStreamWriter create(OutputStream outputStream) throws XMLStreamException {
|
||||||
|
|
||||||
|
XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance();
|
||||||
|
return xmlOutputFactory.createXMLStreamWriter(outputStream, StandardCharsets.UTF_8.name());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void parse(String xml, Handler handler) throws XMLStreamException {
|
||||||
|
parse(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)), handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void parse(InputStream xml, Handler handler) throws XMLStreamException {
|
||||||
|
XMLInputFactory factory = XMLInputFactory.newInstance();
|
||||||
|
XMLEventReader eventReader =
|
||||||
|
factory.createXMLEventReader(xml);
|
||||||
|
while (eventReader.hasNext()) {
|
||||||
|
XMLEvent event = eventReader.nextEvent();
|
||||||
|
|
||||||
|
if (event.getEventType() == XMLStreamConstants.START_ELEMENT) {
|
||||||
|
StartElement startElement = event.asStartElement();
|
||||||
|
String qName = startElement.getName().getLocalPart();
|
||||||
|
handler.startElement(qName, startElement);
|
||||||
|
} else if (event.getEventType() == XMLStreamConstants.END_ELEMENT) {
|
||||||
|
EndElement endElement = event.asEndElement();
|
||||||
|
String qName = endElement.getName().getLocalPart();
|
||||||
|
handler.endElement(qName, endElement);
|
||||||
|
} else if (event.getEventType() == XMLStreamConstants.CHARACTERS) {
|
||||||
|
Characters characters = event.asCharacters();
|
||||||
|
handler.characters(characters.getData());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface Handler {
|
||||||
|
public void startElement(String qName, StartElement element);
|
||||||
|
|
||||||
|
public void endElement(String qName, EndElement element);
|
||||||
|
|
||||||
|
public void characters(String data);
|
||||||
|
}
|
||||||
|
}
|
||||||
8
xml/src/main/java/kr/pe/elex/examples/package-info.java
Normal file
8
xml/src/main/java/kr/pe/elex/examples/package-info.java
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kr.pe.elex.examples;
|
||||||
69
xml/src/test/java/kr/pe/elex/examples/DOMParserTest.java
Normal file
69
xml/src/test/java/kr/pe/elex/examples/DOMParserTest.java
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kr.pe.elex.examples;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.w3c.dom.Attr;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
import org.w3c.dom.NodeList;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.transform.TransformerException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
class DOMParserTest {
|
||||||
|
/*
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<persons>
|
||||||
|
<person age="11">Charlie</person>
|
||||||
|
<person age="34">Steve</person>
|
||||||
|
</persons>
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
void create() throws ParserConfigurationException, TransformerException {
|
||||||
|
Document document = DOMParser.newDocument();
|
||||||
|
|
||||||
|
Element rootElement = document.createElement("persons");
|
||||||
|
document.appendChild(rootElement);
|
||||||
|
|
||||||
|
Element charlie = document.createElement("person");
|
||||||
|
charlie.setTextContent("Charlie");
|
||||||
|
rootElement.appendChild(charlie);
|
||||||
|
Attr attr = document.createAttribute("age");
|
||||||
|
attr.setValue("11");
|
||||||
|
charlie.setAttributeNode(attr);
|
||||||
|
|
||||||
|
Element steve = document.createElement("person");
|
||||||
|
steve.setTextContent("Steve");
|
||||||
|
rootElement.appendChild(steve);
|
||||||
|
attr = document.createAttribute("age");
|
||||||
|
attr.setValue("34");
|
||||||
|
steve.setAttributeNode(attr);
|
||||||
|
|
||||||
|
StringWriter writer = new StringWriter();
|
||||||
|
DOMParser.toString(document, writer);
|
||||||
|
|
||||||
|
System.out.println(writer.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void parse() throws ParserConfigurationException, IOException, SAXException {
|
||||||
|
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><persons><person age=\"11\">Charlie</person><person age=\"34\">Steve</person></persons>";
|
||||||
|
Document document = DOMParser.parse(xml);
|
||||||
|
|
||||||
|
NodeList nodeList = document.getElementsByTagName("person");
|
||||||
|
for (int i = 0; i < nodeList.getLength(); i++) {
|
||||||
|
System.out.println(nodeList.item(i).getTextContent());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
50
xml/src/test/java/kr/pe/elex/examples/SAXParserTest.java
Normal file
50
xml/src/test/java/kr/pe/elex/examples/SAXParserTest.java
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kr.pe.elex.examples;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
import org.xml.sax.helpers.DefaultHandler;
|
||||||
|
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
class SAXParserTest {
|
||||||
|
static final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><persons><person age=\"11\">Charlie</person><person age=\"34\">Steve</person></persons>";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void parse() throws ParserConfigurationException, IOException, SAXException {
|
||||||
|
SAXParser.parse(xml,new DefaultHandler(){
|
||||||
|
private boolean mark = false;
|
||||||
|
@Override
|
||||||
|
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
|
||||||
|
if (qName.equals("person")) {
|
||||||
|
mark = true;
|
||||||
|
System.out.println("age= " + attributes.getValue("age"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String localName, String qName) throws SAXException {
|
||||||
|
mark = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void characters(char[] ch, int start, int length) throws SAXException {
|
||||||
|
if (mark){
|
||||||
|
System.out.println("Name: " + new String(ch, start, length));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
82
xml/src/test/java/kr/pe/elex/examples/StAXParserTest.java
Normal file
82
xml/src/test/java/kr/pe/elex/examples/StAXParserTest.java
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* Examples for Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021. Elex. All Rights Reserved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kr.pe.elex.examples;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import javax.xml.namespace.QName;
|
||||||
|
import javax.xml.stream.XMLStreamException;
|
||||||
|
import javax.xml.stream.XMLStreamWriter;
|
||||||
|
import javax.xml.stream.events.EndElement;
|
||||||
|
import javax.xml.stream.events.StartElement;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
class StAXParserTest {
|
||||||
|
static final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><persons><person age=\"11\">Charlie</person><person age=\"34\">Steve</person></persons>";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void create() throws XMLStreamException, IOException {
|
||||||
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||||
|
XMLStreamWriter xmlStreamWriter = StAXParser.create(outputStream);
|
||||||
|
|
||||||
|
xmlStreamWriter.writeStartDocument();
|
||||||
|
xmlStreamWriter.writeStartElement("persons");
|
||||||
|
|
||||||
|
xmlStreamWriter.writeStartElement("person");
|
||||||
|
xmlStreamWriter.writeAttribute("age", "11");
|
||||||
|
xmlStreamWriter.writeCharacters("Charlie");
|
||||||
|
xmlStreamWriter.writeEndElement();
|
||||||
|
|
||||||
|
xmlStreamWriter.writeStartElement("person");
|
||||||
|
xmlStreamWriter.writeAttribute("age", "34");
|
||||||
|
xmlStreamWriter.writeCharacters("Steve");
|
||||||
|
xmlStreamWriter.writeEndElement();
|
||||||
|
|
||||||
|
xmlStreamWriter.writeEndElement();
|
||||||
|
xmlStreamWriter.writeEndDocument();
|
||||||
|
|
||||||
|
xmlStreamWriter.flush();
|
||||||
|
xmlStreamWriter.close();
|
||||||
|
|
||||||
|
System.out.println(new String(outputStream.toByteArray(), StandardCharsets.UTF_8));
|
||||||
|
outputStream.close();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void parse() throws XMLStreamException {
|
||||||
|
StAXParser.parse(xml, new StAXParser.Handler() {
|
||||||
|
private boolean mark = false;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String qName, StartElement element) {
|
||||||
|
if (qName.equals("person")) {
|
||||||
|
mark = true;
|
||||||
|
System.out.println("age = " + element
|
||||||
|
.getAttributeByName(new QName("age")).getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String qName, EndElement element) {
|
||||||
|
mark = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void characters(String data) {
|
||||||
|
if (mark) {
|
||||||
|
System.out.println("Name: " + data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user