Browse Source

Enhanced project metadata

- Will now include description
- Can provide a project list when calling /metadata/
- Will now report project does not exist when the user does not have right to read the project
master
LO Kam Tao Leo 4 years ago
parent
commit
249e32e3f4
  1. 45
      src/org/leolo/web/dm/dao/ProjectDao.java
  2. 18
      src/org/leolo/web/dm/model/Project.java
  3. 20
      src/org/leolo/web/dm/servlet/ProjectMetadataServlet.java

45
src/org/leolo/web/dm/dao/ProjectDao.java

@ -80,12 +80,13 @@ public class ProjectDao extends BaseDao{
Vector<String> names = new Vector<>();
try(
Connection conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement("SELECT project_path FROM project WHERE UPPER(project_path) = ?")
PreparedStatement pstmt = conn.prepareStatement("SELECT project_id, project_path FROM project WHERE UPPER(project_path) = ?")
){
pstmt.setString(1, path.toUpperCase());
try(ResultSet rs = pstmt.executeQuery()){
while(rs.next()) {
names.add(rs.getString(1));
if(canReadProject(rs.getInt(1), userId))
names.add(rs.getString(2));
}
}
}catch(SQLException e) {
@ -97,7 +98,7 @@ public class ProjectDao extends BaseDao{
public Project getProjectById(int projectId) {
try(
Connection conn = getConnection();
PreparedStatement stmt = conn.prepareStatement("SELECT project_id, project_path, project_name, mode FROM project WHERE project_id = ?");
PreparedStatement stmt = conn.prepareStatement("SELECT project_id, project_path, project_name, mode,description FROM project WHERE project_id = ?");
){
stmt.setInt(1, projectId);
try(ResultSet rs = stmt.executeQuery()){
@ -111,6 +112,7 @@ public class ProjectDao extends BaseDao{
}else {
proj.setMode(ProjectMode.SLAVE);
}
proj.setDescription(rs.getString(5));
return proj;
}
}
@ -123,7 +125,7 @@ public class ProjectDao extends BaseDao{
public boolean canReadProject(int projectId, int userId) {
try(
Connection conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement("SELECT read FROM project_user WHERE project_id = ? AND user_id = ?")
PreparedStatement pstmt = conn.prepareStatement("SELECT `read` FROM project_user WHERE project_id = ? AND user_id = ?")
){
pstmt.setInt(1, projectId);
pstmt.setInt(2, userId);
@ -143,4 +145,39 @@ public class ProjectDao extends BaseDao{
}
return false;//default
}
public Collection<Project> getAllProjects(int userId){
Vector<Project> v = new Vector<>();
String sql = "SELECT p.project_id, project_path, project_name, mode, description, nvl(pu.`read`,dpu.`read`) "
+ "FROM project p "
+ "JOIN project_user dpu ON p.project_id = dpu.project_id AND dpu.user_id = ? "
+ "LEFT OUTER JOIN project_user pu ON p.project_id = pu.project_id AND pu.user_id = ?";
try(
Connection conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
){
pstmt.setInt(1, Constant.COM_DEFAULT_USER_ID);
pstmt.setInt(2, userId);
try(ResultSet rs = pstmt.executeQuery()){
while(rs.next()) {
if(1==rs.getInt(6)) {
Project proj = new Project();
proj.setProjectId(rs.getInt(1));
proj.setProjectPath(rs.getString(2));
proj.setProjectName(rs.getString(3));
if("master".equalsIgnoreCase(rs.getString(4))) {
proj.setMode(ProjectMode.MASTER);
}else {
proj.setMode(ProjectMode.SLAVE);
}
proj.setDescription(rs.getString(5));
v.add(proj);
}
}
}
}catch(SQLException e) {
log.error(e.getMessage(), e);
}
return v;
}
}

18
src/org/leolo/web/dm/model/Project.java

@ -1,10 +1,13 @@
package org.leolo.web.dm.model;
import org.json.JSONObject;
public class Project {
private int projectId;
private String projectPath;
private String projectName;
private ProjectMode mode;
private String description;
public int getProjectId() {
return projectId;
}
@ -29,4 +32,19 @@ public class Project {
public void setMode(ProjectMode mode) {
this.mode = mode;
}
public JSONObject getShortJSONObject() {
JSONObject obj = new JSONObject();
obj.put("id", projectId);
obj.put("name", projectName);
obj.put("path", projectPath);
obj.put("description", description);
return obj;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}

20
src/org/leolo/web/dm/servlet/ProjectMetadataServlet.java

@ -36,26 +36,38 @@ public class ProjectMetadataServlet extends BaseServlet {
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
super.doGet(request, response);
if(this.fatalError) {
return;
}
response.setContentType("application/json");
log.info("URL: {}", request.getRequestURI());
log.info("User is {}", userName);
String projectPath = request.getRequestURI().substring(request.getContextPath().length()+10).trim();
String projectPath;
if(request.getRequestURI().length() < request.getContextPath().length()+10) {
projectPath = "";
}else {
projectPath = request.getRequestURI().substring(request.getContextPath().length()+10).trim();
}
log.info("Project Requested: {}", projectPath);
ProjectDao projDao = new ProjectDao();
JSONObject retObj = new JSONObject();
if(projectPath.length()==0) {
//list all project
retObj.put("status", "success");
//TODO: list all project
projDao.getAllProjects(userId).forEach(proj -> {
retObj.append("projects", proj.getShortJSONObject());
});
retObj.write(response.getWriter());
return;
}
ProjectDao projDao = new ProjectDao();
Project proj = projDao.getProjectByPath(projectPath);
if(proj==null || projDao.canReadProject(proj.getProjectId(), userId)) {
if(proj==null || !projDao.canReadProject(proj.getProjectId(), userId)) {
response.setStatus(404);
retObj.put("status", "error");
retObj.put("message", "Specified project cannot be found");
retObj.put("requested", projectPath);
Collection<String> names = projDao.getProjectPathsIgnoreCase(projectPath);
Collection<String> names = projDao.getProjectPathsIgnoreCase(projectPath, userId);
for(String name:names) {
retObj.append("suggestedPaths", name);
}

Loading…
Cancel
Save