001 /*
002 * Copyright (C) 2012 eXo Platform SAS.
003 *
004 * This is free software; you can redistribute it and/or modify it
005 * under the terms of the GNU Lesser General Public License as
006 * published by the Free Software Foundation; either version 2.1 of
007 * the License, or (at your option) any later version.
008 *
009 * This software is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * You should have received a copy of the GNU Lesser General Public
015 * License along with this software; if not, write to the Free
016 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
017 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
018 */
019
020 package org.crsh.text.renderers;
021
022 import org.crsh.text.Color;
023 import org.crsh.text.Decoration;
024 import org.crsh.text.Renderable;
025 import org.crsh.text.Renderer;
026 import org.crsh.text.ui.LabelElement;
027 import org.crsh.text.ui.RowElement;
028 import org.crsh.text.ui.TableElement;
029
030 import java.util.ArrayList;
031 import java.util.Iterator;
032 import java.util.LinkedHashSet;
033 import java.util.Map;
034
035 public class MapRenderable extends Renderable<Map<?, ?>> {
036
037 @Override
038 public Class<Map<?, ?>> getType() {
039 Object mapClass = Map.class;
040 return (Class<Map<?,?>>)mapClass;
041 }
042
043 @Override
044 public Renderer renderer(Iterator<Map<?, ?>> stream) {
045
046 TableElement table = new TableElement();
047 LinkedHashSet<String> current = new LinkedHashSet<String>();
048 LinkedHashSet<String> bilto = new LinkedHashSet<String>();
049
050 ArrayList<Renderer> renderers = new ArrayList<Renderer>();
051
052 while (stream.hasNext()) {
053
054 Map<?, ?> row = stream.next();
055
056 if (row.size() > 0) {
057
058 bilto.clear();
059 for (Map.Entry<?, ?> entry : row.entrySet()) {
060 bilto.add(String.valueOf(entry.getKey()));
061 }
062
063 // Create a new table if needed
064 if (!current.equals(bilto)) {
065 if (table.getRows().size() > 0) {
066 renderers.add(table.renderer());
067 }
068 table = new TableElement().rightCellPadding(1);
069 RowElement header = new RowElement(true);
070 header.style(Decoration.bold.fg(Color.black).bg(Color.white));
071 for (String s : bilto) {
072 header.add(new LabelElement(s));
073 }
074 table.add(header);
075 current = bilto;
076 }
077
078 //
079 RowElement r = new RowElement();
080 for (String s : bilto) {
081 String v = String.valueOf(row.get(s));
082 r.add(new LabelElement(v));
083 }
084 table.add(r);
085 }
086 }
087
088 //
089 if (table.getRows().size() > 0) {
090 renderers.add(table.renderer());
091 }
092
093 //
094 return Renderer.vertical(renderers);
095 }
096 }