1   package org.apache.maven.plugins.site;
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  import java.io.File;
23  import java.io.IOException;
24  
25  import java.util.Iterator;
26  import java.util.List;
27  import java.util.Locale;
28  
29  import org.apache.maven.doxia.module.xdoc.XdocSinkFactory;
30  import org.apache.maven.doxia.sink.Sink;
31  import org.apache.maven.doxia.site.decoration.DecorationModel;
32  import org.apache.maven.doxia.site.decoration.Menu;
33  import org.apache.maven.doxia.site.decoration.MenuItem;
34  
35  import org.codehaus.plexus.i18n.I18N;
36  
37  
38  
39  
40  
41  
42  
43  
44  public class SiteMap
45   {
46  
47      private String encoding;
48      private I18N i18n;
49  
50      public SiteMap( String encoding, I18N i18n )
51      {
52          this.encoding = encoding;
53          this.i18n = i18n;
54      }
55  
56      
57  
58  
59  
60  
61      public I18N getI18n()
62      {
63          return i18n;
64      }
65  
66      
67  
68  
69  
70  
71      public void setI18n( I18N i18n )
72      {
73          this.i18n = i18n;
74      }
75  
76      
77  
78  
79  
80  
81      public String getEncoding()
82      {
83          return encoding;
84      }
85  
86      
87  
88  
89  
90  
91      public void setEncoding( String enc )
92      {
93          this.encoding = enc;
94      }
95  
96      
97  
98  
99  
100 
101 
102 
103 
104 
105 
106 
107     public void generate( DecorationModel model, File targetDir, Locale locale )
108             throws IOException
109     {
110         File outputDir = new File( targetDir, "xdoc" );
111         Sink sink = new XdocSinkFactory().createSink( outputDir, "sitemap.xml", encoding );
112 
113         try
114         {
115             extract( model, sink, locale );
116         }
117         finally
118         {
119             sink.close();
120         }
121     }
122 
123     private void extract( DecorationModel decoration, Sink sink, Locale locale )
124     {
125         sink.head();
126         sink.title();
127         sink.text( i18n.getString( "site-plugin", locale, "site.sitemap.title" ) );
128         sink.title_();
129         sink.head_();
130         sink.body();
131 
132         sink.section1();
133         sink.sectionTitle1();
134         sink.text( i18n.getString( "site-plugin", locale, "site.sitemap.section.title" ) );
135         sink.sectionTitle1_();
136 
137         sink.paragraph();
138         sink.text( i18n.getString( "site-plugin", locale, "site.sitemap.description" ) );
139         sink.paragraph_();
140 
141         for ( Iterator it = decoration.getMenus().iterator(); it.hasNext(); )
142         {
143             Menu menu = (Menu) it.next();
144 
145             sink.section3();
146             sink.sectionTitle3();
147             sink.text( menu.getName() );
148             sink.sectionTitle3_();
149             sink.horizontalRule();
150 
151             extractItems( menu.getItems(), sink );
152 
153             sink.section3_();
154         }
155 
156         sink.section1_();
157         sink.body_();
158     }
159 
160     private void extractItems( List items, Sink sink )
161     {
162         if ( items == null || items.isEmpty() )
163         {
164             return;
165         }
166 
167         sink.list();
168 
169         for ( Iterator it = items.iterator(); it.hasNext(); )
170         {
171             MenuItem item = (MenuItem) it.next();
172 
173             sink.listItem();
174             sink.link( item.getHref() );
175             sink.text( item.getName() );
176             sink.link_();
177             sink.listItem_();
178 
179             extractItems( item.getItems(), sink );
180         }
181 
182         sink.list_();
183     }
184 }