diff --git a/pom.xml b/pom.xml index 5e46f5d1..cae04147 100644 --- a/pom.xml +++ b/pom.xml @@ -50,11 +50,10 @@ log4j 1.2.14 - commons-io commons-io - 1.4 + 2.3 diff --git a/src/main/java/org/springframework/shell/JLineShell.java b/src/main/java/org/springframework/shell/JLineShell.java index 59a1d0f5..428dd408 100644 --- a/src/main/java/org/springframework/shell/JLineShell.java +++ b/src/main/java/org/springframework/shell/JLineShell.java @@ -27,6 +27,7 @@ import jline.ANSIBuffer.ANSICodes; import jline.ConsoleReader; import jline.WindowsTerminal; +import org.apache.commons.io.input.ReversedLinesFileReader; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.context.ApplicationContext; @@ -40,7 +41,6 @@ import org.springframework.roo.shell.event.ShellStatus.Status; import org.springframework.roo.shell.event.ShellStatusListener; import org.springframework.roo.support.util.Assert; import org.springframework.roo.support.util.ClassUtils; -import org.springframework.roo.support.util.FileCopyUtils; import org.springframework.roo.support.util.IOUtils; import org.springframework.roo.support.util.OsUtils; import org.springframework.roo.support.util.StringUtils; @@ -63,8 +63,7 @@ import org.springframework.shell.plugin.PromptProvider; * @author Jarred Li * @since 1.0 */ -public abstract class JLineShell extends AbstractShell - implements CommandMarker, Shell, Runnable { +public abstract class JLineShell extends AbstractShell implements CommandMarker, Shell, Runnable { // Constants private static final String ANSI_CONSOLE_CLASSNAME = "org.fusesource.jansi.AnsiConsole"; @@ -87,14 +86,14 @@ public abstract class JLineShell extends AbstractShell private ApplicationContext applicatonContext; private boolean printBanner = true; - + private static AnnotationAwareOrderComparator annocationOrderComparator = new AnnotationAwareOrderComparator(); - + private String historyFileName; private String promptText; private String version; private String welcomeMessage; - + private int historySize; public void run() { @@ -134,21 +133,10 @@ public abstract class JLineShell extends AbstractShell openFileLogIfPossible(); // Try to build previous command history from the project's log - try { - String logFileContents = FileCopyUtils.copyToString(new File(this.historyFileName)); - String[] logEntries = logFileContents.split(StringUtils.LINE_SEPARATOR); - // LIFO - int size = 0; - for (String logEntry : logEntries) { - if (!logEntry.startsWith("//")) { - reader.getHistory().addToHistory(logEntry); - size++; - if(size > historySize){ - break; - } - } - } - } catch (IOException ignored) { + + String[] filteredLogEntries = filterLogEntry(); + for (String logEntry : filteredLogEntries) { + reader.getHistory().addToHistory(logEntry); } flashMessageRenderer(); @@ -171,7 +159,7 @@ public abstract class JLineShell extends AbstractShell }, "Spring Roo JLine Shutdown Hook")); // Handle any "execute-then-quit" operation - + String rooArgs = System.getProperty("roo.args"); if (rooArgs != null && !"".equals(rooArgs)) { setShellStatus(Status.USER_INPUT); @@ -187,12 +175,41 @@ public abstract class JLineShell extends AbstractShell // Normal RPEL processing promptLoop(); } - + } - - public void printBannerAndWelcome(){ - if(printBanner){ - logger.info(this.version); + + /** + * read history commands from history log. the history size if determined by --histsize options. + * + * @return history commands + */ + private String[] filterLogEntry() { + ArrayList entries = new ArrayList(); + try { + ReversedLinesFileReader reader = new ReversedLinesFileReader(new File(this.historyFileName)); + int size = 0; + String line = null; + while ((line = reader.readLine()) != null) { + if (!line.startsWith("//")) { + size++; + if (size > historySize) { + break; + } + else { + entries.add(line); + } + } + } + } catch (IOException e) { + logger.warning("read history file failed"); + } + Collections.reverse(entries); + return entries.toArray(new String[0]); + } + + public void printBannerAndWelcome() { + if (printBanner) { + logger.info(this.version); logger.info(getWelcomeMessage()); } } @@ -545,73 +562,72 @@ public abstract class JLineShell extends AbstractShell public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicatonContext = applicationContext; } - - public void costomizePlugin(){ + + public void costomizePlugin() { this.historyFileName = getHistoryFileName(); this.promptText = getPromptText(); this.version = getBannerText()[0]; this.welcomeMessage = getBannerText()[1]; } - + /** * get history file name from provider. The provider has highest order * org.springframework.core.Ordered.getOder will win. * * @return history file name */ - private String getHistoryFileName() { + private String getHistoryFileName() { return getHighestPriorityProvider(HistoryFileNameProvider.class).getHistoryFileName(); } - + /** * get prompt text from provider. The provider has highest order * org.springframework.core.Ordered.getOder will win. * * @return prompt text */ - private String getPromptText(){ + private String getPromptText() { return getHighestPriorityProvider(PromptProvider.class).getPromptText(); } - + /** * Get Banner and Welcome Message from provider. The provider has highest order * org.springframework.core.Ordered.getOder will win. * @return BannerText[0]: Banner * BannerText[1]: Welcome Message. */ - private String[] getBannerText(){ + private String[] getBannerText() { String[] bannerText = new String[2]; BannerProvider provider = getHighestPriorityProvider(BannerProvider.class); bannerText[0] = provider.getBanner(); bannerText[1] = provider.getWelcomMessage(); return bannerText; } - - - private T getHighestPriorityProvider(Class t){ - Map providers = BeanFactoryUtils.beansOfTypeIncludingAncestors( - this.applicatonContext, t); + + + private T getHighestPriorityProvider(Class t) { + Map providers = BeanFactoryUtils.beansOfTypeIncludingAncestors(this.applicatonContext, t); List sortedProviders = new ArrayList(providers.values()); Collections.sort(sortedProviders, annocationOrderComparator); T highestPriorityProvider = sortedProviders.get(0); return highestPriorityProvider; } - + /** * get the version information * */ @Override - public String version(String text){ + public String version(String text) { return this.version; } - + /** * get the welcome message at start. * * @return welcome message */ - public String getWelcomeMessage(){ + public String getWelcomeMessage() { return this.welcomeMessage; } @@ -636,5 +652,5 @@ public abstract class JLineShell extends AbstractShell public void setHistorySize(int historySize) { this.historySize = historySize; } - + }