Project Status #GSoC

Here is small snippet of the work that I have done till now ( taken from : http://notes.openmrs.org/devcall-2011-06-09 )

General Feedback Mechanishm Page – (Gaurav) 10:15-10:30

Presentation :
http://www.scribd.com/doc/57444152/Presentation

Project Wiki Page :
Design Page : https://wiki.openmrs.org/display/projects/General+Feedback+Mechanism+%28Design+Page%29
Implementation Ideas Page : https://wiki.openmrs.org/display/projects/General+Feedback+Mechanism+%28Implementation+Ideas%29

Work Done till now :
Add/Delete Severity
Add/Delete PreDefined Subject
Add/Delete Status
Submit feedback partially complete.
Spanish localization ready (except for Admin Page)

Work still Pending :
Edit severity to be added afterwards by extending severityForm.jsp
Edit Predefined Subject to be added afterwards by extending predefinedSubjectForm.jsp
Edit severity to be added afterwards by extending statusForm.jsp
Functionality to add page context and attachment while submitting feedback.
Edit Preferences option to users.

Admin panel for replying to the feedbacks.
Add submit feedback to the top left panel with jquery popup.
Creator to be replaced by the Username in feedbackList.jsp

Project Status :
Behind the timeline for Admin Panel and ahead in user panel designing.

Screenshots :
Admin Page : http://bit.ly/m2aXdp
Add Status Page : http://bit.ly/m2oPCv
Edit Panel Status :
Add Severity Page : http://bit.ly/j9lGVM
Edit Panel for Severity : http://bit.ly/jZABqn
Add Predefined Subject Page : http://bit.ly/jT5BnI
Edit Panel for Predefined Subject : http://bit.ly/iLsqcJ
Incomplete Manage Feedback Panel : http://bit.ly/kWnSOc
Submit Feedback Page :

Cool things about Hibernate & JSP

Generally people have to do a lot of work to Sanitize the input from the user ( excluding *URL* Sanitize  ). Here is a something that you can do with minimum effort if you are using hibernate & JSP and sanitize everything ( Courtesy Ben Wolfe ) :

1. You *don’t* have to do anything for prevention of SQL injection, its already done by hibernate by the use of the java’s PreparedStatements.
2. XSS can be prevented by displaying data using <c:out value=”${myobject.myvar}”/> instead of just ${myobject.myvar} in your jsp.

W00t !! Got the JIRA Project for FDBK :D

Yesterday over the IRC I got to know through Ben Wolfe that for every module there is a different JIRA project , so that anyone can file bug , request new feature etc etc .Then I created a ticket in JIRA ITSM . Although then through the comment of Michael Downey , I got to know that their are other things that also need to be in pace before getting JIRA project.As soon as I edited the description to incorporate all the changes I got a JIRA Project.

Hibernate Mapping file #tutorial

In this small tutorial I am going to show you how hibernate mapping file is can be created when a SQL relation is given to you.

Let us say you have the following :

CREATE TABLE `feedback_feedback` (
`feedback_id` int(11) NOT NULL AUTO_INCREMENT,
`creator` int(11) NOT NULL,
`subject` varchar(255) COLLATE utf8_bin NOT NULL,
`content` varchar(5000) COLLATE utf8_bin NOT NULL,
`severity` varchar(25) COLLATE utf8_bin NOT NULL,
`comment` varchar(5000) COLLATE utf8_bin DEFAULT NULL,
`status` varchar(25) COLLATE utf8_bin DEFAULT NULL,
`date_created` date NOT NULL,
`date_changed` date DEFAULT NULL,
PRIMARY KEY (`feedback_id`)
)

 

and follwoing POJO :

package org.openmrs.module.feedback;

import java.util.Date;

/*
Pojo file for feedback_feedback relation in Feedback Module
*/

public class FeedbackFeedback  implements java.io.Serializable {

private Integer feedbackId;
private int creator;
private String subject;
private String content;
private String severity;
private String comment;
private String status;
private Date dateCreated;
private Date dateChanged;

/*
Default no arguement constructor
*/

public FeedbackFeedback() {
}

/*
Constructor with all arguments
*/

public FeedbackFeedback(int creator, String subject, String content, String severity, Date dateCreated) {
this.creator = creator;
this.subject = subject;
this.content = content;
this.severity = severity;
this.dateCreated = dateCreated;
}

/*
Default constructor with arguments that can’t be Null
*/

public FeedbackFeedback(int creator, String subject, String content, String severity, String comment, String status, Date dateCreated, Date dateChanged) {
this.creator = creator;
this.subject = subject;
this.content = content;
this.severity = severity;
this.comment = comment;
this.status = status;
this.dateCreated = dateCreated;
this.dateChanged = dateChanged;
}

public Integer getFeedbackId() {
return this.feedbackId;
}

public void setFeedbackId(Integer feedbackId) {
this.feedbackId = feedbackId;
}
public int getCreator() {
return this.creator;
}

public void setCreator(int creator) {
this.creator = creator;
}
public String getSubject() {
return this.subject;
}

public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return this.content;
}

public void setContent(String content) {
this.content = content;
}
public String getSeverity() {
return this.severity;
}

public void setSeverity(String severity) {
this.severity = severity;
}
public String getComment() {
return this.comment;
}

public void setComment(String comment) {
this.comment = comment;
}
public String getStatus() {
return this.status;
}

public void setStatus(String status) {
this.status = status;
}
public Date getDateCreated() {
return this.dateCreated;
}

public void setDateCreated(Date dateCreated) {
this.dateCreated = dateCreated;
}
public Date getDateChanged() {
return this.dateChanged;
}

public void setDateChanged(Date dateChanged) {
this.dateChanged = dateChanged;
}
}

