Skip to content

Commit

Permalink
Converts command supports pipeline
Browse files Browse the repository at this point in the history
  • Loading branch information
cofcool committed Jan 17, 2023
1 parent 117826a commit 713388b
Show file tree
Hide file tree
Showing 7 changed files with 247 additions and 60 deletions.
2 changes: 1 addition & 1 deletion src/main/java/net/cofcool/toolbox/ToolName.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package net.cofcool.toolbox;

public enum ToolName {
trelloLogseqImporter, shell, link2Tool, converts
trelloLogseqImporter, shell, link2Tool, kindle, converts
}
213 changes: 154 additions & 59 deletions src/main/java/net/cofcool/toolbox/internal/Converts.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,37 @@
package net.cofcool.toolbox.internal;

import java.lang.reflect.Modifier;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TimeZone;
import java.util.stream.Collectors;
import net.cofcool.toolbox.Tool;
import net.cofcool.toolbox.ToolName;

@SuppressWarnings("ALL")
public class Converts implements Tool {

private final Map<String, Pipeline> pipelineMap = new LinkedHashMap<>();

public Converts() {
for (Class<?> clazz : getClass().getDeclaredClasses()) {
if (!Modifier.isAbstract(clazz.getModifiers()) && Pipeline.class.isAssignableFrom(clazz)) {
try {
pipelineMap.put(clazz.getSimpleName().toLowerCase(), (Pipeline)(clazz.getDeclaredConstructor(getClass()).newInstance(this)));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}

@Override
public ToolName name() {
return ToolName.converts;
Expand All @@ -23,92 +41,169 @@ public ToolName name() {
@Override
public void run(Args args) throws Exception {
var arg = args.readArg("cmd").get();
var split = arg.val().split(" ");

var pipelineArgs = Arrays.asList(arg.val().split("\\|")).iterator();
if (!pipelineArgs.hasNext()) {
throw new IllegalArgumentException("Command args not be found");
}

String ret = runCommand(pipelineArgs.next(), null);
while (pipelineArgs.hasNext()) {
ret = runCommand(pipelineArgs.next(), ret);
}

System.out.println(ret);
}

private String runCommand(String arg, String ret) throws Exception {
var split = arg.trim().split(" ");
var cmd = split[0];

String val = null;
if (split.length > 1) {
val = String.join(" ", Arrays.copyOfRange(split, 1, split.length)).trim();
}

var ret = switch (cmd) {
case "md5" -> md5(val);
case "kindle" -> splitKindleClippings(val);
case "upper" -> val.toUpperCase();
case "lower" -> val.toLowerCase();
case "hdate" -> hdate(val);
case "timesp" -> timesp(val);
case "now" -> System.currentTimeMillis() + "";
case "replace" -> replace(val);
default -> throw new IllegalArgumentException("do not support " + val);
};
System.out.println(ret);
Pipeline pipelineCmd = pipelineMap.get(cmd);
if (pipelineCmd == null) {
throw new IllegalArgumentException("Do not support " + cmd);
}

return pipelineCmd.run(ret == null ? val : ret + (val == null ? "" : " " + val));
}

private String timesp(String val) {
return DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS").parse(val, LocalDateTime::from).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() + "";
private interface Pipeline {

String run(String args) throws Exception;

String demo();

}

private String replace(String val) {
String[] split = val.split(" ");
return split[0].replace(split[1], split[2]);
private class Timesp implements Pipeline {

@Override
public String run(String args) {
return DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")
.parse(args, LocalDateTime::from).atZone(ZoneId.systemDefault()).toInstant()
.toEpochMilli() + "";
}

@Override
public String demo() {
return "2011-11-11 11:11:11.123";
}
}

private String hdate(String val) {
return DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS").format(LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(val)), TimeZone.getDefault().toZoneId()));
private class Replace implements Pipeline {

@Override
public String run(String args) {
String[] split = args.split(" ");
return split[0].replace(split[1], split[2]);
}

@Override
public String demo() {
return "test . _";
}
}

private String md5(String val) throws Exception {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update(val.getBytes(StandardCharsets.UTF_8));
private class Now implements Pipeline {

byte[] byteArray = messageDigest.digest();
@Override
public String run(String args) throws Exception {
return System.currentTimeMillis() + "";
}

StringBuilder md5StrBuff = new StringBuilder();
@Override
public String demo() {
return "";
}
}

for (byte b : byteArray) {
if (Integer.toHexString(0xFF & b).length() == 1) {
md5StrBuff.append("0").append(Integer.toHexString(0xFF & b));
} else {
md5StrBuff.append(Integer.toHexString(0xFF & b));
}
private class Upper implements Pipeline {

@Override
public String run(String args) throws Exception {
return args.toUpperCase();
}

@Override
public String demo() {
return "test";
}
}

private class Lower implements Pipeline {

@Override
public String run(String args) throws Exception {
return args.toLowerCase();
}

@Override
public String demo() {
return "test";
}
}

private class Hdate implements Pipeline {

@Override
public String run(String args) {
return DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")
.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(args)), TimeZone.getDefault().toZoneId()));
}

return md5StrBuff.toString();
@Override
public String demo() {
return "1231312321";
}
}

private String splitKindleClippings(String path) {
return Arrays
.stream(path.split("=========="))
.map(s -> {
String[] split = s.split("\n");
var bookName = "";
var content = "";
if (split.length == 5) {
bookName = split[0];
content = split[3];
private class Md5 implements Pipeline {

@Override
public String run(String args) throws Exception{
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update(args.getBytes(StandardCharsets.UTF_8));

byte[] byteArray = messageDigest.digest();

StringBuilder md5StrBuff = new StringBuilder();

for (byte b : byteArray) {
if (Integer.toHexString(0xFF & b).length() == 1) {
md5StrBuff.append("0").append(Integer.toHexString(0xFF & b));
} else {
bookName = split[1];
content = split[4];
md5StrBuff.append(Integer.toHexString(0xFF & b));
}
return String.format("### %s\n\n%s\n\n", bookName, content);
})
.collect(Collectors.joining());
}

return md5StrBuff.toString();
}

@Override
public String demo() {
return "demo";
}
}


@Override
public String help() {
return """
--cmd=xxx
commands:
* md5 xxx
* kindle xxxx.txt
* upper/lower xxx
* hdate 1231312321
* timesp 2011-11-11 11:11:11.123
* now
* replace test . _
""";
return String.format(
"""
--cmd=xxx
commands:
%s
""",
pipelineMap.entrySet().stream()
.map(a -> "* " + a.getKey() + " " + a.getValue().demo())
.collect(Collectors.joining("\n"))
);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package net.cofcool.toolbox.internal;

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.stream.Collectors;
import net.cofcool.toolbox.Tool;
import net.cofcool.toolbox.ToolName;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;

public class SplitKindleClippings implements Tool {
@Override
public ToolName name() {
return ToolName.kindle;
}

@Override
public void run(Args args) throws Exception {
var path = args.readArg("path").get().val();
var out = args.readArg("out").orElse(new Arg("", FilenameUtils.getBaseName(path) + ".md")).val();
var fileContent = FileUtils.readFileToString(new File(path), StandardCharsets.UTF_8);
String strs = Arrays
.stream(fileContent.split("=========="))
.map(s -> {
String[] split = s.split("\n");
var bookName = "";
var content = "";
if (split.length == 5) {
bookName = split[0];
content = split[3];
} else {
bookName = split[1];
content = split[4];
}
return String.format("### %s\n\n%s\n\n", bookName, content);
})
.collect(Collectors.joining());
System.out.println("Write file to " + out);
FileUtils.writeStringToFile(new File(out), strs, StandardCharsets.UTF_8);
}

@Override
public String help() {
return "--path=kindle.txt --out=kindle.md";
}
}
5 changes: 5 additions & 0 deletions src/test/java/net/cofcool/toolbox/internal/ConvertsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ class ConvertsTest {

final Converts converts = new Converts();

@Test
void runPipeline() throws Exception {
converts.run(new Args().arg("cmd", "md5 xxxxx | upper | replace B a | lower"));
}

@Test
void run() throws Exception {
System.out.println(converts.help());
Expand Down
12 changes: 12 additions & 0 deletions src/test/java/net/cofcool/toolbox/internal/ShellStarterTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package net.cofcool.toolbox.internal;

import net.cofcool.toolbox.Tool.Args;
import org.junit.jupiter.api.Test;

class ShellStarterTest {

@Test
void run() throws Exception {
new ShellStarter().run(new Args().arg("cmd", "git log 1.0.1..1.0.2 --oneline"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package net.cofcool.toolbox.internal;

import java.net.URL;
import net.cofcool.toolbox.Tool;
import org.junit.jupiter.api.Test;

class SplitKindleClippingsTest {

@Test
void run() throws Exception {
URL resource = SplitKindleClippings.class.getResource("/splitKindleClippingsTest.txt");
new SplitKindleClippings().run(new Tool.Args().arg("path", resource.toString().substring(5)).arg("out", "./target/splitKindleClippingsTest.md"));
}

}
13 changes: 13 additions & 0 deletions src/test/resources/splitKindleClippingsTest.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
asda
dsf
sdfds
dsfdsf
sdfs
sfsdf
==========
asda
dsf
sdfds
dsfdsf
sdfs
==========

0 comments on commit 713388b

Please sign in to comment.