1 21 package com.jaspersoft.jasperserver.api.engine.jasperreports.util; 22 23 import java.io.InputStream ; 24 import java.util.ArrayList ; 25 import java.util.HashSet ; 26 import java.util.List ; 27 import java.util.Set ; 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 53 public class ResourceCollector 54 { 55 private static final String REPO_URL_PROTOCOL = "repo:"; 56 57 private List resources = new ArrayList (); 58 private Set resourceNames = new HashSet (); 59 60 63 private ResourceCollector() 64 { 65 } 66 67 70 public static Resource[] getResources(InputStream 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 92 private Resource[] getResources() 93 { 94 return (Resource[]) resources.toArray(new Resource[resources.size()]); 95 } 96 97 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 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 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 188 private void collectFont(String pdfFontName) 189 { 190 if ( 191 pdfFontName != null 192 && pdfFontName.startsWith(REPO_URL_PROTOCOL) 193 && pdfFontName.indexOf('/') < 0 194 ) 195 { 196 String 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 214 private void collectFromExpression(JRExpression expression, String 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 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 |