You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by cs...@apache.org on 2012/05/10 16:28:58 UTC

svn commit: r1336716 - in /karaf/trunk/shell/table: ./ src/main/java/org/apache/karaf/shell/table/ src/test/java/org/apache/karaf/shell/tabletest/

Author: cschneider
Date: Thu May 10 14:28:57 2012
New Revision: 1336716

URL: http://svn.apache.org/viewvc?rev=1336716&view=rev
Log:
KARAF-1462 Improvements to shell tables

Modified:
    karaf/trunk/shell/table/pom.xml
    karaf/trunk/shell/table/src/main/java/org/apache/karaf/shell/table/Col.java
    karaf/trunk/shell/table/src/main/java/org/apache/karaf/shell/table/Row.java
    karaf/trunk/shell/table/src/main/java/org/apache/karaf/shell/table/ShellTable.java
    karaf/trunk/shell/table/src/test/java/org/apache/karaf/shell/tabletest/ShellTableTest.java

Modified: karaf/trunk/shell/table/pom.xml
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/table/pom.xml?rev=1336716&r1=1336715&r2=1336716&view=diff
==============================================================================
--- karaf/trunk/shell/table/pom.xml (original)
+++ karaf/trunk/shell/table/pom.xml Thu May 10 14:28:57 2012
@@ -53,6 +53,12 @@
             <artifactId>slf4j-simple</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+        	<groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.3</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>

Modified: karaf/trunk/shell/table/src/main/java/org/apache/karaf/shell/table/Col.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/table/src/main/java/org/apache/karaf/shell/table/Col.java?rev=1336716&r1=1336715&r2=1336716&view=diff
==============================================================================
--- karaf/trunk/shell/table/src/main/java/org/apache/karaf/shell/table/Col.java (original)
+++ karaf/trunk/shell/table/src/main/java/org/apache/karaf/shell/table/Col.java Thu May 10 14:28:57 2012
@@ -15,7 +15,6 @@
  */
 package org.apache.karaf.shell.table;
 
-import java.text.Format;
 
 
 /**
@@ -30,18 +29,17 @@ public class Col {
 
     /**
      * Maximum size of this column. The default -1 means the column
-     * may grow indefinately
+     * may grow indefinitely
      */
-    private int maxSize = -1;
+    int maxSize = -1;
     
-    private int size = 0;
-
+    int size = 0;
     
     /**
      * Alignment
      */
     private HAlign align = HAlign.left;
-    
+
     public Col(String header) {
         this.header = header;
     }
@@ -95,20 +93,16 @@ public class Col {
         return header;
     }
 
-    int getMaxSize() {
-        return maxSize;
-    }
-
-    Format getFormat() {
-        return null;
-    }
-
-    int getSize() {
-        return this.size;
+    String getContent(String content) {
+        return this.align.position(cut(content, this.size), this.size);
     }
 
-    String getContent(String content) {
-        return this.align.position(content, this.size);
+    private String cut(String content, int size) {
+        if (content.length() <= size) {
+            return content;
+        } else {
+            return content.substring(0, Math.max(0, size - 1));
+        }
     }
 
 }

Modified: karaf/trunk/shell/table/src/main/java/org/apache/karaf/shell/table/Row.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/table/src/main/java/org/apache/karaf/shell/table/Row.java?rev=1336716&r1=1336715&r2=1336716&view=diff
==============================================================================
--- karaf/trunk/shell/table/src/main/java/org/apache/karaf/shell/table/Row.java (original)
+++ karaf/trunk/shell/table/src/main/java/org/apache/karaf/shell/table/Row.java Thu May 10 14:28:57 2012
@@ -48,21 +48,21 @@ public class Row {
         }
     }
     
