001    package net.sf.logdistiller.reports;
002    
003    /*
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    import java.io.IOException;
018    import java.io.Writer;
019    import java.util.Iterator;
020    
021    import org.jdom.*;
022    import org.jdom.output.Format;
023    import org.jdom.output.XMLOutputter;
024    
025    import net.sf.logdistiller.LogDistillation;
026    import net.sf.logdistiller.LogDistiller;
027    import net.sf.logdistiller.ReportFormat;
028    
029    /**
030     * XML report format.
031     *
032     * @since 0.8
033     */
034    public class XmlReport
035        extends ReportFormat
036    {
037        public XmlReport()
038        {
039            super( "xml" );
040        }
041    
042        public String getContentType()
043        {
044            return "text/xml";
045        }
046    
047        public String getFileExtension()
048        {
049            return "xml";
050        }
051    
052        public void report( LogDistillation ld, Writer output )
053            throws IOException
054        {
055            LogDistiller definition = ld.getDefinition();
056    
057            Element report = new Element( "logdistiller-report" );
058            Element elmt = new Element( "logdistiller" );
059            elmt.setAttribute( "id", definition.getOutput().getId() );
060            elmt.setAttribute( "description", definition.getDescription() );
061            elmt.setAttribute( "logtype", definition.getLogType().getId() );
062            elmt.setAttribute( "version", ld.getVersion() );
063            report.addContent( elmt );
064    
065            elmt = new Element( "logdistillation" );
066            if ( ld.getContent() != null )
067            {
068                elmt.setAttribute( "content", ld.getContent() );
069            }
070            String logsUrl = definition.getOutput().getUrl();
071            if ( logsUrl != null )
072            {
073                elmt.setAttribute( "logsUrl", logsUrl );
074            }
075            elmt.setAttribute( "beginTime", String.valueOf( ld.getBeginTime() ) );
076            elmt.setAttribute( "endTime", String.valueOf( ld.getEndTime() ) );
077            elmt.setAttribute( "eventCount", String.valueOf( ld.getEventCount() ) );
078            elmt.setAttribute( "eventBytes", String.valueOf( ld.getEventBytes() ) );
079            elmt.setAttribute( "skippedEventCount", String.valueOf( ld.getSkippedEventCount() ) );
080            elmt.setAttribute( "skippedEventBytes", String.valueOf( ld.getSkippedEventBytes() ) );
081            Iterator iter = definition.getWarnings().iterator();
082            while ( iter.hasNext() )
083            {
084                elmt.addContent( new Element( "warning" ).setText( (String) iter.next() ) );
085            }
086            report.addContent( elmt );
087    
088            // report for categories, and corresponding groups
089            Iterator categoriesIterator = ld.listCategoriesToReport().iterator();
090            while ( categoriesIterator.hasNext() )
091            {
092                LogDistillation.Category category = (LogDistillation.Category) categoriesIterator.next();
093                elmt.addContent( newCategory( category ) );
094            }
095    
096            // report for groups without category
097            Iterator groupsIterator = ld.listGroupsToReport().iterator();
098            while ( groupsIterator.hasNext() )
099            {
100                LogDistillation.Group group = (LogDistillation.Group) groupsIterator.next();
101                elmt.addContent( newGroup( group ) );
102            }
103    
104            new XMLOutputter( Format.getPrettyFormat() ).output( new Document( report ), output );
105        }
106    
107        private Element newCategory( LogDistillation.Category category )
108        {
109            Element elmt = new Element( "category" );
110            LogDistiller.Category definition = category.getDefinition();
111            elmt.setAttribute( "id", definition.getId() );
112            elmt.setAttribute( "description", definition.getDescription() );
113            elmt.setAttribute( "eventCount", String.valueOf( category.sumEventCount() ) );
114            elmt.setAttribute( "eventBytes", String.valueOf( category.sumBytes() ) );
115            Iterator iter = category.listGroupsToReport().iterator();
116            while ( iter.hasNext() )
117            {
118                LogDistillation.Group group = (LogDistillation.Group) iter.next();
119                elmt.addContent( newGroup( group ) );
120            }
121            return elmt;
122        }
123    
124        private Element newGroup( LogDistillation.Group group )
125        {
126            Element elmt = new Element( "group" );
127            LogDistiller.Group definition = group.getDefinition();
128            elmt.setAttribute( "id", definition.getId() );
129            elmt.setAttribute( "description", definition.getDescription() );
130            elmt.setAttribute( "eventCount", String.valueOf( group.getEventCount() ) );
131            elmt.setAttribute( "eventBytes", String.valueOf( group.getBytes() ) );
132            if ( definition.continueProcessing() )
133            {
134                elmt.setAttribute( "continueProcessing", "true" );
135            }
136            addPluginsGlobalReport( group, new XmlPluginReport( elmt ) );
137            return elmt;
138        }
139    
140        public void report( LogDistillation.Group group, Writer output )
141            throws IOException
142        {
143            LogDistillation ld = group.getLogdistillation();
144            LogDistiller.Group definition = group.getDefinition();
145            Element elmt;
146    
147            Element report = new Element( "logdistiller-group-report" );
148            report.addContent( elmt = new Element( "group" ) );
149            elmt.setAttribute( "id", definition.getId() );
150            elmt.setAttribute( "description", definition.getDescription() );
151            elmt.setAttribute( "continueProcessing", definition.continueProcessing() ? "true" : "false" );
152            definition.dumpConditions( elmt );
153    
154            report.addContent( elmt = new Element( "logdistillation" ) );
155            if ( ld.getContent() != null )
156            {
157                elmt.setAttribute( "content", ld.getContent() );
158            }
159            String logsUrl = ld.getDefinition().getOutput().getUrl();
160            if ( logsUrl != null )
161            {
162                elmt.setAttribute( "logsUrl", logsUrl );
163            }
164            elmt.setAttribute( "eventCount", String.valueOf( ld.getEventCount() ) );
165            elmt.setAttribute( "eventBytes", String.valueOf( ld.getEventBytes() ) );
166    
167            if ( definition.getSave() )
168            {
169                Element save = new Element( "save" );
170                save.setAttribute( "logFile", group.getLogFile().getAbsolutePath() );
171                save.setAttribute( "savedEventCount", String.valueOf( group.getSavedEventCount() ) );
172                save.setAttribute( "maxSaveCount", String.valueOf( group.getMaxSaveCount() ) );
173                save.setAttribute( "maxSaveBytes", String.valueOf( group.getMaxSaveBytes() ) );
174                if ( logsUrl != null )
175                {
176                    save.setAttribute( "logsUrl", ld.getDefinition().getOutput().getUrl( group.getLogFile().getName() ) );
177                }
178                elmt.addContent( save );
179            }
180            addPluginsGroupReport( group, new XmlPluginReport( elmt ) );
181    
182            new XMLOutputter( Format.getPrettyFormat() ).output( new Document( report ), output );
183        }
184    
185        private static class XmlPluginReport
186            extends PluginReport
187        {
188            private final Element elmt;
189    
190            private Element pluginElmt;
191    
192            public XmlPluginReport( Element elmt )
193            {
194                this.elmt = elmt;
195                pluginElmt = null;
196            }
197    
198            public void beginPluginReport( LogDistillation.Plugin plugin, String description )
199            {
200                pluginElmt = new Element( "plugin" ).setAttribute( "type", plugin.getDefinition().getType() );
201                pluginElmt.addContent( new Element( "description" ).setText( description ) );
202            }
203    
204            public void addLink( String filename, String description )
205            {
206                pluginElmt.addContent( new Element( "link" ).setAttribute( "filename", filename ).setText( description ) );
207            }
208    
209            public void addParam( String param, String value )
210            {
211                pluginElmt.addContent( new Element( "param" ).setAttribute( "name", param ).setText( value ) );
212            }
213    
214            public void addItem( int count, String description )
215            {
216                pluginElmt.addContent( new Element( "item" ).setAttribute( "count", String.valueOf( count ) ).setText(
217                                                                                                                       description ) );
218            }
219    
220            public void endPluginReport()
221            {
222                elmt.addContent( pluginElmt );
223                pluginElmt = null;
224            }
225        }
226    }