2021-08-05
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,3 +4,4 @@
|
||||
/.idea/
|
||||
/build/
|
||||
/**/build/**
|
||||
/test.db
|
||||
|
||||
@@ -77,7 +77,7 @@ dependencies {
|
||||
annotationProcessor("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")
|
||||
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.Keys;
|
||||
import io.jsonwebtoken.security.SignatureException;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.Date;
|
||||
import java.util.Random;
|
||||
|
||||
@Slf4j
|
||||
public class JwtSample {
|
||||
private static final byte[] key;
|
||||
|
||||
static {
|
||||
// HMACSHA256을 사용하므로 키의 길이는 32바이트이다.
|
||||
key = new byte[32];
|
||||
new Random().nextBytes(key);
|
||||
}
|
||||
@@ -35,16 +38,35 @@ public class JwtSample {
|
||||
.compact();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param token 토큰
|
||||
* @return
|
||||
* @throws UnsupportedJwtException
|
||||
* @throws MalformedJwtException
|
||||
* @throws SignatureException
|
||||
* @throws ExpiredJwtException
|
||||
* @throws MissingClaimException
|
||||
* @throws IncorrectClaimException
|
||||
*/
|
||||
public static Jws<Claims> parseToken(final String token)
|
||||
throws UnsupportedJwtException, MalformedJwtException, SignatureException, ExpiredJwtException {
|
||||
throws UnsupportedJwtException, MalformedJwtException, SignatureException, ExpiredJwtException,
|
||||
MissingClaimException, IncorrectClaimException {
|
||||
|
||||
return Jwts.parserBuilder()
|
||||
.setSigningKey(key)
|
||||
.requireIssuer("Elex") // 토큰의 Issuer 일치 여부 확인
|
||||
.build()
|
||||
.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(" ");
|
||||
if (authentication.length == 2 && authentication[0].matches("[bB]earer")) {
|
||||
return authentication[1];
|
||||
@@ -56,11 +78,13 @@ public class JwtSample {
|
||||
}
|
||||
|
||||
public static void main(String... args) {
|
||||
String token = generateToken();
|
||||
final String token = generateToken();
|
||||
System.out.println(token);
|
||||
|
||||
String authHeader = "Bearer " + token;
|
||||
final String authHeader = "Bearer " + token;
|
||||
Jws<Claims> claims = parseToken(authHeader);
|
||||
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>
|
||||
<property name="LOG_FILE" value="LogFile" />
|
||||
<property name="LOG_DIR" value="/var/log/application" />
|
||||
|
||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
@@ -16,20 +14,6 @@
|
||||
</encoder>
|
||||
</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">
|
||||
<appender-ref ref="CONSOLE" />
|
||||
</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"
|
||||
include("json-web-token", "mockito",
|
||||
include(
|
||||
"json-web-token", "mockito",
|
||||
"mosquitto", "rabbit-mq",
|
||||
"ssh",
|
||||
"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.Period;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.time.temporal.TemporalUnit;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
@@ -27,11 +28,11 @@ public class Sample {
|
||||
executor.scheduleAtFixedRate(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
System.out.println("Hi~");
|
||||
}
|
||||
},
|
||||
Duration.between(LocalDateTime.now(), startTime).abs().get(ChronoUnit.MILLIS),
|
||||
Period.ofDays(1).get(ChronoUnit.MILLIS),
|
||||
Duration.between(LocalDateTime.now(), startTime).abs().toMillis(),
|
||||
Duration.ofDays(1).toMillis(),
|
||||
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