/**
*
* Manages (CRUD) report sheets for each entity
*
*/
package com.casamind.adware.server.servlet.gdata;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.logging.Logger;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.casamind.adware.server.domain.Company;
import com.casamind.adware.server.domain.Publisher;
import com.casamind.adware.server.domain.Slot;
import com.casamind.adware.server.domain.UserAccount;
import com.casamind.adware.server.proxy.DatastoreProxy;
import com.casamind.adware.server.proxy.GDataDocumentsProxy;
import com.casamind.adware.shared.GoogleDocumentsTaskTypes;
import com.casamind.adware.shared.Strings;
import com.casamind.adware.shared.model.SlotDTO;
import com.google.gdata.data.docs.DocumentListEntry;
import com.google.gdata.util.ServiceException;
@SuppressWarnings("serial")
public class BillingResourcesHandler extends HttpServlet {
private static final Logger log = Logger.getLogger(BillingResourcesHandler.class.getName());
private static DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT, Locale.FRANCE);
private String gdataWebLogin, gdataWebPassword, documentsFeedUrl,
spreadsheetFeedUrl;
private GDataDocumentsProxy proxy;
private long gdataThreadSleep;
private long gdataConnectTimeout;
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
ServletContext context = config.getServletContext();
gdataThreadSleep = Long.parseLong(context.getInitParameter("gdataThreadSleep"));
gdataConnectTimeout = Long.parseLong(context.getInitParameter("gdataConnectTimeout"));
gdataWebLogin = context.getInitParameter("gdataWebLogin");
gdataWebPassword = context.getInitParameter("gdataWebPassword");
documentsFeedUrl = context.getInitParameter("documentsFeedUrl");
spreadsheetFeedUrl = context.getInitParameter("spreadsheetFeedUrl");
proxy = new GDataDocumentsProxy(documentsFeedUrl, spreadsheetFeedUrl, gdataWebLogin, gdataWebPassword, gdataThreadSleep, gdataConnectTimeout);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String task = req.getParameter("task");
String title = req.getParameter("title");
String entityIds = req.getParameter("entityIds");
Long companyId = Long.parseLong(req.getParameter("companyId"));
int billNumber = Integer.parseInt(req.getParameter("billNumber"));
resp.setHeader("Content-Type", "text/html");
try {
DocumentListEntry entry = null;
if (task.equals(GoogleDocumentsTaskTypes.CREATE)) {
log.info("Entering GDataTaskTypes.CREATE task!");
if (companyId != null) {
Company company = DatastoreProxy.getCompanyById(companyId);
if (company != null) {
} else {
log.warning("No Compny found with id=" + companyId + ". Will exit servlet!");
}
String serviceStr = "", unitPriceStr = "";
Double totalPrice = 0.0, totalDue = 0.0;
List<Long> ids = new ArrayList<Long>();
for (String idStr : entityIds.split(",")){
ids.add(Long.parseLong(idStr));
}
for (Long id : ids){
Slot entity = DatastoreProxy.getSlotById(id);
if (entity != null) {
serviceStr += "Créneau publicitaire du " + formatter.format(entity.getStartDate()) + " au " + formatter.format(entity.getEndDate()) + "\n";
unitPriceStr += Integer.toString(entity.getPrice()) + "\n";
totalPrice += entity.getPrice();
log.info("Found slot with id=" + id + ". Will add service line.");
} else {
log.warning("No slot found with id=" + id);
}
}
String body = Strings.convertStreamToString(new FileInputStream("WEB-INF/files/templates/bill_slot_invoiced.html"));
body = Strings.formatSpecialCharacters(body
.replace("$billDate", formatter.format(new Date()))
.replace("$billNumber", Integer.toString(billNumber))
.replace("$project", "Avicena")
.replace("$company", company.getDisplayName())
.replace("$billingAddress", company.getBillingAddress())
.replace("$phone", company.getPhone())
.replace("$email", company.getEmail())
.replace("$service", serviceStr)
.replace("$unitPrice", unitPriceStr)
.replace("$discount", Integer.toString(0))
.replace("$totalPrice", Integer.toString(dto.getPrice()))
.replace("$totalDue", Double.toString(dto.getPrice() + (dto.getPrice() * 0.196))));
log.info("Searching for document entry '" + title + "' in Google Docs account: " + gdataWebLogin);
entry = proxy.findDocumentEntry(title);
log.info("Updating document content...");
entry = proxy.updateDocumentFile(entry, body, "text/html");
log.info("Content updated successfully!");
log.info("Updating document sharing permissions...");
setACL(entry, company, "reader");
log.info("Sharing permissions updated successfully!");
} else {
log.warning("entityId is null. Will exit servlet!");
}
} else if (task.equals(GoogleDocumentsTaskTypes.DELETE)) {
log.info("Entering GDataTaskTypes.DELETE task!");
entry = proxy.findDocumentEntry(title);
if (entry != null) {
log.info("Sleeping: " + gdataThreadSleep + " milliseconds");
Thread.sleep(gdataThreadSleep);
log.info("Wake up!");
proxy.deleteDocumentFile(entry);
} else {
log.warning("Did not find document '" + title + "'");
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void setACL(DocumentListEntry entry, UserAccount owner, String role) {
log.info("Granting '" + role + "' permission for user '" + owner.getDisplayName() + "' on entry '" + entry.getTitle().getPlainText() + "'");
if (owner != null) {
String login = owner.getLogin();
if (login != null && !"".equals(login)) {
log.info("Adding ACL.\n\tuser: " + login + ".\n\trole: " + role);
proxy.addAclRole(entry, login, role);
log.info("Rol added successfully!");
}
String email = owner.getEmail();
if (email != null && !"".equals(email)) {
log.info("Adding ACL.\n\tuser: " + login + ".\n\trole: " + role);
proxy.addAclRole(entry, email, role);
log.info("Rol added successfully!");
}
try {
Publisher publisher = (Publisher) owner;
log.info("Owner is a publisher. Adding company ACL entries...");
Company company = DatastoreProxy.getCompanyById(publisher.getCompanyId());
String cLogin = company.getLogin();
if (cLogin != null && !"".equals(cLogin)) {
log.info("Adding ACL.\n\tuser: " + cLogin + ".\n\trole: " + role);
proxy.addAclRole(entry, cLogin, role);
log.info("Rol added successfully!");
}
String cEmail = company.getEmail();
if (cEmail != null && !"".equals(cEmail)) {
log.info("Adding ACL.\n\tuser: " + cEmail + ".\n\trole: " + role);
proxy.addAclRole(entry, cEmail, role);
log.info("Rol added successfully!");
}
} catch (ClassCastException e) {
log.info("Owner is a company. Nothing else to do.");
}
} else {
log.warning("owner is null!");
}
}
}