-    String getContent(List<Col> cols) {
+    String getContent(List<Col> cols, String separator) {
         StringBuilder st = new StringBuilder();
         int c = 0;
         if (cols.size() != content.size()) {
             throw new RuntimeException("Number of columns and number of content elements do not match");
         }
-        //st.append("| ");
+
         for (Col col : cols) {
             st.append(col.getContent(content.get(c)));
             if (c + 1 < cols.size()) {
-                st.append(" | ");
+                st.append(separator);
             }
             c++;
         }
-        //st.append(" |");
+
         return st.toString();
     }
 

Modified: karaf/trunk/shell/table/src/main/java/org/apache/karaf/shell/table/ShellTable.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/table/src/main/java/org/apache/karaf/shell/table/ShellTable.java?rev=1336716&r1=1336715&r2=1336716&view=diff
==============================================================================
--- karaf/trunk/shell/table/src/main/java/org/apache/karaf/shell/table/ShellTable.java (original)
+++ karaf/trunk/shell/table/src/main/java/org/apache/karaf/shell/table/ShellTable.java Thu May 10 14:28:57 2012
@@ -24,11 +24,29 @@ import java.util.List;
 public class ShellTable {
     private List<Col> cols = new ArrayList<Col>();
     private List<Row> rows = new ArrayList<Row>();
+    boolean showHeaders = true;
+    private String separator = " | ";
+    private int size;
     
     public ShellTable() {
         
     }
     
+    public ShellTable noHeaders() {
+        this.showHeaders = false;
+        return this;
+    }
+    
+    public ShellTable separator(String separator) {
+        this.separator = separator;
+        return this;
+    }
+    
+    public ShellTable size(int size) {
+        this.size = size;
+        return this;
+    }
+    
     public ShellTable column(Col colunmn) {
         cols.add(colunmn);
         return this;
@@ -46,15 +64,39 @@ public class ShellTable {
         for (Row row : rows) {
             row.formatContent(cols);
         }
+        
+        if (size > 0) {
+            tryGrowToMaxSize();
+        }
+
+        if (showHeaders) {
+            String headerLine = headerRow.getContent(cols, separator);
+            out.println(headerLine);
+            out.println(underline(headerLine.length()));
+        }
 
-        String headerLine = headerRow.getContent(cols);
-        out.println(headerLine);
-        out.println(underline(headerLine.length()));
         for (Row row : rows) {
-            out.println(row.getContent(cols));
+            out.println(row.getContent(cols, separator));
         }
     }
 
+    private void tryGrowToMaxSize() {
+        int currentSize = 0;
+        for (Col col : cols) {
+            currentSize += col.size + separator.length();
+        }
+        currentSize -= separator.length();
+        int sizeToGrow = size - currentSize;
+
+        for (Col col : cols) {
+            if (col.maxSize == -1) {
+                col.size = Math.max(0, col.size + sizeToGrow);
+                return;
+            }
+        }
+
+    }
+
     private String underline(int length) {
         char[] exmarks = new char[length];
         Arrays.fill(exmarks, '-');

Modified: karaf/trunk/shell/table/src/test/java/org/apache/karaf/shell/tabletest/ShellTableTest.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/table/src/test/java/org/apache/karaf/shell/tabletest/ShellTableTest.java?rev=1336716&r1=1336715&r2=1336716&view=diff
==============================================================================
--- karaf/trunk/shell/table/src/test/java/org/apache/karaf/shell/tabletest/ShellTableTest.java (original)
+++ karaf/trunk/shell/table/src/test/java/org/apache/karaf/shell/tabletest/ShellTableTest.java Thu May 10 14:28:57 2012
@@ -15,6 +15,12 @@
  */
 package org.apache.karaf.shell.tabletest;
 
+import java.io.PrintStream;
+import java.io.StringWriter;
+
+import junit.framework.Assert;
+
+import org.apache.commons.io.output.WriterOutputStream;
 import org.apache.karaf.shell.table.Col;
 import org.apache.karaf.shell.table.Row;
 import org.apache.karaf.shell.table.ShellTable;
@@ -28,15 +34,82 @@ public class ShellTableTest {
         table.column(new Col("id").alignRight().maxSize(5));
         table.column(new Col("Name").maxSize(20));
         table.column(new Col("Centered").alignCenter());
-        
+
         table.addRow().addContent(1, "Test", "Description");
         table.addRow().addContent(20, "My name", "Description");
-        
+
         Row row = table.addRow();
         row.addContent(123456789);
         row.addContent("A very long text that should be cut");
         row.addContent("A very long text that should not be cut");
-        
-        table.print(System.out);
+
+        StringWriter writer = new StringWriter();
+        PrintStream out = new PrintStream(new WriterOutputStream(writer));
+        table.print(out);
+        out.flush();
+        String expected = 
+                "   id | Name                 |                Centered                \r\n" + 
+                "----------------------------------------------------------------------\r\n" + 
+                "    1 | Test                 |               Description              \r\n" + 
+                "   20 | My name              |               Description              \r\n" + 
+                "12345 | A very long text tha | A very long text that should not be cut\r\n";
+        Assert.assertEquals(expected, writer.getBuffer().toString());
+    }
+
+    @Test
+    public void testGrow() {
+        ShellTable table = new ShellTable().size(10);
+        table.column(new Col("1"));
+        table.column(new Col("2"));
+
+        table.addRow().addContent("1", "2");
+
+        StringWriter writer = new StringWriter();
+        PrintStream out = new PrintStream(new WriterOutputStream(writer));
+        table.print(out);
+        out.flush();
+        String expected = 
+                "1      | 2\r\n" + 
+        		"----------\r\n" + 
+        		"1      | 2\r\n";
+        Assert.assertEquals(expected, writer.getBuffer().toString());
+    }
+
+    @Test
+    public void testShrink() {
+        ShellTable table = new ShellTable().size(10);
+        table.column(new Col("1").maxSize(5));
+        table.column(new Col("2").alignRight());
+
+        table.addRow().addContent("quite long", "and here an even longer text");
+
+        StringWriter writer = new StringWriter();
+        PrintStream out = new PrintStream(new WriterOutputStream(writer));
+        table.print(out);
+        out.flush();
+        String expected = //
+                  "1     |  2\r\n" //
+                + "----------\r\n" //
+                + "quite |  a\r\n";
+        Assert.assertEquals(expected, writer.getBuffer().toString());
+    }
+    
+    @Test
+    public void testTooSmall() {
+        ShellTable table = new ShellTable().size(2);
+        table.column(new Col("1").maxSize(5));
+        table.column(new Col("2").alignRight());
+
+        table.addRow().addContent("quite long", "and here an even longer text");
+
+        StringWriter writer = new StringWriter();
+        PrintStream out = new PrintStream(new WriterOutputStream(writer));
+        table.print(out);
+        out.flush();
+        String expected = //
+                  "1     | \r\n" + // 
+                  "--------\r\n" + //
+                  "quite | \r\n";
+        Assert.assertEquals(expected, writer.getBuffer().toString());
     }
 }