001package gu.dtalk.client; 002 003import java.io.PrintStream; 004 005import com.alibaba.fastjson.JSONArray; 006import com.google.common.base.MoreObjects; 007import com.google.common.base.Strings; 008 009import gu.dtalk.Ack; 010import gu.dtalk.BaseItem; 011import gu.dtalk.BaseOption; 012import gu.dtalk.CheckOption; 013import gu.dtalk.MenuItem; 014import gu.dtalk.Ack.Status; 015 016/** 017 * 文本渲染器,向{@link PrintStream}输出从设备端收到的消息 018 * @author guyadong 019 * 020 */ 021public class TextRender implements IMessageRender { 022 023 private PrintStream stream = System.out; 024 025 public TextRender() { 026 } 027 028 @Override 029 public void rendeAck(Ack<?> ack, boolean renderValueIfOk){ 030 Status status = ack.getStatus(); 031 if(renderValueIfOk && Ack.Status.OK == status && ack.getValue() != null){ 032 Object v = ack.getValue(); 033 if(v instanceof JSONArray){ 034 for (Object element : (JSONArray)v) { 035 stream.append(element.toString()).append("\n"); 036 } 037 }else{ 038 stream.append(v.toString()); 039 } 040 }else{ 041 stream.append(status.name()); 042 if(status != Ack.Status.OK && !Strings.isNullOrEmpty(ack.getStatusMessage())){ 043 stream.append(":").append(ack.getStatusMessage()); 044 } 045 } 046 stream.append('\n'); 047 } 048 049 @Override 050 public void rendeItem(MenuItem menu){ 051 stream.println("=========Device Menu============"); 052 stream.printf("-->%s\n",menu.getPath()); 053 int i=0; 054 for(BaseItem item: menu.getChilds()){ 055 String acc = item.isDisable() ? "x" : " "; 056 String hide =item.isHide() ? "[H]" : " "; 057 String content = ""; 058 if(item instanceof BaseOption){ 059 BaseOption<?> option = (BaseOption<?>)item; 060 content = MoreObjects.firstNonNull(option.contentOfValue(),""); 061 // 只读标志 062 acc = option.isReadOnly() ? "R" : acc; 063 } 064 if(!content.isEmpty()){ 065 content = ": " +content; 066 } 067 068 stream.printf("[%d] [%s] %s %s %s\n", 069 i++, 070 acc, 071 hide, 072 item.getUiName(), 073 content); 074 if(item instanceof CheckOption){ 075 CheckOption<?> checkOption = (CheckOption<?>)item; 076 stream.println(checkOption.contentOfOptions()); 077 } 078 } 079 stream.println("==Press number to seleect menu item,'.' show current menu(按数字选项菜单,'.'显示当前菜单)=="); 080 } 081 public IMessageRender setStream(PrintStream stream) { 082 if(null != stream){ 083 this.stream = stream; 084 } 085 return this; 086 } 087 public PrintStream getStream() { 088 return stream; 089 } 090}