From a69e814fdbbb886d7fc50f2f09e022b1f39fc27e Mon Sep 17 00:00:00 2001 From: Elex Date: Thu, 5 Aug 2021 17:59:24 +0900 Subject: [PATCH] 2021-08-05 --- .gitignore | 1 + buildSrc/src/main/kotlin/elex-base.gradle.kts | 2 +- hibernate/logback.xml | 20 +++++ jackson/build.gradle.kts | 18 ++++ jackson/logback.xml | 20 +++++ .../main/java/kr/pe/elex/examples/Person.java | 27 ++++++ .../kr/pe/elex/examples/package-info.java | 8 ++ .../kr/pe/elex/examples/JacksonCsvTest.java | 61 ++++++++++++++ .../kr/pe/elex/examples/JacksonXmlTest.java | 40 +++++++++ .../kr/pe/elex/examples/JacksonYamlTest.java | 34 ++++++++ jackson/test.csv | 4 + jackson/test.xml | 5 ++ jackson/test.yaml | 4 + jdbc-sqlite/build.gradle.kts | 15 ++++ jdbc-sqlite/logback.xml | 20 +++++ .../java/kr/pe/elex/examples/JdbcSample.java | 49 +++++++++++ .../kr/pe/elex/examples/package-info.java | 8 ++ json-web-token/README.md | 3 + json-web-token/logback.xml | 20 +++++ .../java/kr/pe/elex/examples/JwtSample.java | 32 +++++++- jsoup/build.gradle.kts | 15 ++++ jsoup/logback.xml | 20 +++++ .../kr/pe/elex/examples/package-info.java | 8 ++ .../java/kr/pe/elex/examples/JsoupTest.java | 22 +++++ logback.xml | 16 ---- mockito/logback.xml | 20 +++++ mosquitto/logback.xml | 20 +++++ rabbit-mq/logback.xml | 20 +++++ settings.gradle.kts | 11 ++- ssh/logback.xml | 20 +++++ thread/logback.xml | 20 +++++ .../main/java/kr/pe/elex/examples/Sample.java | 7 +- web-socket-client/logback.xml | 20 +++++ web-socket-servlet/logback.xml | 20 +++++ xml/build.gradle.kts | 14 ++++ xml/logback.xml | 20 +++++ .../java/kr/pe/elex/examples/DOMParser.java | 73 +++++++++++++++++ .../java/kr/pe/elex/examples/SAXParser.java | 34 ++++++++ .../java/kr/pe/elex/examples/StAXParser.java | 65 +++++++++++++++ .../kr/pe/elex/examples/package-info.java | 8 ++ .../kr/pe/elex/examples/DOMParserTest.java | 69 ++++++++++++++++ .../kr/pe/elex/examples/SAXParserTest.java | 50 +++++++++++ .../kr/pe/elex/examples/StAXParserTest.java | 82 +++++++++++++++++++ 43 files changed, 1017 insertions(+), 28 deletions(-) create mode 100644 hibernate/logback.xml create mode 100644 jackson/build.gradle.kts create mode 100644 jackson/logback.xml create mode 100644 jackson/src/main/java/kr/pe/elex/examples/Person.java create mode 100644 jackson/src/main/java/kr/pe/elex/examples/package-info.java create mode 100644 jackson/src/test/java/kr/pe/elex/examples/JacksonCsvTest.java create mode 100644 jackson/src/test/java/kr/pe/elex/examples/JacksonXmlTest.java create mode 100644 jackson/src/test/java/kr/pe/elex/examples/JacksonYamlTest.java create mode 100644 jackson/test.csv create mode 100644 jackson/test.xml create mode 100644 jackson/test.yaml create mode 100644 jdbc-sqlite/build.gradle.kts create mode 100644 jdbc-sqlite/logback.xml create mode 100644 jdbc-sqlite/src/main/java/kr/pe/elex/examples/JdbcSample.java create mode 100644 jdbc-sqlite/src/main/java/kr/pe/elex/examples/package-info.java create mode 100644 json-web-token/README.md create mode 100644 json-web-token/logback.xml create mode 100644 jsoup/build.gradle.kts create mode 100644 jsoup/logback.xml create mode 100644 jsoup/src/main/java/kr/pe/elex/examples/package-info.java create mode 100644 jsoup/src/test/java/kr/pe/elex/examples/JsoupTest.java create mode 100644 mockito/logback.xml create mode 100644 mosquitto/logback.xml create mode 100644 rabbit-mq/logback.xml create mode 100644 ssh/logback.xml create mode 100644 thread/logback.xml create mode 100644 web-socket-client/logback.xml create mode 100644 web-socket-servlet/logback.xml create mode 100644 xml/build.gradle.kts create mode 100644 xml/logback.xml create mode 100644 xml/src/main/java/kr/pe/elex/examples/DOMParser.java create mode 100644 xml/src/main/java/kr/pe/elex/examples/SAXParser.java create mode 100644 xml/src/main/java/kr/pe/elex/examples/StAXParser.java create mode 100644 xml/src/main/java/kr/pe/elex/examples/package-info.java create mode 100644 xml/src/test/java/kr/pe/elex/examples/DOMParserTest.java create mode 100644 xml/src/test/java/kr/pe/elex/examples/SAXParserTest.java create mode 100644 xml/src/test/java/kr/pe/elex/examples/StAXParserTest.java 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); + } + } + }); + } +}