KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > jaspersoft > jasperserver > api > engine > jasperreports > util > ResourceCollector


1 /*
2  * Copyright (C) 2006 JasperSoft http://www.jaspersoft.com
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed WITHOUT ANY WARRANTY; and without the
10  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11  * See the GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, see http://www.gnu.org/licenses/gpl.txt
15  * or write to:
16  *
17  * Free Software Foundation, Inc.,
18  * 59 Temple Place - Suite 330,
19  * Boston, MA USA 02111-1307
20  */

21 package com.jaspersoft.jasperserver.api.engine.jasperreports.util;
22
23 import java.io.InputStream JavaDoc;
24 import java.util.ArrayList JavaDoc;
25 import java.util.HashSet JavaDoc;
26 import java.util.List JavaDoc;
27 import java.util.Set JavaDoc;
28
29 import net.sf.jasperreports.engine.JRBand;
30 import net.sf.jasperreports.engine.JRElement;
31 import net.sf.jasperreports.engine.JRException;
32 import net.sf.jasperreports.engine.JRExpression;
33 import net.sf.jasperreports.engine.JRExpressionChunk;
34 import net.sf.jasperreports.engine.JRFont;
35 import net.sf.jasperreports.engine.JRGroup;
36 import net.sf.jasperreports.engine.JRImage;
37 import net.sf.jasperreports.engine.JRReport;
38 import net.sf.jasperreports.engine.JRStyle;
39 import net.sf.jasperreports.engine.JRSubreport;
40 import net.sf.jasperreports.engine.design.JasperDesign;
41 import net.sf.jasperreports.engine.xml.JRXmlLoader;
42
43 import com.jaspersoft.jasperserver.api.JSExceptionWrapper;
44 import com.jaspersoft.jasperserver.api.metadata.common.domain.FileResource;
45 import com.jaspersoft.jasperserver.api.metadata.common.domain.Resource;
46 import com.jaspersoft.jasperserver.api.metadata.common.domain.client.FileResourceImpl;
47
48
49 /**
50  * @author Teodor Danciu (teodord@users.sourceforge.net)
51  * @version $Id: AbstractAttributedObject.java 2140 2006-02-21 06:41:21Z tony $
52  */

53 public class ResourceCollector
54 {
55     private static final String JavaDoc REPO_URL_PROTOCOL = "repo:";
56     
57     private List JavaDoc resources = new ArrayList JavaDoc();
58     private Set JavaDoc resourceNames = new HashSet JavaDoc();
59     
60     /**
61      *
62      */

63     private ResourceCollector()
64     {
65     }
66
67     /**
68      *
69      */

70     public static Resource[] getResources(InputStream JavaDoc jrxmlStream)
71     {
72         JasperDesign jasperDesign = null;
73
74         try
75         {
76             jasperDesign = JRXmlLoader.load(jrxmlStream);
77         }
78         catch (JRException e)
79         {
80             throw new JSExceptionWrapper(e);
81         }
82         
83         ResourceCollector collector = new ResourceCollector();
84         collector.collect(jasperDesign);
85         
86         return collector.getResources();
87     }
88
89     /**
90      *
91      */

92     private Resource[] getResources()
93     {
94         return (Resource[]) resources.toArray(new Resource[resources.size()]);
95     }
96
97     /**
98      *
99      */

100     private void collect(JRReport report)
101     {
102         if (report != null)
103         {
104             JRStyle[] styles = report.getStyles();
105             if (styles != null)
106             {
107                 for (int i = 0; i < styles.length; i++)
108                 {
109                     collect(styles[i]);
110                 }
111             }
112             
113             collect(report.getBackground());
114             collect(report.getTitle());
115             collect(report.getPageHeader());
116             collect(report.getColumnHeader());
117             collect(report.getDetail());
118             collect(report.getColumnFooter());
119             collect(report.getPageFooter());
120             collect(report.getSummary());
121             
122             JRGroup[] groups = report.getGroups();
123             if (groups != null)
124             {
125                 for(int i = 0; i < groups.length; i++)
126                 {
127                     JRGroup group = groups[i];
128                     collect(group.getGroupHeader());
129                     collect(group.getGroupFooter());
130                 }
131             }
132         }
133     }
134
135     /**
136      *
137      */

138     private void collect(JRStyle style)
139     {
140         collectFont(style.getOwnPdfFontName());
141
142         JRStyle[] conditionalStyles = style.getConditionalStyles();
143         if (conditionalStyles != null)
144         {
145             for (int i = 0; i < conditionalStyles.length; i++)
146             {
147                 collect(conditionalStyles[i]);
148             }
149         }
150     }
151
152     /**
153      *
154      */

155     private void collect(JRBand band)
156     {
157         if (band != null)
158         {
159             JRElement[] elements = band.getElements();
160             if (elements != null)
161             {
162                 for(int i = 0; i < elements.length; i++)
163                 {
164                     JRElement element = elements[i];
165                     if (element instanceof JRFont)
166                     {
167                         JRFont font = (JRFont)element;
168                         collectFont(font.getOwnPdfFontName());
169                     }
170                     else if (element instanceof JRImage)
171                     {
172                         JRImage image = (JRImage)element;
173                         collectFromExpression(image.getExpression(), FileResource.TYPE_IMAGE);
174                     }
175                     else if (element instanceof JRSubreport)
176                     {
177                         JRSubreport subreport = (JRSubreport)element;
178                         collectFromExpression(subreport.getExpression(), FileResource.TYPE_JRXML);
179                     }
180                 }
181             }
182         }
183     }
184
185     /**
186      *
187      */

188     private void collectFont(String JavaDoc pdfFontName)
189     {
190         if (
191             pdfFontName != null
192             && pdfFontName.startsWith(REPO_URL_PROTOCOL)
193             && pdfFontName.indexOf('/') < 0
194             )
195         {
196             String JavaDoc resourceName = pdfFontName.substring(REPO_URL_PROTOCOL.length());
197             if (!resourceNames.contains(resourceName))
198             {
199                 FileResource resource = new FileResourceImpl();
200                 resource.setName(resourceName);
201                 resource.setLabel(resource.getName());
202                 resource.setDescription(resource.getName());
203                 resource.setFileType(FileResource.TYPE_FONT);
204
205                 resources.add(resource);
206                 resourceNames.add(resourceName);
207             }
208         }
209     }
210
211     /**
212      *
213      */

214     private void collectFromExpression(JRExpression expression, String JavaDoc resourceType)
215     {
216         if (
217             expression != null
218             && expression.getChunks() != null
219             && expression.getChunks().length == 1
220             )
221         {
222             JRExpressionChunk chunk = expression.getChunks()[0];
223             if (chunk.getType() == JRExpressionChunk.TYPE_TEXT)
224             {
225                 String JavaDoc resourceName = chunk.getText().trim();
226                 if (
227                     resourceName.startsWith("\"" + REPO_URL_PROTOCOL)
228                     && resourceName.indexOf('/') < 0
229                     && resourceName.endsWith("\"")
230                     )
231                 {
232                     resourceName = resourceName.substring(REPO_URL_PROTOCOL.length() + 1, resourceName.length() - 1);
233                     if (!resourceNames.contains(resourceName))
234                     {
235                         FileResource resource = new FileResourceImpl();
236                         resource.setName(resourceName);
237                         resource.setLabel(resource.getName());
238                         resource.setDescription(resource.getName());
239                         resource.setFileType(resourceType);
240
241                         resources.add(resource);
242                         resourceNames.add(resourceName);
243                     }
244                 }
245             }
246         }
247     }
248
249 }
250
Popular Tags