From d8b843f1c68a5c24be73f3ba2f77ecdfb7fa6d63 Mon Sep 17 00:00:00 2001 From: earayu Date: Thu, 27 Sep 2018 14:59:41 +0800 Subject: [PATCH] bugfix --- .../taobao/arthas/core/util/TokenUtils.java | 38 +++++- .../arthas/core/util/TokenUtilsTest.java | 126 ++++++++++++++++++ 2 files changed, 157 insertions(+), 7 deletions(-) create mode 100644 core/src/test/java/com/taobao/arthas/core/util/TokenUtilsTest.java diff --git a/core/src/main/java/com/taobao/arthas/core/util/TokenUtils.java b/core/src/main/java/com/taobao/arthas/core/util/TokenUtils.java index e4159e806..b2cb89c3b 100644 --- a/core/src/main/java/com/taobao/arthas/core/util/TokenUtils.java +++ b/core/src/main/java/com/taobao/arthas/core/util/TokenUtils.java @@ -1,20 +1,27 @@ package com.taobao.arthas.core.util; import java.util.List; - import com.taobao.arthas.core.shell.cli.CliToken; /** - * tokens处理的辅助类 + * tokenizer helper * - * @author gehui 2017年7月27日 上午11:39:56 + * @author gehui 2017-07-27 11:39:56 */ public class TokenUtils { + /** + * find the first text token + * @param tokens + * @return + */ public static CliToken findFirstTextToken(List tokens) { + if(tokens==null || tokens.isEmpty()){ + return null; + } CliToken first = null; for (CliToken token : tokens) { - if (token.isText()) { + if (token!=null && token.isText()) { first = token; break; } @@ -22,20 +29,37 @@ public class TokenUtils { return first; } + /** + * find the last text token + * @param tokens + * @return + */ public static CliToken findLastTextToken(List tokens) { - for (int i = tokens.size() - 1; i > 0; i--) { + if(tokens==null || tokens.isEmpty()){ + return null; + } + //#165 + for (int i = tokens.size() - 1; i >= 0; i--) { CliToken token = tokens.get(i); - if (token.isText()) { + if (token!=null && token.isText()) { return token; } } return null; } + /** + * find the second text token's text + * @param tokens + * @return + */ public static String findSecondTokenText(List tokens) { + if(tokens==null || tokens.isEmpty()){ + return null; + } boolean first = true; for (CliToken token : tokens) { - if (token.isText()) { + if (token!=null && token.isText()) { if (first) { first = false; } else { diff --git a/core/src/test/java/com/taobao/arthas/core/util/TokenUtilsTest.java b/core/src/test/java/com/taobao/arthas/core/util/TokenUtilsTest.java new file mode 100644 index 000000000..4da98be29 --- /dev/null +++ b/core/src/test/java/com/taobao/arthas/core/util/TokenUtilsTest.java @@ -0,0 +1,126 @@ +package com.taobao.arthas.core.util; + +import com.taobao.arthas.core.shell.cli.CliToken; +import com.taobao.arthas.core.shell.cli.impl.CliTokenImpl; +import org.junit.Assert; +import org.junit.Test; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @author earayu + */ +public class TokenUtilsTest { + + private List newCliTokenList(CliToken ... tokens){ + List cliTokens = new ArrayList(); + if(tokens!=null) { + Collections.addAll(cliTokens, tokens); + } + return cliTokens; + } + + @Test + public void testFindFirstTextToken(){ + CliToken textCliToken = new CliTokenImpl(true,"textCliToken"); + CliToken nonTextCliToken = new CliTokenImpl(false,"nonTextCliToken"); + + //null list + Assert.assertEquals(null, TokenUtils.findFirstTextToken(null)); + + //empty list + Assert.assertEquals(null, TokenUtils.findFirstTextToken(new ArrayList())); + + //list with null value + Assert.assertEquals(null, + TokenUtils.findFirstTextToken(newCliTokenList(new CliToken[]{null}))); + Assert.assertEquals(textCliToken, + TokenUtils.findFirstTextToken(newCliTokenList(new CliToken[]{null, textCliToken}))); + Assert.assertEquals(textCliToken, + TokenUtils.findFirstTextToken(newCliTokenList(new CliToken[]{null, nonTextCliToken, textCliToken}))); + Assert.assertEquals(textCliToken, + TokenUtils.findFirstTextToken(newCliTokenList(new CliToken[]{nonTextCliToken, null, textCliToken}))); + + //list with normal inputs + Assert.assertEquals(textCliToken, + TokenUtils.findFirstTextToken(newCliTokenList(new CliToken[]{textCliToken}))); + Assert.assertEquals(textCliToken, + TokenUtils.findFirstTextToken(newCliTokenList(new CliToken[]{nonTextCliToken, textCliToken}))); + Assert.assertEquals(textCliToken, + TokenUtils.findFirstTextToken(newCliTokenList(new CliToken[]{textCliToken, nonTextCliToken}))); + + } + + + + @Test + public void testFindLastTextToken(){ + CliToken textCliToken = new CliTokenImpl(true,"textCliToken"); + CliToken nonTextCliToken = new CliTokenImpl(false,"nonTextCliToken"); + + //null list + Assert.assertEquals(null, TokenUtils.findLastTextToken(null)); + + //empty list + Assert.assertEquals(null, TokenUtils.findLastTextToken(new ArrayList())); + + //list with null value + Assert.assertEquals(null, + TokenUtils.findLastTextToken(newCliTokenList(new CliToken[]{null}))); + Assert.assertEquals(textCliToken, + TokenUtils.findLastTextToken(newCliTokenList(new CliToken[]{null, textCliToken}))); + Assert.assertEquals(textCliToken, + TokenUtils.findLastTextToken(newCliTokenList(new CliToken[]{null, nonTextCliToken, textCliToken}))); + Assert.assertEquals(textCliToken, + TokenUtils.findLastTextToken(newCliTokenList(new CliToken[]{nonTextCliToken, null, textCliToken}))); + Assert.assertEquals(textCliToken, + TokenUtils.findLastTextToken(newCliTokenList(new CliToken[]{textCliToken, null, nonTextCliToken}))); + + //list with normal inputs + Assert.assertEquals(textCliToken, + TokenUtils.findLastTextToken(newCliTokenList(new CliToken[]{textCliToken}))); + Assert.assertEquals(null, + TokenUtils.findLastTextToken(newCliTokenList(new CliToken[]{nonTextCliToken}))); + Assert.assertEquals(textCliToken, + TokenUtils.findLastTextToken(newCliTokenList(new CliToken[]{nonTextCliToken, textCliToken}))); + Assert.assertEquals(textCliToken, + TokenUtils.findLastTextToken(newCliTokenList(new CliToken[]{textCliToken, nonTextCliToken}))); + + } + + + @Test + public void testFindSecondTextToken(){ + CliToken textCliToken = new CliTokenImpl(true,"textCliToken"); + CliToken nonTextCliToken = new CliTokenImpl(false,"nonTextCliToken"); + + //null list + Assert.assertEquals(null, TokenUtils.findSecondTokenText(null)); + + //empty list + Assert.assertEquals(null, TokenUtils.findSecondTokenText(new ArrayList())); + + //list with null value + Assert.assertEquals(null, + TokenUtils.findSecondTokenText(newCliTokenList(new CliToken[]{null}))); + Assert.assertEquals(null, + TokenUtils.findSecondTokenText(newCliTokenList(new CliToken[]{null, textCliToken}))); + Assert.assertEquals(null, + TokenUtils.findSecondTokenText(newCliTokenList(new CliToken[]{null, nonTextCliToken, textCliToken}))); + Assert.assertEquals(textCliToken.value(), + TokenUtils.findSecondTokenText(newCliTokenList(new CliToken[]{null, nonTextCliToken, textCliToken, textCliToken}))); + + //list with normal inputs + Assert.assertEquals(null, + TokenUtils.findSecondTokenText(newCliTokenList(new CliToken[]{textCliToken}))); + Assert.assertEquals(null, + TokenUtils.findSecondTokenText(newCliTokenList(new CliToken[]{nonTextCliToken}))); + Assert.assertEquals(null, + TokenUtils.findSecondTokenText(newCliTokenList(new CliToken[]{nonTextCliToken, textCliToken}))); + Assert.assertEquals(textCliToken.value(), + TokenUtils.findSecondTokenText(newCliTokenList(new CliToken[]{textCliToken, nonTextCliToken, textCliToken}))); + + } + +}