001    /*
002      GRANITE DATA SERVICES
003      Copyright (C) 2013 GRANITE DATA SERVICES S.A.S.
004    
005      This file is part of Granite Data Services.
006    
007      Granite Data Services is free software; you can redistribute it and/or modify
008      it under the terms of the GNU Library General Public License as published by
009      the Free Software Foundation; either version 2 of the License, or (at your
010      option) any later version.
011    
012      Granite Data Services is distributed in the hope that it will be useful, but
013      WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014      FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015      for more details.
016    
017      You should have received a copy of the GNU Library General Public License
018      along with this library; if not, see <http://www.gnu.org/licenses/>.
019    */
020    
021    package org.granite.messaging.jmf;
022    
023    import java.io.IOException;
024    import java.io.InputStream;
025    import java.io.PrintStream;
026    
027    import org.granite.messaging.jmf.codec.StandardCodec;
028    
029    /**
030     * @author Franck WOLFF
031     */
032    public class JMFDumper extends JMFDeserializer implements DumpContext {
033            
034            protected static final int DEFAULT_MAX_ARRAY_ELEMENTS = 32;
035            
036            protected final PrintStream ps;
037            protected final int maxArrayElements;
038    
039            protected int indentCount = 0;
040            
041            public JMFDumper(InputStream is, SharedContext context, PrintStream ps) {
042                    this(is, context, ps, DEFAULT_MAX_ARRAY_ELEMENTS);
043            }
044            
045            public JMFDumper(InputStream is, SharedContext context, PrintStream ps, int maxArrayElements) {
046                    super(is, context);
047                    this.ps = ps;
048                    this.maxArrayElements = maxArrayElements;
049            }
050    
051            public int getMaxArrayElements() {
052                    return maxArrayElements;
053            }
054    
055            public void dump() throws IOException {
056                    int parameterizedJmfType;
057                    
058                    while ((parameterizedJmfType = inputStream.read()) != -1) {
059                            int jmfType = codecRegistry.extractJmfType(parameterizedJmfType);
060                            
061                            StandardCodec<?> codec = codecRegistry.getCodec(jmfType);
062                            if (codec == null)
063                                    throw new JMFEncodingException("Unsupported type: " + jmfType);
064                            
065                            codec.dump(this, parameterizedJmfType);
066                    }
067            }
068    
069            public void incrIndent(int off) {
070                    this.indentCount += off;
071                    if (indentCount < 0)
072                            indentCount = 0;
073            }
074    
075            public void indentPrint(String message) throws IOException {
076                    for (int i = 0; i < indentCount; i++)
077                            ps.print("    ");
078                    ps.print(message);
079            }
080    
081            public void print(String message) throws IOException {
082                    ps.print(message);
083            }
084    
085            public void noIndentPrintLn(String message) throws IOException {
086                    ps.println(message);
087            }
088    
089            public void indentPrintLn(String message) throws IOException {
090                    for (int i = 0; i < indentCount; i++)
091                            ps.print("    ");
092                    ps.println(message);
093            }
094    }