package hudson.plugins.dbcharts; import hudson.Extension; import hudson.model.AbstractProject; import hudson.model.Action; import hudson.model.Descriptor; import hudson.model.Hudson; import hudson.plugins.dbcharts.CustomJDBCConnection.CustomJDBCConnectionDescriptor; import hudson.plugins.dbcharts.MySQLJDBCConnection.MySQLJDBCConnectionDescriptor; import hudson.plugins.dbcharts.PostgresqlJDBCConnection.PostgresqlJDBCConnectionDescriptor; import hudson.tasks.BuildStepDescriptor; import hudson.tasks.BuildStepMonitor; import hudson.tasks.Publisher; import hudson.tasks.Recorder; import hudson.util.FormValidation; import java.io.IOException; import java.sql.Driver; import java.sql.DriverManager; import java.util.Arrays; import java.util.Enumeration; import java.util.LinkedList; import java.util.List; import java.util.logging.Logger; import javax.servlet.ServletException; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; @Extension public class DbChartPublisher extends Recorder { static final Logger logger=Logger.getLogger( DbChartPublisher.class.getCanonicalName() ); private final List<Chart> charts; public DbChartPublisher() { charts=new LinkedList<Chart>(); } @DataBoundConstructor public DbChartPublisher(List<Chart> charts) { this.charts=charts; } public List<Chart> getCharts() { return charts; } @SuppressWarnings("unchecked") @Override public Action getProjectAction( AbstractProject project ) { logger.info("DbChartPublisher.getProjectAction called"); return new DbChartAction(project,this); } public BuildStepMonitor getRequiredMonitorService() { return BuildStepMonitor.NONE; } @Override public DescriptorImpl getDescriptor() { logger.info("DbChartPublisher.getDescriptor() called"); return (DescriptorImpl)super.getDescriptor(); } @Extension public static final class DescriptorImpl extends BuildStepDescriptor<Publisher>{ private static final Logger logger=Logger.getLogger( DescriptorImpl.class.getCanonicalName() ); public List<JDBCConnection> connections; public DescriptorImpl() { logger.fine("DescriptorImpl constructed"); load(); } public List<JDBCConnection> getConnections() { return connections; } public List<String> getDrivers(){ Enumeration<Driver> e=DriverManager.getDrivers(); List<String> res=new LinkedList<String>(); while(e.hasMoreElements()){ res.add( e.nextElement().getClass().getCanonicalName() ); } logger.fine( "DescriptorImpl.getDrivers returned:"+Arrays.toString( res.toArray()) ); return res; } @SuppressWarnings("unchecked") @Override public boolean isApplicable( Class<? extends AbstractProject> jobType ) { return true; } @Override public String getDisplayName() { return "dbCharts configuration"; } @Override public boolean configure( StaplerRequest req, JSONObject json ) throws hudson.model.Descriptor.FormException { logger.fine( "DescriptorImpl.configure:"+json ); connections = new LinkedList<JDBCConnection>(); Object ob=json.get( "connections" ); try{ if (ob instanceof JSONArray) { for(Object o:(JSONArray)ob){ JDBCConnection c=(JDBCConnection)Class.forName( ((JSONObject)o).getString("stapler-class")) .getConstructor( JSONObject.class ) .newInstance(o); connections.add( c); } } else if (ob!=null) { JDBCConnection c=(JDBCConnection)Class.forName( ((JSONObject)ob).getString("stapler-class")) .getConstructor( JSONObject.class ) .newInstance(ob); connections.add( c); } }catch(Exception e){ throw new FormException( "Failed to save dbCharts connections", e, "connections" ); } save(); return super.configure( req, json ); } public FormValidation doCheckName(@QueryParameter String value) throws IOException, ServletException { if(value.length()==0) return FormValidation.error("Please set a name"); if(value.length()<4) return FormValidation.warning("Isn't the name too short?"); return FormValidation.ok(); } public List<Descriptor> getJDBCConnectionDescriptors(){ List<Descriptor> res=new LinkedList<Descriptor>(); Descriptor<?> custom=Hudson.getInstance().getDescriptorByType( CustomJDBCConnectionDescriptor.class ); Descriptor<?> mysql=Hudson.getInstance().getDescriptorByType( MySQLJDBCConnectionDescriptor.class ); Descriptor<?> pgsql=Hudson.getInstance().getDescriptorByType( PostgresqlJDBCConnectionDescriptor.class ); res.add(mysql); res.add( pgsql ); res.add(custom); logger.fine("getJDBCConnectionDescriptors(): custom="+custom+"; mysql="+mysql); return res; } } }