1 package org.testng;
2 
3 import org.testng.collections.Lists;
4 import org.testng.internal.ClassHelper;
5 import org.testng.internal.IPropertyUtils;
6 import org.testng.internal.PropertyUtilsFactory;
7 import org.testng.internal.Utils;
8 
9 import java.util.List;
10 
11 /**
12  * Stores the information regarding the configuration of a pluggable report listener. Used also
13  * in conjunction with the <reporter> sub-element of the Ant task
14  *
15  * NOTE: this class needs to be public. It's used by TestNG Ant task
16  *
17  * @author Cosmin Marginean, Apr 12, 2007
18  */
19 public class ReporterConfig {
20 
21   /**
22    * The class name of the reporter listener
23    */
24   private String m_className;
25 
26   /**
27    * The properties of the reporter listener
28    */
29   private List<Property> m_properties = Lists.newArrayList();
30 
31   /**
32    * JavaBeans properties access helper
33    */
34   private IPropertyUtils mPropertyUtils = PropertyUtilsFactory.newInstance();
35 
addProperty(Property property)36   public void addProperty(Property property) {
37     m_properties.add(property);
38   }
39 
getProperties()40   public List<Property> getProperties() {
41     return m_properties;
42   }
43 
getClassName()44   public String getClassName() {
45     return m_className;
46   }
47 
setClassName(String className)48   public void setClassName(String className) {
49     this.m_className = className;
50   }
51 
serialize()52   public String serialize() {
53     StringBuffer sb = new StringBuffer();
54     sb.append(m_className);
55     if (!m_properties.isEmpty()) {
56       sb.append(":");
57 
58       for (int i = 0; i < m_properties.size(); i++) {
59         ReporterConfig.Property property = m_properties.get(i);
60         sb.append(property.getName());
61         sb.append("=");
62         sb.append(property.getValue());
63         if (i < m_properties.size() - 1) {
64           sb.append(",");
65         }
66       }
67     }
68     return sb.toString();
69   }
70 
deserialize(String inputString)71   public static ReporterConfig deserialize(String inputString) {
72     ReporterConfig reporterConfig = null;
73     if (!Utils.isStringEmpty(inputString)) {
74       reporterConfig = new ReporterConfig();
75       int clsNameEndIndex = inputString.indexOf(":");
76       if (clsNameEndIndex == -1) {
77         reporterConfig.setClassName(inputString);
78       } else {
79         reporterConfig.setClassName(inputString.substring(0, clsNameEndIndex));
80         String propString = inputString.substring(clsNameEndIndex + 1, inputString.length());
81         String[] props = propString.split(",");
82         if ((props != null) && (props.length > 0)) {
83           for (String prop : props) {
84             String[] propNameAndVal = prop.split("=");
85             if ((propNameAndVal != null) && (propNameAndVal.length == 2)) {
86               Property property = new Property();
87               property.setName(propNameAndVal[0]);
88               property.setValue(propNameAndVal[1]);
89               reporterConfig.addProperty(property);
90             }
91           }
92         }
93       }
94 
95     }
96     return reporterConfig;
97   }
98 
99   /**
100    * Creates a reporter based on the current configuration
101    */
newReporterInstance()102   public Object newReporterInstance() {
103     Object result = null;
104     Class reporterClass = ClassHelper.forName(m_className);
105     if (reporterClass != null) {
106       result = ClassHelper.newInstance(reporterClass);
107       for (ReporterConfig.Property property : m_properties) {
108         mPropertyUtils.setProperty(result, property.getName(), property.getValue());
109       }
110     }
111     return result;
112   }
113 
114   public static class Property {
115     private String name;
116     private String value;
117 
getName()118     public String getName() {
119       return name;
120     }
121 
setName(String name)122     public void setName(String name) {
123       this.name = name;
124     }
125 
getValue()126     public String getValue() {
127       return value;
128     }
129 
setValue(String value)130     public void setValue(String value) {
131       this.value = value;
132     }
133   }
134 
135   @Override
toString()136   public String toString() {
137     StringBuffer buf = new StringBuffer();
138     buf.append("\nClass = " + m_className);
139     for (Property prop : m_properties) {
140       buf.append("\n\t " + prop.getName() + "=" + prop.getValue());
141     }
142     return buf.toString();
143   }
144 }
145