diff --git a/.gitignore b/.gitignore
index 3ae393a..9c247f1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@
/.idea/
/build/
/**/build/**
+/test.db
diff --git a/buildSrc/src/main/kotlin/elex-base.gradle.kts b/buildSrc/src/main/kotlin/elex-base.gradle.kts
index faab476..c9fc6db 100644
--- a/buildSrc/src/main/kotlin/elex-base.gradle.kts
+++ b/buildSrc/src/main/kotlin/elex-base.gradle.kts
@@ -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")
}
diff --git a/hibernate/logback.xml b/hibernate/logback.xml
new file mode 100644
index 0000000..74ff8a3
--- /dev/null
+++ b/hibernate/logback.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/jackson/build.gradle.kts b/jackson/build.gradle.kts
new file mode 100644
index 0000000..1255d32
--- /dev/null
+++ b/jackson/build.gradle.kts
@@ -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")
+}
diff --git a/jackson/logback.xml b/jackson/logback.xml
new file mode 100644
index 0000000..74ff8a3
--- /dev/null
+++ b/jackson/logback.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/jackson/src/main/java/kr/pe/elex/examples/Person.java b/jackson/src/main/java/kr/pe/elex/examples/Person.java
new file mode 100644
index 0000000..b90686c
--- /dev/null
+++ b/jackson/src/main/java/kr/pe/elex/examples/Person.java
@@ -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;
+}
diff --git a/jackson/src/main/java/kr/pe/elex/examples/package-info.java b/jackson/src/main/java/kr/pe/elex/examples/package-info.java
new file mode 100644
index 0000000..bfb14b8
--- /dev/null
+++ b/jackson/src/main/java/kr/pe/elex/examples/package-info.java
@@ -0,0 +1,8 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
diff --git a/jackson/src/test/java/kr/pe/elex/examples/JacksonCsvTest.java b/jackson/src/test/java/kr/pe/elex/examples/JacksonCsvTest.java
new file mode 100644
index 0000000..3ece132
--- /dev/null
+++ b/jackson/src/test/java/kr/pe/elex/examples/JacksonCsvTest.java
@@ -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 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 iterator = mapper.readerFor(Person.class)
+ .with(schema)
+ .readValues(new File("test.csv"));
+ while(iterator.hasNext()){
+ System.out.println(iterator.next());
+ }
+
+ }
+}
diff --git a/jackson/src/test/java/kr/pe/elex/examples/JacksonXmlTest.java b/jackson/src/test/java/kr/pe/elex/examples/JacksonXmlTest.java
new file mode 100644
index 0000000..5bddec5
--- /dev/null
+++ b/jackson/src/test/java/kr/pe/elex/examples/JacksonXmlTest.java
@@ -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);
+ }
+}
diff --git a/jackson/src/test/java/kr/pe/elex/examples/JacksonYamlTest.java b/jackson/src/test/java/kr/pe/elex/examples/JacksonYamlTest.java
new file mode 100644
index 0000000..81536e2
--- /dev/null
+++ b/jackson/src/test/java/kr/pe/elex/examples/JacksonYamlTest.java
@@ -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);
+ }
+}
diff --git a/jackson/test.csv b/jackson/test.csv
new file mode 100644
index 0000000..c3c9b95
--- /dev/null
+++ b/jackson/test.csv
@@ -0,0 +1,4 @@
+name,age,male
+Charlie,11,true
+Steve,34,true
+Jane,22,false
diff --git a/jackson/test.xml b/jackson/test.xml
new file mode 100644
index 0000000..5d887fa
--- /dev/null
+++ b/jackson/test.xml
@@ -0,0 +1,5 @@
+
+ Charlie
+ 11
+ true
+
diff --git a/jackson/test.yaml b/jackson/test.yaml
new file mode 100644
index 0000000..a8f4861
--- /dev/null
+++ b/jackson/test.yaml
@@ -0,0 +1,4 @@
+---
+name: "Charlie"
+age: 11
+male: true
diff --git a/jdbc-sqlite/build.gradle.kts b/jdbc-sqlite/build.gradle.kts
new file mode 100644
index 0000000..6724a4b
--- /dev/null
+++ b/jdbc-sqlite/build.gradle.kts
@@ -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")
+}
diff --git a/jdbc-sqlite/logback.xml b/jdbc-sqlite/logback.xml
new file mode 100644
index 0000000..74ff8a3
--- /dev/null
+++ b/jdbc-sqlite/logback.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/jdbc-sqlite/src/main/java/kr/pe/elex/examples/JdbcSample.java b/jdbc-sqlite/src/main/java/kr/pe/elex/examples/JdbcSample.java
new file mode 100644
index 0000000..5af9e16
--- /dev/null
+++ b/jdbc-sqlite/src/main/java/kr/pe/elex/examples/JdbcSample.java
@@ -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();
+
+ }
+}
diff --git a/jdbc-sqlite/src/main/java/kr/pe/elex/examples/package-info.java b/jdbc-sqlite/src/main/java/kr/pe/elex/examples/package-info.java
new file mode 100644
index 0000000..bfb14b8
--- /dev/null
+++ b/jdbc-sqlite/src/main/java/kr/pe/elex/examples/package-info.java
@@ -0,0 +1,8 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
diff --git a/json-web-token/README.md b/json-web-token/README.md
new file mode 100644
index 0000000..2006cf1
--- /dev/null
+++ b/json-web-token/README.md
@@ -0,0 +1,3 @@
+# JSON Web Token
+
+https://github.com/jwtk/jjwt
diff --git a/json-web-token/logback.xml b/json-web-token/logback.xml
new file mode 100644
index 0000000..74ff8a3
--- /dev/null
+++ b/json-web-token/logback.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/json-web-token/src/main/java/kr/pe/elex/examples/JwtSample.java b/json-web-token/src/main/java/kr/pe/elex/examples/JwtSample.java
index 757ffd5..76b255f 100644
--- a/json-web-token/src/main/java/kr/pe/elex/examples/JwtSample.java
+++ b/json-web-token/src/main/java/kr/pe/elex/examples/JwtSample.java
@@ -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 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 = parseToken(authHeader);
System.out.println(claims);
+ final int userId = claims.getBody().get("userId", Integer.class);
+ System.out.println("User Id: " + userId);
}
}
diff --git a/jsoup/build.gradle.kts b/jsoup/build.gradle.kts
new file mode 100644
index 0000000..25d4cdb
--- /dev/null
+++ b/jsoup/build.gradle.kts
@@ -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")
+}
diff --git a/jsoup/logback.xml b/jsoup/logback.xml
new file mode 100644
index 0000000..74ff8a3
--- /dev/null
+++ b/jsoup/logback.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/jsoup/src/main/java/kr/pe/elex/examples/package-info.java b/jsoup/src/main/java/kr/pe/elex/examples/package-info.java
new file mode 100644
index 0000000..bfb14b8
--- /dev/null
+++ b/jsoup/src/main/java/kr/pe/elex/examples/package-info.java
@@ -0,0 +1,8 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
diff --git a/jsoup/src/test/java/kr/pe/elex/examples/JsoupTest.java b/jsoup/src/test/java/kr/pe/elex/examples/JsoupTest.java
new file mode 100644
index 0000000..a419352
--- /dev/null
+++ b/jsoup/src/test/java/kr/pe/elex/examples/JsoupTest.java
@@ -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().
+ }
+}
diff --git a/logback.xml b/logback.xml
index 294b921..74ff8a3 100644
--- a/logback.xml
+++ b/logback.xml
@@ -7,8 +7,6 @@
-->
-
-
@@ -16,20 +14,6 @@
-
- ${LOG_DIR}/${LOG_FILE}.log
-
-
- ${LOG_DIR}/%d{yyyy/MM}/${LOG_FILE}.gz
-
- 30
- 3GB
-
-
- %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
-
-
-
diff --git a/mockito/logback.xml b/mockito/logback.xml
new file mode 100644
index 0000000..74ff8a3
--- /dev/null
+++ b/mockito/logback.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/mosquitto/logback.xml b/mosquitto/logback.xml
new file mode 100644
index 0000000..74ff8a3
--- /dev/null
+++ b/mosquitto/logback.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/rabbit-mq/logback.xml b/rabbit-mq/logback.xml
new file mode 100644
index 0000000..74ff8a3
--- /dev/null
+++ b/rabbit-mq/logback.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 033525d..2ac79c1 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -6,8 +6,11 @@
*/
rootProject.name = "java-examples"
-include("json-web-token", "mockito",
-"mosquitto", "rabbit-mq",
+include(
+ "json-web-token", "mockito",
+ "mosquitto", "rabbit-mq",
"ssh",
- "web-socket-servlet","web-socket-client",
- "thread", "hibernate")
+ "web-socket-servlet", "web-socket-client",
+ "thread", "hibernate", "jdbc-sqlite",
+ "xml", "jackson", "jsoup"
+)
diff --git a/ssh/logback.xml b/ssh/logback.xml
new file mode 100644
index 0000000..74ff8a3
--- /dev/null
+++ b/ssh/logback.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/thread/logback.xml b/thread/logback.xml
new file mode 100644
index 0000000..74ff8a3
--- /dev/null
+++ b/thread/logback.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/thread/src/main/java/kr/pe/elex/examples/Sample.java b/thread/src/main/java/kr/pe/elex/examples/Sample.java
index 4a3bbb9..f697c70 100644
--- a/thread/src/main/java/kr/pe/elex/examples/Sample.java
+++ b/thread/src/main/java/kr/pe/elex/examples/Sample.java
@@ -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);
}
diff --git a/web-socket-client/logback.xml b/web-socket-client/logback.xml
new file mode 100644
index 0000000..74ff8a3
--- /dev/null
+++ b/web-socket-client/logback.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/web-socket-servlet/logback.xml b/web-socket-servlet/logback.xml
new file mode 100644
index 0000000..74ff8a3
--- /dev/null
+++ b/web-socket-servlet/logback.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/xml/build.gradle.kts b/xml/build.gradle.kts
new file mode 100644
index 0000000..d2aab59
--- /dev/null
+++ b/xml/build.gradle.kts
@@ -0,0 +1,14 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+plugins {
+ id("elex-java")
+}
+
+dependencies {
+
+}
diff --git a/xml/logback.xml b/xml/logback.xml
new file mode 100644
index 0000000..74ff8a3
--- /dev/null
+++ b/xml/logback.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/xml/src/main/java/kr/pe/elex/examples/DOMParser.java b/xml/src/main/java/kr/pe/elex/examples/DOMParser.java
new file mode 100644
index 0000000..2b1988f
--- /dev/null
+++ b/xml/src/main/java/kr/pe/elex/examples/DOMParser.java
@@ -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);
+ }
+}
diff --git a/xml/src/main/java/kr/pe/elex/examples/SAXParser.java b/xml/src/main/java/kr/pe/elex/examples/SAXParser.java
new file mode 100644
index 0000000..f2fa35f
--- /dev/null
+++ b/xml/src/main/java/kr/pe/elex/examples/SAXParser.java
@@ -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);
+ }
+}
diff --git a/xml/src/main/java/kr/pe/elex/examples/StAXParser.java b/xml/src/main/java/kr/pe/elex/examples/StAXParser.java
new file mode 100644
index 0000000..565b5eb
--- /dev/null
+++ b/xml/src/main/java/kr/pe/elex/examples/StAXParser.java
@@ -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);
+ }
+}
diff --git a/xml/src/main/java/kr/pe/elex/examples/package-info.java b/xml/src/main/java/kr/pe/elex/examples/package-info.java
new file mode 100644
index 0000000..bfb14b8
--- /dev/null
+++ b/xml/src/main/java/kr/pe/elex/examples/package-info.java
@@ -0,0 +1,8 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
diff --git a/xml/src/test/java/kr/pe/elex/examples/DOMParserTest.java b/xml/src/test/java/kr/pe/elex/examples/DOMParserTest.java
new file mode 100644
index 0000000..89af279
--- /dev/null
+++ b/xml/src/test/java/kr/pe/elex/examples/DOMParserTest.java
@@ -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 {
+ /*
+
+
+ Charlie
+ Steve
+
+ */
+ @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 = "CharlieSteve";
+ 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());
+ }
+ }
+}
diff --git a/xml/src/test/java/kr/pe/elex/examples/SAXParserTest.java b/xml/src/test/java/kr/pe/elex/examples/SAXParserTest.java
new file mode 100644
index 0000000..3355c6c
--- /dev/null
+++ b/xml/src/test/java/kr/pe/elex/examples/SAXParserTest.java
@@ -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 = "CharlieSteve";
+
+ @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));
+ }
+ }
+ });
+ }
+}
diff --git a/xml/src/test/java/kr/pe/elex/examples/StAXParserTest.java b/xml/src/test/java/kr/pe/elex/examples/StAXParserTest.java
new file mode 100644
index 0000000..0107cde
--- /dev/null
+++ b/xml/src/test/java/kr/pe/elex/examples/StAXParserTest.java
@@ -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 = "CharlieSteve";
+
+ @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);
+ }
+ }
+ });
+ }
+}