View Javadoc

1   package org.lsst.ccs.release.management;
2   
3   import java.io.IOException;
4   import java.sql.Connection;
5   import java.sql.PreparedStatement;
6   import java.sql.ResultSet;
7   import java.sql.SQLException;
8   import javax.servlet.ServletException;
9   import javax.servlet.http.HttpServlet;
10  import javax.servlet.http.HttpServletRequest;
11  import javax.servlet.http.HttpServletResponse;
12  import org.json.JSONException;
13  import org.srs.web.base.db.ConnectionManager;
14  
15  /**
16   *
17   * @author turri
18   */
19  public class ReleaseManagementServlet extends HttpServlet {
20  
21      static String[] subsystemModules = {"buses", "main", "gui"};
22  
23      @Override
24      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
25  
26          //Parameters passed to the servlet
27          String projectName = req.getParameter("projectName");
28          String releaseVersion = req.getParameter("releaseVersion");
29          String snapshotVersion = req.getParameter("snapshotVersion");
30          String projectType = req.getParameter("projectType");
31          String projectDescription = req.getParameter("projectDescription");
32          String projectJiraProject = req.getParameter("projectJiraProject");
33          String projectJiraPrefix = req.getParameter("projectJiraPrefix");
34  
35          if (projectName != null) {
36  
37              // Create connection to ccs database
38              Connection conn = null;
39              try {
40                  conn = ConnectionManager.getConnection("jdbc/ccs");
41                  conn.setAutoCommit(true);
42  
43                  // Create or update project information
44                  String projectCheckQuery = "select * from ccs_Projects where name = ?";
45                  PreparedStatement projectCheckStat = conn.prepareStatement(projectCheckQuery);
46                  projectCheckStat.setString(1, projectName);
47                  ResultSet projectCheckResult = projectCheckStat.executeQuery();
48                  // Variable to tell if the project already exists in the tables
49                  boolean projectExists = projectCheckResult.next();
50                  if (!projectExists) {
51                      PreparedStatement insertProjectStat = conn.prepareStatement("insert into ccs_Projects (name) values (?)");
52                      insertProjectStat.setString(1, projectName);
53                      insertProjectStat.executeUpdate();
54  
55                      PreparedStatement insertProjectDisplay = conn.prepareStatement("insert into ccs_Project_Display (projectName, projectSiteLocation, projectOrder, links) values (?,?,?,?)");
56  
57                      int order = 100;
58  
59                      if (projectType.equals("subsystem")) {
60  
61                          insertProjectDisplay.setString(1, projectName);
62                          insertProjectDisplay.setString(2, "subsystems");
63                          insertProjectDisplay.setInt(3, order);
64                          insertProjectDisplay.setString(4, "apidoc,sourcecode,testcode,dependencies,tests,graph");
65                          insertProjectDisplay.executeUpdate();
66  
67                          for (String mod : subsystemModules) {
68                              String moduleName = projectName + "-" + mod;
69                              PreparedStatement createModule = conn.prepareStatement("insert into ccs_Project_Modules (moduleName,projectName) values (?,?)");
70                              createModule.setString(1, moduleName);
71                              createModule.setString(2, projectName);
72                              createModule.executeUpdate();
73  
74                              order++;
75                              insertProjectDisplay.setString(1, moduleName);
76                              insertProjectDisplay.setString(2, moduleName);
77                              insertProjectDisplay.setInt(3, order);
78                              insertProjectDisplay.setString(4, "apidoc,sourcecode,testcode,dependencies,tests,jdepend,graph,findbugs,dist");
79                              insertProjectDisplay.executeUpdate();
80                          }
81  
82                      } else if (projectType.equals("driver")) {
83                          insertProjectDisplay.setString(1, projectName);
84                          insertProjectDisplay.setString(2, "drivers");
85                          insertProjectDisplay.setInt(3, order);
86                          insertProjectDisplay.setString(4, "apidoc,sourcecode,testcode,dependencies,tests,jdepend,graph,findbugs,dist");
87                          insertProjectDisplay.executeUpdate();
88                      }
89  
90                  }
91  
92                  resp.getWriter().print("Updating information for project " + projectName + "\n");
93                  resp.getWriter().print("\tDescription: " + emptyStringIfNull(projectDescription) + "\n");
94                  resp.getWriter().print("\tType: " + emptyStringIfNull(projectType) + "\n");
95                  resp.getWriter().print("\tJira Project: " + emptyStringIfNull(projectJiraProject) + "\n");
96                  resp.getWriter().print("\tJira Prefix: " + emptyStringIfNull(projectJiraPrefix) + "\n");
97  
98                  // Update the project's information
99                  PreparedStatement projectInfoUpdateStat = conn.prepareStatement("update ccs_Projects set description=?, jiraProject=?, jiraVersionPrefix=?, type=? where name=?");
100                 projectInfoUpdateStat.setString(1, emptyStringIfNull(projectDescription));
101                 projectInfoUpdateStat.setString(2, emptyStringIfNull(projectJiraProject));
102                 projectInfoUpdateStat.setString(3, emptyStringIfNull(projectJiraPrefix));
103                 projectInfoUpdateStat.setString(4, emptyStringIfNull(projectType));
104                 projectInfoUpdateStat.setString(5, projectName);
105                 projectInfoUpdateStat.executeUpdate();
106 
107                 // If it's a RELEASE
108                 if (releaseVersion != null && !"".equals(releaseVersion)) {
109                     // Select the corresponding release cycle, either the active one or create a default one
110                     PreparedStatement activeRelCycleStat = conn.prepareStatement("select * from ccs_Release_Cycle where released = 0 and active = 1");
111                     ResultSet activeRelCycleResult = activeRelCycleStat.executeQuery();
112                     String relCycle = null;
113                     if (activeRelCycleResult.next()) {
114                         relCycle = activeRelCycleResult.getString("name");
115                     } else {
116                         java.text.DateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd");
117                         relCycle = df.format(new java.util.Date());
118                         //Now add the release Cycle
119                         try {
120                             PreparedStatement createRelCycleStat = conn.prepareStatement("insert into ccs_Release_Cycle (name,date) values (?,(select current_date from dual))");
121                             createRelCycleStat.setString(1, relCycle);
122                             createRelCycleStat.executeUpdate();
123                             resp.getWriter().print("\nCreated Release Cycle " + relCycle + "https://srs.slac.stanford.edu/releaseManagement/releaseCycles.jsp\n");
124                         } catch (Exception e) {
125                             //Silently ignore failure in case the rel cycle already exists.
126                         }
127                     }
128 
129                     // Now add the version to the project versions table
130                     PreparedStatement addReleaseStat = conn.prepareStatement("insert into ccs_Project_Version (projectName,version,relCycle,created,isSnapshot) values (?,?,?,(select current_timestamp from dual),0)");
131                     addReleaseStat.setString(1, projectName);
132                     addReleaseStat.setString(2, releaseVersion);
133                     addReleaseStat.setString(3, relCycle);
134                     addReleaseStat.executeUpdate();
135 
136                     resp.getWriter().print("Added Release " + releaseVersion + " to project " + projectName + " https://srs.slac.stanford.edu/releaseManagement/projectVersions.jsp?projectName=" + projectName + "for Release Cycle " + relCycle + "https://srs.slac.stanford.edu/releaseManagement/releaseNotes.jsp?relCycle=" + relCycle + "\n");
137 
138                     // Remove SNAPSHOT version if it exists.
139                     PreparedStatement removeSnapshotStat = conn.prepareStatement("delete from ccs_Project_Version where projectName = ? and version = ?");
140                     removeSnapshotStat.setString(1, projectName);
141                     removeSnapshotStat.setString(2, releaseVersion + "-SNAPSHOT");
142                     removeSnapshotStat.executeUpdate();
143 
144                     // Finally update the version in the Release Cycle Versions
145                     if (relCycle != null) {
146                         PreparedStatement updateResCycleVersions = conn.prepareStatement("update ccs_Release_Cycle_Versions set version = ? where projectName = ? and relCycle = ? ");
147                         updateResCycleVersions.setString(1, releaseVersion);
148                         updateResCycleVersions.setString(2, projectName);
149                         updateResCycleVersions.setString(3, relCycle);
150                         updateResCycleVersions.executeUpdate();
151                     }
152 
153                 }
154 
155                 // If it's a SNAPSHOT
156                 if (snapshotVersion != null && !"".equals(snapshotVersion)) {
157                     try {
158                         //Add the SNAPSHOT version to the project version table
159                         PreparedStatement addSnapshotToProject = conn.prepareStatement("insert into ccs_Project_Version (projectName,version,created) values (?,?,(select current_timestamp from dual))");
160                         addSnapshotToProject.setString(1, projectName);
161                         addSnapshotToProject.setString(2, snapshotVersion);
162                         addSnapshotToProject.executeUpdate();
163                         resp.getWriter().print("Added Snapshot " + snapshotVersion + " to project " + projectName + "https://srs.slac.stanford.edu/releaseManagement/projectVersions.jsp?projectName=" + projectName + "\n");
164                     } catch (IOException | SQLException e) {
165 
166                     }
167                 }
168 
169                 if (projectJiraProject != null && !"".equals(projectJiraProject)) {
170                     String jiraRelVersion = releaseVersion;
171                     String jiraNextVersion = snapshotVersion;
172                     if (projectJiraPrefix != null && !"".equals(projectJiraPrefix)) {
173                         if (jiraRelVersion != null && !"".equals(jiraRelVersion)) {
174                             jiraRelVersion = projectJiraPrefix + "-" + jiraRelVersion;
175                         }
176                         if (jiraNextVersion != null && !"".equals(jiraNextVersion)) {
177                             jiraNextVersion = projectJiraPrefix + "-" + jiraNextVersion;
178                         }
179                     }
180                     try {
181                         JiraVersionManagement.updateJiraVersions(projectJiraProject, jiraRelVersion, jiraNextVersion);
182                     } catch (JSONException ex) {
183                         resp.getWriter().print("Problem updating Jira projects\n");
184                         resp.getWriter().print(ex.getMessage() + "\n");
185                     }
186 
187                 }
188 
189             } catch (Exception ex) {
190                 resp.getWriter().print(ex.getMessage());
191 
192             } finally {
193                 try {
194                     conn.close();
195                 } catch (SQLException ex) {
196                     resp.getWriter().print(ex.getMessage());
197                 }
198             }
199         } else {
200             resp.getWriter().print("ReleaseManagementServlet: no projectName was provided.");
201         }
202 
203     }
204 
205     private static String emptyStringIfNull(String value) {
206         return value == null ? "" : value;
207     }
208 
209 }