001package org.apache.maven.doxia.sink;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *   http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import java.util.LinkedList;
023import java.util.List;
024import java.util.Stack;
025
026
027/**
028 * This sink is used for testing purposes in order to check wether
029 * the input of some parser is well-formed.
030 *
031 * @author <a href="mailto:lars@trieloff.net">Lars Trieloff</a>
032 * @version $Id$
033 */
034public class WellformednessCheckingSink
035    extends AbstractSink
036{
037    private final Stack<String> elements = new Stack<String>();
038
039    private final List<String> errors = new LinkedList<String>();
040
041    /** {@inheritDoc} */
042    public void head()
043    {
044        startElement( "head" );
045    }
046
047    /** {@inheritDoc} */
048    public void head_()
049    {
050        checkWellformedness( "head" );
051    }
052
053    /** {@inheritDoc} */
054    public void body()
055    {
056        startElement( "body" );
057    }
058
059    /** {@inheritDoc} */
060    public void body_()
061    {
062        checkWellformedness( "body" );
063    }
064
065    /** {@inheritDoc} */
066    public void section1()
067    {
068        startElement( "section1" );
069    }
070
071    /** {@inheritDoc} */
072    public void section1_()
073    {
074        checkWellformedness( "section1" );
075    }
076
077    /** {@inheritDoc} */
078    public void section2()
079    {
080        startElement( "section2" );
081    }
082
083    /** {@inheritDoc} */
084    public void section2_()
085    {
086        checkWellformedness( "section2" );
087    }
088
089    /** {@inheritDoc} */
090    public void section3()
091    {
092        startElement( "section3" );
093    }
094
095    /** {@inheritDoc} */
096    public void section3_()
097    {
098        checkWellformedness( "section3" );
099    }
100
101    /** {@inheritDoc} */
102    public void section4()
103    {
104        startElement( "section4" );
105    }
106
107    /** {@inheritDoc} */
108    public void section4_()
109    {
110        checkWellformedness( "section4" );
111    }
112
113    /** {@inheritDoc} */
114    public void section5()
115    {
116        startElement( "section5" );
117    }
118
119    /** {@inheritDoc} */
120    public void section5_()
121    {
122        checkWellformedness( "section5" );
123    }
124
125    /** {@inheritDoc} */
126    public void list()
127    {
128        startElement( "list" );
129    }
130
131    /** {@inheritDoc} */
132    public void list_()
133    {
134        checkWellformedness( "list" );
135    }
136
137    /** {@inheritDoc} */
138    public void listItem()
139    {
140        startElement( "listItem" );
141    }
142
143    /** {@inheritDoc} */
144    public void listItem_()
145    {
146        checkWellformedness( "listItem" );
147    }
148
149    /** {@inheritDoc} */
150    public void numberedList( int numbering )
151    {
152        startElement( "numberedList" );
153    }
154
155    /** {@inheritDoc} */
156    public void numberedList_()
157    {
158        checkWellformedness( "numberedList" );
159    }
160
161    /** {@inheritDoc} */
162    public void numberedListItem()
163    {
164        startElement( "numberedListItem" );
165    }
166
167    /** {@inheritDoc} */
168    public void numberedListItem_()
169    {
170        checkWellformedness( "numberedListItem" );
171    }
172
173    /** {@inheritDoc} */
174    public void definitionList()
175    {
176        startElement( "definitionList" );
177    }
178
179    /** {@inheritDoc} */
180    public void definitionList_()
181    {
182        checkWellformedness( "definitionList" );
183    }
184
185    /** {@inheritDoc} */
186    public void definitionListItem()
187    {
188        startElement( "definitionListItem" );
189    }
190
191    /** {@inheritDoc} */
192    public void definitionListItem_()
193    {
194        checkWellformedness( "definitionListItem" );
195    }
196
197    /** {@inheritDoc} */
198    public void definition()
199    {
200        startElement( "definition" );
201    }
202
203    /** {@inheritDoc} */
204    public void definition_()
205    {
206        checkWellformedness( "definition" );
207    }
208
209    /** {@inheritDoc} */
210    public void figure()
211    {
212        startElement( "figure" );
213    }
214
215    /** {@inheritDoc} */
216    public void figure_()
217    {
218        checkWellformedness( "figure" );
219    }
220
221    /** {@inheritDoc} */
222    public void table()
223    {
224        startElement( "table" );
225    }
226
227    /** {@inheritDoc} */
228    public void table_()
229    {
230        checkWellformedness( "table" );
231    }
232
233    /** {@inheritDoc} */
234    public void tableRows( int[] justification, boolean grid )
235    {
236        startElement( "tableRows" );
237    }
238
239    /** {@inheritDoc} */
240    public void tableRows_()
241    {
242        checkWellformedness( "tableRows" );
243    }
244
245    /** {@inheritDoc} */
246    public void tableRow()
247    {
248        startElement( "tableRow" );
249    }
250
251    /** {@inheritDoc} */
252    public void tableRow_()
253    {
254        checkWellformedness( "tableRow" );
255    }
256
257    /** {@inheritDoc} */
258    public void title()
259    {
260        startElement( "title" );
261    }
262
263    /** {@inheritDoc} */
264    public void title_()
265    {
266        checkWellformedness( "title" );
267    }
268
269    /** {@inheritDoc} */
270    public void author()
271    {
272        startElement( "author" );
273    }
274
275    /** {@inheritDoc} */
276    public void author_()
277    {
278        checkWellformedness( "author" );
279    }
280
281    /** {@inheritDoc} */
282    public void date()
283    {
284        startElement( "date" );
285    }
286
287    /** {@inheritDoc} */
288    public void date_()
289    {
290        checkWellformedness( "date" );
291    }
292
293    /** {@inheritDoc} */
294    public void sectionTitle()
295    {
296        startElement( "sectionTitle" );
297    }
298
299    /** {@inheritDoc} */
300    public void sectionTitle_()
301    {
302        checkWellformedness( "sectionTitle" );
303    }
304
305    /** {@inheritDoc} */
306    public void sectionTitle1()
307    {
308        startElement( "sectionTitle1" );
309    }
310
311    /** {@inheritDoc} */
312    public void sectionTitle1_()
313    {
314        checkWellformedness( "sectionTitle1" );
315    }
316
317    /** {@inheritDoc} */
318    public void sectionTitle2()
319    {
320        startElement( "sectionTitle2" );
321    }
322
323    /** {@inheritDoc} */
324    public void sectionTitle2_()
325    {
326        checkWellformedness( "sectionTitle2" );
327    }
328
329    /** {@inheritDoc} */
330    public void sectionTitle3()
331    {
332        startElement( "sectionTitle3" );
333    }
334
335    /** {@inheritDoc} */
336    public void sectionTitle3_()
337    {
338        checkWellformedness( "sectionTitle3" );
339    }
340
341    /** {@inheritDoc} */
342    public void sectionTitle4()
343    {
344        startElement( "sectionTitle4" );
345    }
346
347    /** {@inheritDoc} */
348    public void sectionTitle4_()
349    {
350        checkWellformedness( "sectionTitle4" );
351    }
352
353    /** {@inheritDoc} */
354    public void sectionTitle5()
355    {
356        startElement( "sectionTitle5" );
357    }
358
359    /** {@inheritDoc} */
360    public void sectionTitle5_()
361    {
362        checkWellformedness( "sectionTitle5" );
363    }
364
365    /** {@inheritDoc} */
366    public void paragraph()
367    {
368        startElement( "paragraph" );
369    }
370
371    /** {@inheritDoc} */
372    public void paragraph_()
373    {
374        checkWellformedness( "paragraph" );
375    }
376
377    /** {@inheritDoc} */
378    public void verbatim( boolean boxed )
379    {
380        startElement( "verbatim" );
381    }
382
383    /** {@inheritDoc} */
384    public void verbatim_()
385    {
386        checkWellformedness( "verbatim" );
387    }
388
389    /** {@inheritDoc} */
390    public void definedTerm()
391    {
392        startElement( "definedTerm" );
393    }
394
395    /** {@inheritDoc} */
396    public void definedTerm_()
397    {
398        checkWellformedness( "definedTerm" );
399    }
400
401    /** {@inheritDoc} */
402    public void figureCaption()
403    {
404        startElement( "figureCaption" );
405    }
406
407    /** {@inheritDoc} */
408    public void figureCaption_()
409    {
410        checkWellformedness( "figureCaption" );
411    }
412
413    /** {@inheritDoc} */
414    public void tableCell()
415    {
416        startElement( "tableCell" );
417    }
418
419    /** {@inheritDoc} */
420    public void tableCell( String width )
421    {
422        startElement( "tableCell" );
423    }
424
425    /** {@inheritDoc} */
426    public void tableCell_()
427    {
428        checkWellformedness( "tableCell" );
429    }
430
431    /** {@inheritDoc} */
432    public void tableHeaderCell()
433    {
434        startElement( "tableHeaderCell" );
435    }
436
437    /** {@inheritDoc} */
438    public void tableHeaderCell( String width )
439    {
440        startElement( "tableHeaderCell" );
441    }
442
443    /** {@inheritDoc} */
444    public void tableHeaderCell_()
445    {
446        checkWellformedness( "tableHeaderCell" );
447    }
448
449    /** {@inheritDoc} */
450    public void tableCaption()
451    {
452        startElement( "tableCaption" );
453    }
454
455    /** {@inheritDoc} */
456    public void tableCaption_()
457    {
458        checkWellformedness( "tableCaption" );
459    }
460
461    /** {@inheritDoc} */
462    public void figureGraphics( String name )
463    {
464        // nop
465    }
466
467    /** {@inheritDoc} */
468    public void horizontalRule()
469    {
470        // nop
471    }
472
473    /** {@inheritDoc} */
474    public void pageBreak()
475    {
476        // nop
477    }
478
479    /** {@inheritDoc} */
480    public void anchor( String name )
481    {
482        startElement( "anchor" );
483    }
484
485    /** {@inheritDoc} */
486    public void anchor_()
487    {
488        checkWellformedness( "anchor" );
489    }
490
491    /** {@inheritDoc} */
492    public void link( String name )
493    {
494        startElement( "link" );
495    }
496
497    /** {@inheritDoc} */
498    public void link_()
499    {
500        checkWellformedness( "link" );
501    }
502
503    /** {@inheritDoc} */
504    public void italic()
505    {
506        startElement( "italic" );
507    }
508
509    /** {@inheritDoc} */
510    public void italic_()
511    {
512        checkWellformedness( "italic" );
513    }
514
515    /** {@inheritDoc} */
516    public void bold()
517    {
518        startElement( "bold" );
519    }
520
521    /** {@inheritDoc} */
522    public void bold_()
523    {
524        checkWellformedness( "bold" );
525    }
526
527    /** {@inheritDoc} */
528    public void monospaced()
529    {
530        startElement( "monospaced" );
531    }
532
533    /** {@inheritDoc} */
534    public void monospaced_()
535    {
536        checkWellformedness( "monospaced" );
537    }
538
539    /** {@inheritDoc} */
540    public void lineBreak()
541    {
542        // nop
543    }
544
545    /** {@inheritDoc} */
546    public void nonBreakingSpace()
547    {
548        // nop
549    }
550
551    /** {@inheritDoc} */
552    public void text( String text )
553    {
554        // nop
555    }
556
557    /** {@inheritDoc} */
558    public void rawText( String text )
559    {
560        // nop
561    }
562
563    /** {@inheritDoc} */
564    public void comment( String comment )
565    {
566        // nop
567    }
568
569    /** {@inheritDoc} */
570    public void flush()
571    {
572        // nop
573    }
574
575    /** {@inheritDoc} */
576    public void close()
577    {
578        this.elements.clear();
579        this.errors.clear();
580    }
581
582    /**
583     * Finds out wether the wellformedness-contraints of the model have been
584     * violated.
585     *
586     * @return false for non-wellformed models
587     */
588    public boolean isWellformed()
589    {
590        return errors.isEmpty();
591    }
592
593    /**
594     * Gets the offending element that breaks the wellformedness as well
595     * as the exepected element.
596     *
597     * @return the expected and acual elements
598     */
599    public String getOffender()
600    {
601        if ( isWellformed() )
602        {
603            return null;
604        }
605
606        return errors.get( errors.size() - 1 );
607    }
608
609    /**
610     * Gets the list of errors found during wellformedness-check
611     *
612     * @return a list of String of error messages
613     */
614    public List<String> getOffenders()
615    {
616        return errors;
617    }
618
619    /**
620     * Checks wether a newly encountered end-tag breaks the wellformedness
621     * of the model.
622     *
623     * @param actual the local-name of the encountered element
624     */
625    private void checkWellformedness( String actual )
626    {
627        String expected = elements.pop();
628
629        if ( !expected.equals( actual ) )
630        {
631            errors.add( "Encountered closing: " + actual + ", expected " + expected );
632        }
633    }
634
635    /**
636     * Starts a new element and puts it on the stack in order to calculate
637     * wellformedness of the model at a later point of time.
638     *
639     * @param string the local-name of the start-tag
640     */
641    private void startElement( String string )
642    {
643        elements.push( string );
644    }
645
646    /** {@inheritDoc} */
647    public void head( SinkEventAttributes attributes )
648    {
649        head();
650    }
651
652    /** {@inheritDoc} */
653    public void title( SinkEventAttributes attributes )
654    {
655        title();
656    }
657
658    /** {@inheritDoc} */
659    public void author( SinkEventAttributes attributes )
660    {
661        author();
662    }
663
664    /** {@inheritDoc} */
665    public void date( SinkEventAttributes attributes )
666    {
667        date();
668    }
669
670    /** {@inheritDoc} */
671    public void body( SinkEventAttributes attributes )
672    {
673        body();
674    }
675
676    /** {@inheritDoc} */
677    public void section( int level, SinkEventAttributes attributes )
678    {
679        startElement( "section" + level );
680    }
681
682    /** {@inheritDoc} */
683    public void section_( int level )
684    {
685        checkWellformedness( "section" + level );
686    }
687
688    /** {@inheritDoc} */
689    public void sectionTitle( int level, SinkEventAttributes attributes )
690    {
691        startElement( "sectionTitle" + level );
692    }
693
694    /** {@inheritDoc} */
695    public void sectionTitle_( int level )
696    {
697        checkWellformedness( "sectionTitle" + level );
698    }
699
700    /** {@inheritDoc} */
701    public void list( SinkEventAttributes attributes )
702    {
703        list();
704    }
705
706    /** {@inheritDoc} */
707    public void listItem( SinkEventAttributes attributes )
708    {
709        listItem();
710    }
711
712    /** {@inheritDoc} */
713    public void numberedList( int numbering, SinkEventAttributes attributes )
714    {
715        numberedList( numbering );
716    }
717
718    /** {@inheritDoc} */
719    public void numberedListItem( SinkEventAttributes attributes )
720    {
721        numberedListItem();
722    }
723
724    /** {@inheritDoc} */
725    public void definitionList( SinkEventAttributes attributes )
726    {
727        definitionList();
728    }
729
730    /** {@inheritDoc} */
731    public void definitionListItem( SinkEventAttributes attributes )
732    {
733        definitionListItem();
734    }
735
736    /** {@inheritDoc} */
737    public void definition( SinkEventAttributes attributes )
738    {
739        definition();
740    }
741
742    /** {@inheritDoc} */
743    public void definedTerm( SinkEventAttributes attributes )
744    {
745        definedTerm();
746    }
747
748    /** {@inheritDoc} */
749    public void figure( SinkEventAttributes attributes )
750    {
751        figure();
752    }
753
754    /** {@inheritDoc} */
755    public void figureCaption( SinkEventAttributes attributes )
756    {
757        figureCaption();
758    }
759
760    /** {@inheritDoc} */
761    public void figureGraphics( String src, SinkEventAttributes attributes )
762    {
763        figureGraphics( src );
764    }
765
766    /** {@inheritDoc} */
767    public void table( SinkEventAttributes attributes )
768    {
769        table();
770    }
771
772    /** {@inheritDoc} */
773    public void tableRow( SinkEventAttributes attributes )
774    {
775        tableRow();
776    }
777
778    /** {@inheritDoc} */
779    public void tableCell( SinkEventAttributes attributes )
780    {
781        tableCell();
782    }
783
784    /** {@inheritDoc} */
785    public void tableHeaderCell( SinkEventAttributes attributes )
786    {
787        tableHeaderCell();
788    }
789
790    /** {@inheritDoc} */
791    public void tableCaption( SinkEventAttributes attributes )
792    {
793        tableCaption();
794    }
795
796    /** {@inheritDoc} */
797    public void paragraph( SinkEventAttributes attributes )
798    {
799        paragraph();
800    }
801
802    /** {@inheritDoc} */
803    public void verbatim( SinkEventAttributes attributes )
804    {
805        verbatim( false );
806    }
807
808    /** {@inheritDoc} */
809    public void horizontalRule( SinkEventAttributes attributes )
810    {
811        horizontalRule();
812    }
813
814    /** {@inheritDoc} */
815    public void anchor( String name, SinkEventAttributes attributes )
816    {
817        anchor( name );
818    }
819
820    /** {@inheritDoc} */
821    public void link( String name, SinkEventAttributes attributes )
822    {
823        link( name );
824    }
825
826    /** {@inheritDoc} */
827    public void lineBreak( SinkEventAttributes attributes )
828    {
829        lineBreak();
830    }
831
832    /** {@inheritDoc} */
833    public void text( String text, SinkEventAttributes attributes )
834    {
835        text( text );
836    }
837
838    /** {@inheritDoc} */
839    public void unknown( String name, Object[] requiredParams, SinkEventAttributes attributes )
840    {
841        // ignore
842    }
843}