package plugins.data;
import gcc.catalogue.ShoppingCart;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.molgenis.auth.MolgenisUser;
import org.molgenis.auth.Person;
import org.molgenis.framework.db.Database;
import org.molgenis.framework.db.DatabaseException;
import org.molgenis.framework.db.Query;
import org.molgenis.framework.db.QueryRule;
import org.molgenis.framework.db.QueryRule.Operator;
import org.molgenis.framework.ui.PluginModel;
import org.molgenis.framework.ui.ScreenController;
import org.molgenis.framework.ui.ScreenMessage;
import org.molgenis.util.Entity;
import org.molgenis.util.HandleRequestDelegationException;
import org.molgenis.util.HttpServletRequestTuple;
import org.molgenis.util.SimpleEmailService.EmailException;
import org.molgenis.util.Tuple;
public class MeasurementsDownloadForm extends PluginModel<Entity>
{
private static final long serialVersionUID = -8140222842047905408L;
private ShoppingCart shoppingCart = null;
private Person user = null;
public MeasurementsDownloadForm(String name, ScreenController<?> parent)
{
super(name, parent);
}
@Override
public String getViewName()
{
return "plugins_data_MeasurementsDownloadForm";
}
@Override
public String getViewTemplate()
{
return "plugins/data/MeasurementsDownloadForm.ftl";
}
public String getCustomHtmlHeaders()
{
return "<link rel=\"stylesheet\" style=\"text/css\" href=\"res/css/download_list.css\">"
+ "<link rel=\"stylesheet\" style=\"text/css\" href=\"res/css/catalogue.css\">";
}
@Override
public void handleRequest(Database db, Tuple request) throws HandleRequestDelegationException, Exception
{
this.reload(db);
if ("EmptyShoppingCart".equals(request.getAction()))
{
this.emptyShoppingCart(db);
this.reload(db);
}
else if ("checkoutDownload".equals(request.getAction()))
{
if (shoppingCart == null)
{
this.getModel()
.getMessages()
.add(new ScreenMessage(
"Your download list is empty. You cannot continue! Please visit the Catalog first.",
false));
this.reload(db);
}
else if (this.checkIfUserDetailsEmpty(db))
{
this.getModel().getMessages().add(new ScreenMessage("Please complete your profile first!", false));
}
else
{
this.updateShoppingCartAsCheckedOut(db);
this.sendDownloadEmail(db);
this.getModel().getMessages().add(new ScreenMessage("Your Download has been sent!", true));
this.reload(db);
}
}
else if ("seeOldPlacedDownloads".equals(request.getAction()))
{
HttpServletRequestTuple rt = (HttpServletRequestTuple) request;
HttpServletRequest httpRequest = rt.getRequest();
HttpServletResponse httpResponse = rt.getResponse();
String redirectURL = httpRequest.getRequestURL() + "?__target=" + this.getParent().getName()
+ "&select=OldPlacedDownloads";
httpResponse.sendRedirect(redirectURL);
}
}
public void updateShoppingCartAsCheckedOut(Database db)
{
shoppingCart.setCheckedOut(true);
try
{
db.update(shoppingCart);
}
catch (DatabaseException e)
{
this.getModel().getMessages()
.add(new ScreenMessage("A problem with updating your download list has occurred", true));
e.printStackTrace();
}
}
/**
* Returns true if one or more fields are empty
*
* @param db
* @return
* @throws DatabaseException
*/
public boolean checkIfUserDetailsEmpty(Database db) throws DatabaseException
{
user = MolgenisUser.findById(db, this.getLogin().getUserId());
user = Person.findById(db, this.getLogin().getUserId());
return (user.getEmail() == null ||
// user.getAffiliation(db) == null ||
user.getDepartment() == null || user.getFirstName() == null || user.getLastName() == null ||
// user.getAddress() == null ||
user.getCity() == null);
// user.getAffiliation() == null);
}
public void sendDownloadEmail(Database db) throws DatabaseException
{
MolgenisUser admin = db.query(MolgenisUser.class).eq(MolgenisUser.NAME, "admin").find().get(0);
if (StringUtils.isEmpty(admin.getEmail())) throw new DatabaseException(
"Download failed: the administrator has no email address set used to confirm your registration. Please contact your administrator about this.");
String emailContents = "Dear Catalogue administrator," + "\n\n";
emailContents += "The user : " + this.getLogin().getUserName() + "\n";
emailContents += "has sent a request for the items/measurements below:" + "\n";
for (String name : shoppingCart.getMeasurements_Name())
{
emailContents += name + "\n";
}
if (user == null)
{
emailContents += "\n No user details available \n ";
}
else
{
emailContents += "\n User details: \n";
emailContents += "Title: ";
if (user.getTitle() != null) emailContents += " emailContents\n";
emailContents += "First Name: " + user.getFirstName() + "\n";
emailContents += "Last Name: " + user.getLastName() + "\n";
emailContents += "Email: " + user.getEmail() + "\n";
emailContents += "Phone: " + user.getPhone() + "\n";
emailContents += "Fax: " + user.getFax() + "\n";
emailContents += "TollFreePhone: " + user.getTollFreePhone() + "\n";
emailContents += "Address: " + user.getAddress() + "\n";
emailContents += "Phone: " + user.getPhone() + "\n";
emailContents += "Department: " + user.getDepartment() + "\n";
// emailContents += "Affiliation: "+ user.getAffiliation() +"\n";
emailContents += "City: " + user.getCity() + "\n";
emailContents += "Country: " + user.getCountry() + "\n";
// TODO :Institute, Position
}
try
{
this.getEmailService().email("New items/measurements downloaded", emailContents, admin.getEmail(), true);
}
catch (EmailException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void emptyShoppingCart(Database db)
{
// empty db table: actually delete the ones that have checkedOut='false'
Query<ShoppingCart> q = db.query(ShoppingCart.class);
q.addRules(new QueryRule(ShoppingCart.CHECKEDOUT, Operator.EQUALS, false));
q.addRules(new QueryRule(ShoppingCart.USERID, Operator.EQUALS, this.getLogin().getUserName()));
try
{
List<ShoppingCart> resshoppingCart = q.find();
db.remove(resshoppingCart);
this.getModel()
.getMessages()
.add(new ScreenMessage("Your download list is now empty, you can reload items from the Catalog",
true));
}
catch (DatabaseException e)
{
e.printStackTrace();
this.getModel().getMessages().add(new ScreenMessage("Emptying your download list failed", true));
}
this.reload(db);
}
@Override
public void reload(Database db)
{
try
{
Query<ShoppingCart> q = db.query(ShoppingCart.class);
q.addRules(new QueryRule(ShoppingCart.USERID, Operator.EQUALS, this.getLogin().getUserName()));
q.addRules(new QueryRule(ShoppingCart.CHECKEDOUT, Operator.EQUALS, false));
if (!q.find().isEmpty())
{
shoppingCart = q.find().get(0);
}
else
{
shoppingCart = null;
}
}
catch (Exception e)
{
this.getModel().getMessages().add(new ScreenMessage("No download list available", false));
e.printStackTrace();
}
}
public ShoppingCart getshoppingCart()
{
return shoppingCart;
}
}