Now you want to create a Hibernate Mapping file for the above given relation then the hibernate mapping file will look somehow like this (explanation is given at the end for important elements) :

<?xml version=”1.0″?>
<!DOCTYPE hibernate-mapping PUBLIC “-//Hibernate/Hibernate Mapping DTD 3.0//EN” “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd“>
<hibernate-mapping package=”org.openmrs.module.feedback” >
<class name=”org.openmrs.module.feedback.FeedbackFeedback” table=”feedback_feedback” >
<id name=”feedbackId” type=”java.lang.Integer”>
<column name=”feedback_id” />
<generator />
</id>
<property name=”creator” type=”int”>
<column name=”creator” not-null=”true” />
</property>
<property name=”subject” type=”string”>
<column name=”subject” not-null=”true” />
</property>
<property name=”content” type=”string”>
<column name=”content” length=”5000″ not-null=”true” />
</property>
<property name=”severity” type=”string”>
<column name=”severity” length=”25″ not-null=”true” />
</property>
<property name=”comment” type=”string”>
<column name=”comment” length=”5000″ />
</property>
<property name=”status” type=”string”>
<column name=”status” length=”25″ />
</property>
<property name=”dateCreated” type=”date”>
<column name=”date_created” length=”10″ not-null=”true” />
</property>
<property name=”dateChanged” type=”date”>
<column name=”date_changed” length=”10″ />
</property>
</class>
</hibernate-mapping>

Comments :

1.      <class name=”org.openmrs.module.feedback.FeedbackFeedback” table=”feedback_feedback” >
This name element tells to which of the POJO class your relation is mapped , and table elements tells which relation you are currently referring to.

2.      <id name=”feedbackId” type=”java.lang.Integer”>
This tell which object in the class you are referring to and its data type. id tag tell it is a primary key.

3.       <column name=”feedback_id” />
This tell to which attribute in relation your class object will be mapped

4.       <generator />
This tell generator element tells how that element value will be generated.

5.       <property name=”severity” type=”string”>
This tell which object in the class you are referring to and its data type.This is just a atribute in table not a primary key.

For more detailed view see the official page : http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html

A Great Learning Curve

When I got access to SVN and become a new member of the ever growing OpenMRS community, I realized that I have full Read/Write access to whole of the SVN and asked my mentors following thing :

"

1. I want my write access to be "LIMITED" only to http://svn.openmrs.org/openmrs-modules/feedback/ . How this can be done ?

Then Burke Mamlin (My Co-Mentor) replied me with one of the best statement that I have heard so far :

"We purposefully don't try to manage a social problem (i.e., svn code of conduct) through a technical solution."

And then I realized the actual meaning of the fact that great power come with even greater responsibilities.Although the snip from the Burke's  mail is following :

Just limit your commits to that code.  If you check out that folder it will be very difficult – if not impossible – for you to accidentally write to other parts of the repository.  That said, if a couple months go by and you notice an obvious misspelling or typographical error in the code, you won't have to ask for privileges to change it.

We purposefully don't try to manage a social problem (i.e., svn code of conduct) through a technical solution.  You know what you should be doing & what you shouldn't be doing and we trust you.  If you make a mistake, the repository keep track of each change so it's very easy to fix.  If someone abuses their access to the repository, then that's easy to fix too. 🙂