package net.sourceforge.pmd.eclipse.ui.reports; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Properties; import net.sourceforge.pmd.PropertyDescriptor; import net.sourceforge.pmd.eclipse.plugin.PMDPlugin; import net.sourceforge.pmd.eclipse.runtime.preferences.IPreferences; import net.sourceforge.pmd.renderers.Renderer; import net.sourceforge.pmd.renderers.RendererFactory; /** * * @author Brian Remedios */ public class ReportManager { private final Renderer[] allRenderers; public static final ReportManager instance = new ReportManager(); public static String DefaultReportPropertyFilename = "reportProperties.xml"; private ReportManager() { allRenderers = availableRenderers2(); } public Renderer[] allRenderers() { return allRenderers; } // private Renderer[] knownRenderers() { // // Properties props = new Properties(); // // return new Renderer[] { // new HTMLRenderer(props), // new SummaryHTMLRenderer(props), // new CSVRenderer(props), // new XMLRenderer(props), // new TextRenderer(props), // new VBHTMLRenderer(props) // }; // } public Renderer[] availableRenderers2() { List<Renderer> renderers = new ArrayList<Renderer>(); for (String reportName : RendererFactory.REPORT_FORMAT_TO_RENDERER.keySet()) { renderers.add( RendererFactory.createRenderer(reportName, new Properties()) ); } return renderers.toArray(new Renderer[renderers.size()]); } public List<Renderer> activeRenderers() { List<Renderer> actives = new ArrayList<Renderer>(); IPreferences prefs = PMDPlugin.getDefault().loadPreferences(); for (Renderer renderer : allRenderers) { if (prefs.isActiveRenderer(renderer.getName())) actives.add(renderer); } return actives; } public static String asString(Map<String, String> propertyDefinitions) { if (propertyDefinitions.isEmpty()) return ""; StringBuilder sb = new StringBuilder(); String[] keys = propertyDefinitions.keySet().toArray(new String[propertyDefinitions.size()]); sb.append(keys[0]).append(": ").append(propertyDefinitions.get(keys[0])); for (int i=1; i<keys.length; i++) { sb.append(", ").append(keys[i]).append(": ").append(propertyDefinitions.get(keys[i])); } return sb.toString(); } /** * Derive a map key for the renderer, descriptor pair. * * @param renderer Renderer * @param desc PropertyDescriptor<?> * @return String */ private static String keyOf(Renderer renderer, PropertyDescriptor<?> desc) { return renderer.getName() + "__" + desc.name(); } public static void loadReportProperties() { loadReportProperties(DefaultReportPropertyFilename); } public static void saveReportProperties() { saveReportProperties(DefaultReportPropertyFilename); } /** * Load the properties for all renderers from the specified filename. * Return whether we succeeded or not. * * @param propertyFilename String * @return boolean */ private static boolean loadReportProperties(String propertyFilename) { Properties props = new Properties(); FileInputStream fis = null; try { fis = new FileInputStream(propertyFilename); props.loadFromXML(fis); } catch (Exception e) { return false; } finally{ try { if (fis != null) { fis.close(); } } catch (Exception e) { // ignored } } for (Renderer renderer : ReportManager.instance.allRenderers()) { for (PropertyDescriptor pDesc: renderer.getPropertyDescriptors()) { String key = keyOf(renderer, pDesc); if (props.containsKey(key)) { Object value = pDesc.valueFrom((String)props.get(key)); renderer.setProperty(pDesc, value); } } } return true; } /** * Save the properties of all renderers to the specified filename. * * @param propertyFilename String */ private static void saveReportProperties(String propertyFilename) { Properties props = new Properties(); for (Renderer renderer : ReportManager.instance.allRenderers()) { Map<PropertyDescriptor<?>, Object> valuesByProp = renderer.getPropertiesByPropertyDescriptor(); for (Map.Entry<PropertyDescriptor<?>, Object> entry : valuesByProp.entrySet()) { PropertyDescriptor desc = entry.getKey(); props.put( keyOf(renderer, desc), desc.asDelimitedString(entry.getValue()) ); } } FileOutputStream fos = null; try { fos = new FileOutputStream(propertyFilename); props.storeToXML(fos, "asdf"); } catch (Exception e) { e.printStackTrace(); } finally { try { if (fos != null) { fos.close(); } } catch (Exception e) { // ignored; } } } }