package controllers; import static play.data.Form.form; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.UUID; import models.CommunicationLog; import models.ContactPerson; import models.CrawlPermission; import models.License; import models.MailTemplate; import models.Target; import models.User; import org.apache.commons.lang3.StringUtils; import play.Logger; import play.data.DynamicForm; import play.data.Form; import play.data.validation.ValidationError; import play.libs.Json; import play.mvc.BodyParser; import play.mvc.Result; import play.mvc.Security; import uk.bl.Const; import uk.bl.Const.CrawlPermissionStatus; import uk.bl.api.Utils; import uk.bl.exception.ActException; import uk.bl.scope.EmailHelper; import views.html.crawlpermissions.newForm; import views.html.crawlpermissions.edit; import views.html.crawlpermissions.view; import views.html.crawlpermissions.crawlpermissionpreview; import views.html.crawlpermissions.list; import com.avaje.ebean.Ebean; import com.avaje.ebean.ExpressionList; import com.avaje.ebean.Page; import com.fasterxml.jackson.databind.JsonNode; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Manage permissions. */ @Security.Authenticated(SecuredController.class) public class CrawlPermissionController extends AbstractController { //final static Form<CrawlPermission> crawlPermissionForm = new Form<CrawlPermission>(CrawlPermission.class); public static String EMAIL_REGEX = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; /** * Display the crawl permissions. */ public static Result index() { Logger.debug("CrawlPermissions.index()"); return GO_HOME; } public static Result GO_HOME = redirect( routes.CrawlPermissionController.list(0, Const.NAME, Const.ASC, "", Const.DEFAULT_CRAWL_PERMISSION_STATUS, Const.SELECT_ALL) ); /** * Display the paginated list of crawl permissions. * * @param page Current page number (starts from 0) * @param sortBy Column to be sorted * @param order Sort order (either asc or desc) * @param filter Filter applied on target urls */ public static Result list(int pageNo, String sortBy, String order, String filter, String status, String sel) { Logger.debug("CrawlPermissions.list() " + "\npageNo - " + pageNo + "\nsortby - " + sortBy + "\norder - " + order + "\nfilter - " + filter + "\nstatus - " + status + "\nsel - " + sel); Page<CrawlPermission> pages = CrawlPermission.page(pageNo, 20, sortBy, order, filter, status); CrawlPermissionStatus[] crawlPermissionStatuses = Const.CrawlPermissionStatus.values(); List<MailTemplate> templates = MailTemplate.findByType(MailTemplate.TemplateType.PERMISSION_REQUEST.name()); Logger.debug("template: " + templates); return ok( list.render( "CrawlPermissions", User.findByEmail(request().username()), filter, pages, sortBy, order, status, sel, crawlPermissionStatuses, templates) ); } public static Result newForm(Long targetId) { User user = User.findByEmail(request().username()); Map<String,String> crawlPermissionStatuses = CrawlPermissionStatus.options(); CrawlPermission crawlPermission = new CrawlPermission(); if (targetId != -1) { Target target = Target.findById(targetId); crawlPermission.name = target.title; // target.formUrl = target.fieldUrl(); crawlPermission.target = target; Logger.debug("target.crawlFrequency:" + crawlPermission.target.crawlFrequency); } crawlPermission.status = Const.CrawlPermissionStatus.QUEUED.name(); crawlPermission.user = user; crawlPermission.token = UUID.randomUUID().toString(); setupDefaultLicense(crawlPermission); Logger.info("Created new CrawlPermission from newForm("+targetId+") with UUID "+crawlPermission.token); Form<CrawlPermission> filledForm = Form.form(CrawlPermission.class); filledForm = filledForm.fill(crawlPermission); if(crawlPermission.getLicense() != null) { filledForm.data().put("license_id", "" + crawlPermission.getLicense().id); } Map<String, String> permissionRequestTemplates = MailTemplate.options(MailTemplate.TemplateType.PERMISSION_REQUEST); Map<String, String> acknowledgementTemplates = MailTemplate.options(MailTemplate.TemplateType.THANK_YOU_ONLINE_PERMISSION_FORM); return ok(newForm.render(filledForm, user, crawlPermissionStatuses, targetId, null, License.options(), permissionRequestTemplates, acknowledgementTemplates)); } private static void setupDefaultLicense( CrawlPermission crawlPermission ) { if( crawlPermission.getLicense() == null ) { crawlPermission.setLicense( License.findByNameStartsWith(Const.LDL_UKWA_LICENSE) ); } } public static Result edit(Long id) { CrawlPermission crawlPermission = CrawlPermission.findById(id); if (crawlPermission == null) return notFound("There is no CrawlPermission with id " + id); User user = User.findByEmail(request().username()); crawlPermission.target.formUrl = crawlPermission.target.fieldUrl(); Form<CrawlPermission> crawlPermissionForm = Form.form(CrawlPermission.class); crawlPermissionForm = crawlPermissionForm.fill(crawlPermission); Map<String,String> crawlPermissionStatuses = CrawlPermissionStatus.options(); setupDefaultLicense(crawlPermission); if(crawlPermission.getLicense() != null) { crawlPermissionForm.data().put("license_id", "" + crawlPermission.getLicense().id); } if(crawlPermission.permissionRequestMailTemplate != null) { crawlPermissionForm.data().put("mailtemplate_permission_request_id", crawlPermission.permissionRequestMailTemplate.id.toString()); } if(crawlPermission.acknowledgementMailTemplate != null) { crawlPermissionForm.data().put("mailtemplate_acknowledgement_id", crawlPermission.acknowledgementMailTemplate.id.toString()); } Map<String, String> permissionRequestTemplates = MailTemplate.options(MailTemplate.TemplateType.PERMISSION_REQUEST); Map<String, String> acknowledgementTemplates = MailTemplate.options(MailTemplate.TemplateType.THANK_YOU_ONLINE_PERMISSION_FORM); return ok(edit.render(crawlPermissionForm, user, id, crawlPermissionStatuses, null, License.options(), permissionRequestTemplates, acknowledgementTemplates,crawlPermission)); } public static Result view(Long id) { CrawlPermission crawlPermission = CrawlPermission.findById(id); if (crawlPermission == null) return notFound("There is no CrawlPermission with id " + id); User user = User.findByEmail(request().username()); Logger.debug("CrawlPermissionController.view contactPerson: " + crawlPermission.contactPerson); Logger.debug("CrawlPermissionController.view user: " + crawlPermission.user); Logger.debug("CrawlPermissionController.view license: " + crawlPermission.getLicense()); Logger.debug("CrawlPermissionController.view mailTemplate: " + crawlPermission.permissionRequestMailTemplate); return ok(view.render(crawlPermission, user)); } /** * This method shows crawl permissions associated with given target. It is called from * target edit page. * @param targetUrl * @return */ public static Result showCrawlPermissions(Long targetId) { String status = ""; Page<CrawlPermission> pages = CrawlPermission.targetPager(0, 20, Const.NAME, Const.ASC, targetId); Logger.debug("showCrawlPermissions: " + targetId); // List<CrawlPermission> resList = processFilterCrawlPermissions("", status, target); // Logger.debug("showCrawlPermissions count: " + resList.size()); CrawlPermissionStatus[] crawlPermissionStatuses = Const.CrawlPermissionStatus.values(); List<MailTemplate> templates = MailTemplate.findByType(MailTemplate.TemplateType.PERMISSION_REQUEST.name()); return ok( list.render( "CrawlPermissions", User.findByEmail(request().username()), "", pages, Const.NAME, Const.ASC, status, "", crawlPermissionStatuses, templates) ); } /** * This method enables searching for given URL and redirection in order to add new entry * if required. * @return */ public static Result search() { DynamicForm form = form().bindFromRequest(); String action = form.get("action"); String name = form.get(Const.NAME); String status = form.get(Const.STATUS); if (status == null) { status = Const.DEFAULT_CRAWL_PERMISSION_STATUS; } // List<CrawlPermission> resList = processFilterCrawlPermissions(name, status, ""); if (StringUtils.isBlank(name)) { Logger.debug("Organisation name is empty. Please write name in search window."); flash("message", "Please enter a name in the search window"); return redirect(routes.CrawlPermissionController.list(0, "updatedAt", Const.ASC, name, status, Const.SELECT_ALL)); } if (StringUtils.isEmpty(action)) { return badRequest("You must provide a valid action"); } else { if (action.equals("search")) { return redirect(routes.CrawlPermissionController.list(0, "updatedAt", Const.ASC, name, status, Const.SELECT_ALL)); } else { return badRequest("This action is not allowed"); } } } /** * This method applyies filters to the list of crawl permissions. * @param filterUrl The search string * @param status The status of the permission workflow * @param target The domain name (URL) * @return */ public static List<CrawlPermission> processFilterCrawlPermissions(String filterUrl, String status, String target) { // Logger.debug("process filter filterUrl: " + filterUrl + ", status: " + status); boolean isProcessed = false; ExpressionList<CrawlPermission> exp = CrawlPermission.find.where(); List<CrawlPermission> res = new ArrayList<CrawlPermission>(); if (filterUrl != null && !filterUrl.equals(Const.NONE) && filterUrl.length() > 0) { Logger.debug("name: " + filterUrl); exp = exp.contains(Const.NAME, filterUrl); isProcessed = true; } if (status != null && !status.toLowerCase().equals(Const.NONE) && status.length() > 0) { Logger.debug("status: " + status); exp = exp.eq(Const.STATUS, status); isProcessed = true; } if (target != null && !target.toLowerCase().equals(Const.NONE) && target.length() > 0) { Logger.debug("target: " + target); exp = exp.eq(Const.TARGET, target); isProcessed = true; } res = exp.query().findList(); Logger.debug("Expression list size: " + res.size() + ", isProcessed: " + isProcessed); if (!isProcessed) { res = models.CrawlPermission.findAll(); } return res; } /** * Create new crawl permission request for particular target. * @param permission title * @param target * @return */ public static Result licenceRequestForTarget(Long targetId) { return redirect(routes.CrawlPermissionController.newForm(targetId)); } public static Form<CrawlPermission> processForm() { return processForm(false); } public static Form<CrawlPermission> processForm(boolean requireContactPerson) { CrawlPermission permission = CrawlPermission.create(Long.valueOf(getFormParam(Const.ID)), getFormParam(Const.URL), getFormParam(Const.NAME)); if (getFormParam(Const.DESCRIPTION) != null) { permission.description = getFormParam(Const.DESCRIPTION); } if (getFormParam(Const.TARGET) != null) { permission.target.title = getFormParam(Const.TARGET); } permission.contactPerson.name = Const.NONE; if (getFormParam(Const.CONTACT_PERSON) != null) { permission.contactPerson.name = getFormParam(Const.CONTACT_PERSON); Logger.debug("contactPerson: " + permission.contactPerson + ", " + permission.description + ", " + permission.target.title); if (requireContactPerson) { try { ContactPerson person = ContactPerson.findByName(getFormParam(Const.CONTACT_PERSON)); setContactPerson(permission, person.url); Logger.debug("contact person: " + getFormParam(Const.CONTACT_PERSON) + ", " + person.url); } catch (Exception e) { Logger.debug("contact person is not existing."); if (getFormParam(Const.EMAIL) != null) { try { List<ContactPerson> personList = ContactPerson.filterByEmail(getFormParam(Const.EMAIL)); if (personList.size() > 0) { setContactPerson(permission, personList.get(0).url); } } catch (Exception e2) { Logger.debug("contact person is not found by email."); } } } } } // Logger.debug("creator user: " + getFormParam(Const.CREATOR_USER) + " - " + ContactPerson.findByUrl(getFormParam(Const.CONTACT_PERSON)).email); if (getFormParam(Const.CREATOR_USER) != null) { permission.user = User.findByName(getFormParam(Const.CREATOR_USER)); } if (getFormParam(Const.TEMPLATE) != null) { permission.permissionRequestMailTemplate.url = getFormParam(Const.TEMPLATE); } if (getFormParam(Const.STATUS) != null) { permission.status = getFormParam(Const.STATUS); } if (getFormParam(Const.REQUEST_FOLLOW_UP) != null) { permission.requestFollowup = Utils.INSTANCE.getNormalizeBooleanString(getFormParam(Const.REQUEST_FOLLOW_UP)); } Form<CrawlPermission> permissionFormNew = Form.form(CrawlPermission.class); permissionFormNew = permissionFormNew.fill(permission); Logger.debug("email: " + getFormParam(Const.EMAIL)); return permissionFormNew; } /** * This method prepares CrawlPermission form for sending info message * about errors * @return edit page with form and info message */ public static Result info(Form<CrawlPermission> form, Long id, String contactName) { User user = User.findByEmail(request().username()); Map<String,String> crawlPermissionStatuses = CrawlPermissionStatus.options(); CrawlPermission crawlPermission = CrawlPermission.findById(id); Logger.debug("Info contactPerson: " + form.get().contactPerson.name); Map<String, String> permissionRequestTemplates = MailTemplate.options(MailTemplate.TemplateType.PERMISSION_REQUEST); Map<String, String> acknowledgementTemplates = MailTemplate.options(MailTemplate.TemplateType.THANK_YOU_ONLINE_PERMISSION_FORM); return badRequest(edit.render(form, user, id, crawlPermissionStatuses, contactName, License.options(), permissionRequestTemplates, acknowledgementTemplates, crawlPermission)); } public static Result newInfo(Form<CrawlPermission> form, Long targetId, String contactName) { Map<String,String> crawlPermissionStatuses = CrawlPermissionStatus.options(); User user = User.findByEmail(request().username()); Map<String, String> permissionRequestTemplates = MailTemplate.options(MailTemplate.TemplateType.PERMISSION_REQUEST); Map<String, String> acknowledgementTemplates = MailTemplate.options(MailTemplate.TemplateType.THANK_YOU_ONLINE_PERMISSION_FORM); return badRequest(newForm.render(form, user, crawlPermissionStatuses, targetId, contactName, License.options(), permissionRequestTemplates, acknowledgementTemplates)); } public static Result update(Long id) { DynamicForm requestData = form().bindFromRequest(); String action = requestData.get("action"); Logger.debug("update() action: " + action); Form<CrawlPermission> filledForm = form(CrawlPermission.class).bindFromRequest(); if (StringUtils.isNotEmpty(action)) { if (action.equals("save")) { Logger.debug("hasGlobalErrors: " + filledForm.hasGlobalErrors()); Logger.debug("hasErrors: " + filledForm.hasErrors()); if (filledForm.hasErrors()) { Logger.debug("hasErrors: " + filledForm.errors()); return info(filledForm, id, null); } String formUrl = requestData.get("target.formUrl"); String contactPersonName = filledForm.get().contactPerson.name; String contactPersonEmail = filledForm.get().contactPerson.email; if (StringUtils.isBlank(formUrl)) { ValidationError ve = new ValidationError("target.formUrl", "URL is required"); filledForm.reject(ve); return info(filledForm, id, null); } if (StringUtils.isBlank(contactPersonEmail)) { ValidationError ve = new ValidationError("contactPerson.email", "Email is required"); filledForm.reject(ve); return info(filledForm, id, null); } Pattern pattern = Pattern.compile(EMAIL_REGEX); Matcher matcher = pattern.matcher(contactPersonEmail); if (StringUtils.isNotBlank(contactPersonEmail) && !matcher.matches()) { ValidationError ve = new ValidationError("contactPerson.email", "Invalid email"); filledForm.reject(ve); return info(filledForm, id, null); } ContactPerson existingContact = ContactPerson.findByEmail(contactPersonEmail.trim()); if (existingContact != null) { Logger.debug("validateForm contactPersonName: " + contactPersonName + "/" + existingContact.name); Logger.debug("validateForm contactPersonEmail: " + contactPersonEmail + "/" + existingContact.email); if (StringUtils.isNotEmpty(existingContact.name) && StringUtils.isNotEmpty(existingContact.email) && StringUtils.isNotBlank(contactPersonName) && StringUtils.isNotBlank(contactPersonEmail) && existingContact.email.equalsIgnoreCase(contactPersonEmail) && !existingContact.name.equalsIgnoreCase(contactPersonName)) { // matching emails but names don't match Logger.debug("validateForm validation error"); String msg = "A contact person with email '" + contactPersonEmail + "' is already in the Contact Persons list, but with the Name '" + existingContact.name + "' which is different from the given name '" + contactPersonName + "'. Please review the revised details below and click Save, or enter an alternative contact email address."; filledForm.get().contactPerson = existingContact; Logger.debug("refill: " + filledForm.get().contactPerson.name); ValidationError e = new ValidationError("email", msg); filledForm.reject(e); return info(filledForm, id, filledForm.get().contactPerson.name); } existingContact.name = contactPersonName; existingContact.email = contactPersonEmail; existingContact.position = filledForm.get().contactPerson.position; existingContact.contactOrganisation = filledForm.get().contactPerson.contactOrganisation; existingContact.phone = filledForm.get().contactPerson.phone; existingContact.postalAddress = filledForm.get().contactPerson.postalAddress; boolean found = false; for( CrawlPermission cp : existingContact.crawlPermissions ) { if( cp.id.equals(id)) { found = true; } } if( !found ) { existingContact.crawlPermissions.add(filledForm.get()); } existingContact.update(); filledForm.get().contactPerson = existingContact; } else { filledForm.get().contactPerson.save(); } CommunicationLog log = CommunicationLog.logHistory(Const.PERMISSION + " " + filledForm.get().status, filledForm.get(), filledForm.get().user, Const.UPDATE); log.save(); updateAllByTarget(filledForm.get().id, filledForm.get().target.id, filledForm.get().status); //Update granted Date if(filledForm.get().status.equalsIgnoreCase(Const.CrawlPermissionStatus.GRANTED.getValue())){ filledForm.get().grantedAt = Utils.INSTANCE.getCurrentTimeStamp(); filledForm.get().update(id); } //Update requested Date if(filledForm.get().status.equalsIgnoreCase(Const.CrawlPermissionStatus.PENDING.getValue())){ filledForm.get().requestedAt = Utils.INSTANCE.getCurrentTimeStamp(); filledForm.get().update(id); } filledForm.get().target.licenseStatus = filledForm.get().status; filledForm.get().target.update(); // TargetController.updateQaStatus(filledForm.get().target.title, filledForm.get().status); // Set up the license String license_id = requestData.get("license_id"); if( license_id != null ) { filledForm.get().setLicense( License.findById(Long.parseLong(license_id)) ); } // Save the templates String permissionRequestTemplateId = requestData.get("mailtemplate_permission_request_id"); if(StringUtils.isNotBlank(permissionRequestTemplateId)) { filledForm.get().setPermissionRequestMailTemplate(MailTemplate.findById(Long.parseLong(permissionRequestTemplateId))); } else{ // Clear the template filledForm.get().setPermissionRequestMailTemplate(new MailTemplate()); } String acknowledgementTemplateId = requestData.get("mailtemplate_acknowledgement_id"); if(StringUtils.isNotBlank(acknowledgementTemplateId)) { filledForm.get().setAcknowledgementMailTemplate(MailTemplate.findById(Long.parseLong(acknowledgementTemplateId))); } else{ // Clear the template filledForm.get().setAcknowledgementMailTemplate(new MailTemplate()); } filledForm.get().update(id); flash("message", "Crawl Permission " + filledForm.get().name + " has been updated"); return redirect(routes.CrawlPermissionController.view(filledForm.get().id)); } else if (action.equals("delete")) { CrawlPermission crawlPermission = CrawlPermission.findById(id); flash("message", "Crawl Permission " + filledForm.get().name + " has been deleted"); crawlPermission.delete(); return redirect(routes.CrawlPermissionController.index()); } } return null; } public static Result save() { Form<CrawlPermission> filledForm = form(CrawlPermission.class).bindFromRequest(); DynamicForm requestData = form().bindFromRequest(); String target = requestData.get("target.id"); Long targetId = -1L; if (StringUtils.isNotBlank(target)) { targetId = Long.valueOf(target); } if(filledForm.hasErrors()) { Logger.debug("errors: " + filledForm.errors()); return newInfo(filledForm, targetId, null); } String formUrl = requestData.get("target.formUrl"); String contactPersonName = filledForm.get().contactPerson.name; String contactPersonEmail = filledForm.get().contactPerson.email; if (StringUtils.isBlank(formUrl)) { ValidationError ve = new ValidationError("target.formUrl", "URL is required"); filledForm.reject(ve); return newInfo(filledForm, targetId, null); } if (StringUtils.isBlank(contactPersonEmail)) { ValidationError ve = new ValidationError("contactPerson.email", "Email is required"); filledForm.reject(ve); return newInfo(filledForm, targetId, null); } Pattern pattern = Pattern.compile(EMAIL_REGEX); Matcher matcher = pattern.matcher(contactPersonEmail); if (StringUtils.isNotBlank(contactPersonEmail) && !matcher.matches()) { ValidationError ve = new ValidationError("contactPerson.email", "Invalid email"); filledForm.reject(ve); return newInfo(filledForm, targetId, null); } ContactPerson existingContact = ContactPerson.findByEmail(contactPersonEmail.trim()); if (existingContact != null) { Logger.debug("validateForm contactPersonName: " + contactPersonName + "/" + existingContact.name); Logger.debug("validateForm contactPersonEmail: " + contactPersonEmail + "/" + existingContact.email); if (StringUtils.isNotEmpty(existingContact.name) && StringUtils.isNotEmpty(existingContact.email) && StringUtils.isNotBlank(contactPersonName) && StringUtils.isNotBlank(contactPersonEmail) && existingContact.email.equalsIgnoreCase(contactPersonEmail) && !existingContact.name.equalsIgnoreCase(contactPersonName)) { // matching emails but names don't match Logger.debug("validateForm validation error"); String msg = "A contact person with email '" + contactPersonEmail + "' is already in the Contact Persons list, but with the Name '" + existingContact.name + "' which is different from the given name '" + contactPersonName + "'. Please review the revised details below and click Save, or enter an alternative contact email address."; filledForm.get().contactPerson = existingContact; Logger.debug("refill: " + filledForm.get().contactPerson.name); ValidationError e = new ValidationError("email", msg); filledForm.reject(e); return newInfo(filledForm, targetId, filledForm.get().contactPerson.name); } filledForm.get().contactPerson = existingContact; } else { filledForm.get().contactPerson.save(); } Logger.debug("save user: " + filledForm.get().user); Logger.debug("save contactUser: " + filledForm.get().contactPerson); filledForm.get().thirdPartyContent = Boolean.FALSE; filledForm.get().agree = Boolean.FALSE; filledForm.get().publish = Boolean.TRUE; CommunicationLog log = CommunicationLog.logHistory(Const.PERMISSION + " " + filledForm.get().status, filledForm.get(), filledForm.get().user, Const.SAVE); log.save(); // Logger.debug("target.crawlFrequency:" + filledForm.get().target.crawlFrequency); updateAllByTarget(filledForm.get().id, filledForm.get().target.id, filledForm.get().status); filledForm.get().target.licenseStatus = filledForm.get().status; filledForm.get().target.update(); Logger.debug("target.crawlFrequency:" + filledForm.get().target.crawlFrequency); filledForm.get().contactPerson.save(); // queued etc // no need for this as you can get it using target.crawlpermissions // TargetController.updateQaStatus(filledForm.get().target.title, filledForm.get().status); Logger.debug("save user: " + filledForm.get().user); // Set up the license String license_id = requestData.get("license_id"); if( license_id != null ) { filledForm.get().setLicense( License.findById(Long.parseLong(license_id)) ); } // Save the templates String permissionRequestTemplateId = requestData.get("mailtemplate_permission_request_id"); if(StringUtils.isNotBlank(permissionRequestTemplateId)) { filledForm.get().permissionRequestMailTemplate = MailTemplate.findById(Long.parseLong(permissionRequestTemplateId)); } String acknowledgementTemplateId = requestData.get("mailtemplate_acknowledgement_id"); if(StringUtils.isNotBlank(acknowledgementTemplateId)) { filledForm.get().acknowledgementMailTemplate = MailTemplate.findById(Long.parseLong(acknowledgementTemplateId)); } filledForm.get().save(); return redirect(routes.CrawlPermissionController.view(filledForm.get().id)); } /** * This method selects crawl permissions selected using checkboxes * on the crawl permission overview page. * @return */ public static String getAssignedPermissions() { String assignedPermissions = ""; try { List<CrawlPermission> permissionList = CrawlPermission.findAll(); Iterator<CrawlPermission> permissionItr = permissionList.iterator(); while (permissionItr.hasNext()) { CrawlPermission permission = permissionItr.next(); if (getFormParam(permission.name) != null) { Logger.debug("getFormParam(permission.name): " + getFormParam(permission.name) + " " + permission.name); boolean userFlag = Utils.INSTANCE.getNormalizeBooleanString(getFormParam(permission.name)); if (userFlag) { if (assignedPermissions.length() == 0) { assignedPermissions = permission.name; } else { assignedPermissions = assignedPermissions + Const.COMMA + " " + permission.name; } } } } Logger.debug("assignedPermissions: " + assignedPermissions); } catch (Exception e) { Logger.debug("send some exception" + e); } return assignedPermissions; } /** * This method selects crawl permissions selected using checkboxes * on the crawl permission overview page. * @return */ public static List<CrawlPermission> getAssignedPermissionsList() { List<CrawlPermission> assignedPermissionsList = new ArrayList<CrawlPermission>(); try { List<CrawlPermission> permissionList = CrawlPermission.findAll(); Iterator<CrawlPermission> permissionItr = permissionList.iterator(); while (permissionItr.hasNext()) { CrawlPermission permission = permissionItr.next(); if (getFormParam(permission.name) != null) { Logger.debug("getFormParam(permission.name): " + getFormParam(permission.name) + " " + permission.name); boolean userFlag = Utils.INSTANCE.getNormalizeBooleanString(getFormParam(permission.name)); if (userFlag) { assignedPermissionsList.add(CrawlPermission.findByName(permission.name)); } } } Logger.debug("assignedPermissions: " + assignedPermissionsList); } catch (Exception e) { Logger.debug("send some exception" + e); } return assignedPermissionsList; } /** * This method aggregates 'to' emails. * @return */ public static String evaluateToEmails() { String assignedPermissions = ""; List<CrawlPermission> permissionList = CrawlPermission.findAll(); Iterator<CrawlPermission> permissionItr = permissionList.iterator(); while (permissionItr.hasNext()) { CrawlPermission permission = permissionItr.next(); if (getFormParam(permission.name) != null) { // Logger.debug("getFormParam(permission.name): " + getFormParam(permission.name) + " " + permission.name); boolean userFlag = Utils.INSTANCE.getNormalizeBooleanString(getFormParam(permission.name)); if (userFlag) { if (assignedPermissions.length() == 0) { assignedPermissions = ContactPerson.findEmailsByUrls(permission.contactPerson.url, assignedPermissions); } else { assignedPermissions = assignedPermissions + Const.COMMA + " " + ContactPerson.findEmailsByUrls(permission.contactPerson.url, assignedPermissions); } } } } assignedPermissions = assignedPermissions.replace(" ,", ""); Logger.debug("assignedPermissions: " + assignedPermissions); return assignedPermissions; } /** * This method rejects selected crawl permissions and changes their status to 'EMAIL_REJECTED'. * @return */ public static void rejectSelectedCrawlPermissions(List<CrawlPermission> permissionList) { for (CrawlPermission permission : permissionList) { permission.status = Const.CrawlPermissionStatus.EMAIL_REJECTED.name(); Logger.debug("new permission staus: " + permission.status); Ebean.update(permission); CommunicationLog log = CommunicationLog.logHistory(Const.PERMISSION + " " + permission.status, permission, permission.user, Const.UPDATE); Ebean.save(log); Logger.debug("updated permission name: " + permission.name + ", staus: " + permission.status); updateAllByTarget(permission.id, permission.target.id, permission.status); // TargetController.updateQaStatus(permission.target.title, permission.status); } } /** * This method updates all crawl permissions associated for given target * when a permission for a target is 'Granted', all others are set to 'Superseded'. * @param url The identificaiton URL of a current crawl permission object * @param target The domain name (URL) * @param status The status of the permission workflow */ public static void updateAllByTarget(Long crawlPermissionId, Long targetId, String status) { if (status.equals(Const.CrawlPermissionStatus.GRANTED.name())) { ExpressionList<CrawlPermission> exp = CrawlPermission.find.where().eq("target.id", targetId); if (crawlPermissionId != null) { exp = exp.ne("id", crawlPermissionId); } List<CrawlPermission> permissionList = exp.query().findList(); for (CrawlPermission permission : permissionList) { permission.status = Const.CrawlPermissionStatus.SUPERSEDED.name(); Logger.debug("updateAllByTarget() permission: " + permission.name + " to SUPERSEDED"); permission.save(); } } } /** * This method updates all crawl permissions associated for given target * with passed status. * @param target The domain name (URL) * @param status The status of the permission workflow */ public static void updateAllByTargetStatusChange(String target, String status) { ExpressionList<CrawlPermission> exp = CrawlPermission.find.where(); List<CrawlPermission> permissionList = new ArrayList<CrawlPermission>(); if (target != null && !target.toLowerCase().equals(Const.NONE) && target.length() > 0) { Logger.debug("updateAllByTargetStatusChange() target: " + target); exp = exp.eq(Const.TARGET, target); } permissionList = exp.query().findList(); Logger.debug("Expression list size: " + permissionList.size()); Iterator<CrawlPermission> permissionItr = permissionList.iterator(); while (permissionItr.hasNext()) { CrawlPermission permission = permissionItr.next(); permission.status = status; Logger.debug("updateAllByTargetStatusChange() update status to '" + status + "' for permission: " + permission.name); Ebean.update(permission); } } /** * This method injects necessary server name from configuration file. * It is defined in 'server_name' field. * @param licenseUrl * @return edited link */ public static String injectServerName(String licenseUrl) { String res = ""; if (licenseUrl != null && licenseUrl.length() > 0 && licenseUrl.contains(Const.HTTP_PREFIX)) { String serverName = EmailHelper.getServerNameFromPropertyFile(); int startPos = licenseUrl.indexOf(Const.HTTP_PREFIX) + Const.HTTP_PREFIX.length(); if (startPos == 0) { startPos = licenseUrl.indexOf("https://") + "https://".length(); } int endPos = licenseUrl.substring(startPos).indexOf(Const.SLASH_DELIMITER) + startPos; if (StringUtils.isNotEmpty(serverName)) { res = serverName + licenseUrl.substring(endPos); } } return res; } /** * This method sets status "PENDING" for selected crawl permissions. * If parameter all is true - do it for all queued permissions, * otherwise only selected by checkbox. * @param template The email template to override that defined for each crawl permission, or an empty string to * use the crawl permissions' defaults * @param permissionList The List of CrawlPermissions * @return true if sending successful, false otherwise */ public static boolean setPendingSelectedCrawlPermissions(String template, List<CrawlPermission> permissionList) throws ActException { boolean res = true; Logger.debug("template: " + template); for (CrawlPermission permission : permissionList) { Logger.debug("mail to contact person: " + permission.contactPerson); Logger.debug("mail template: " + template); ContactPerson contactPerson = permission.contactPerson; String email = contactPerson.email; // String[] toMailAddresses = Utils.getMailArray(email); String messageBody = Const.NONE_VALUE; String messageSubject = Const.NONE_VALUE; if (!template.equals(Const.NONE_VALUE)) { MailTemplate mailTemplate = MailTemplate.findByName( StringUtils.isNotEmpty(template) ? template : permission.permissionRequestMailTemplate != null ? permission.permissionRequestMailTemplate.name : Const.DEFAULT_TEMPLATE ); messageSubject = mailTemplate.subject; // messageBody = mailTemplate.text; messageBody = mailTemplate.readTemplate(); String[] placeHolderArray = Utils.INSTANCE.getMailArray(mailTemplate.placeHolders); Logger.debug("setPendingSelectedCrawlPermissions permission.target: " + permission.target.title); Logger.debug("target id: " + permission.target.id); String licenseUrl = routes.LicenseController.form(permission.token).absoluteURL(request()).toString(); Logger.debug("setPendingSelectedCrawlPermissions current: " + licenseUrl); licenseUrl = injectServerName(licenseUrl); Logger.debug("setPendingSelectedCrawlPermissions new: " + licenseUrl); messageBody = CrawlPermission. replaceTwoStringsInText( messageBody , Const.PLACE_HOLDER_DELIMITER + placeHolderArray[0] + Const.PLACE_HOLDER_DELIMITER , Const.PLACE_HOLDER_DELIMITER + placeHolderArray[1] + Const.PLACE_HOLDER_DELIMITER , permission.target.title , licenseUrl); } else { Logger.debug("selected 'None' template type"); } Logger.debug("email: " + email + ", " + messageSubject + ", " + messageBody); if (StringUtils.isNotBlank(email)) { EmailHelper.sendMessage(email, messageSubject, messageBody); // EmailHelper.sendMessage(toMailAddresses, messageSubject, messageBody); permission.status = Const.CrawlPermissionStatus.PENDING.name(); Target target = Target.findById(permission.target.id); target.licenseStatus = Const.CrawlPermissionStatus.PENDING.name(); //updating target page permission.requestedAt=Utils.INSTANCE.getCurrentTimeStamp(); //new code to update requested date Logger.debug("new permission status:>> " + permission.status +" Permission status in target page "+target.licenseStatus); Ebean.update(permission); Ebean.update(target); CommunicationLog log = CommunicationLog.logHistory(Const.PERMISSION + " " + permission.status, permission, permission.user, Const.UPDATE + "\nSubject: " + messageSubject + "\n" + messageBody); Ebean.save(log); Logger.debug("updated permission name: " + permission.name + ", status: " + permission.status + ", requestedDate: " + permission.requestedAt); updateAllByTarget(permission.id, permission.target.id, permission.status); // TargetController.updateQaStatus(permission.target.title, permission.status); } else { throw new ActException("Missing contact email. Please check contact person"); // Logger.debug("Missing contact email. Please check contact person"); // res = false; // break; } } return res; } /** * This method handles queued crawl permissions. */ public static Result send() throws ActException { Logger.debug("send crawl permission"); Result res = ok(); DynamicForm requestData = Form.form().bindFromRequest(); String action = requestData.get("action"); if (StringUtils.isNotBlank(action)) { String template = ""; String temp = requestData.get(Const.TEMPLATE); if (StringUtils.isNotBlank(temp)) { template = temp; } String status = requestData.get("statusValue"); Logger.debug("status: " + status); int pageNo = Integer.parseInt(requestData.get("pageNo")); Logger.debug("pageNo: " + pageNo); Map<String, String[]> formParams = request().body().asFormUrlEncoded(); String[] permissionValues = formParams.get("permissionsList"); List<CrawlPermission> crawlPermissions = new ArrayList<CrawlPermission>(); if (permissionValues != null && permissionValues.length > 0) { for (String permissionValue : permissionValues) { if (StringUtils.isNotBlank(permissionValue)) { Long permissionId = Long.valueOf(permissionValue); CrawlPermission crawlPermission = CrawlPermission.findById(permissionId); Logger.debug("crawlPermissions: send() has found: "+crawlPermission); crawlPermissions.add(crawlPermission); } } } Logger.debug("crawlPermissions: total = " + crawlPermissions.size()); if (action.equals("sendsome")) { Logger.debug("send some crawl permission requests"); boolean sendingRes = setPendingSelectedCrawlPermissions(template, crawlPermissions);//messageBody, messageSubject); if (!sendingRes) { flash("message", "Missing contact email. Please check contact person"); } res = redirect(routes.CrawlPermissionController.index()); } if (action.equals("preview")) { Logger.debug("preview crawl permission requests"); if (crawlPermissions.size() > 1) { Logger.debug("crawlPermissions.size(): " + crawlPermissions.size() + " - " + status); flash("message", "Please select only one email to preview"); res = redirect(routes.CrawlPermissionController.list( 0, Const.NAME, Const.ASC, "", status, Const.SELECT_ALL)); return res; } CrawlPermission crawlPermission = null; if (permissionValues != null && permissionValues.length > 0) { // should only be one after the above String permissionValue = permissionValues[0]; if (StringUtils.isNotBlank(permissionValue)) { Long permissionId = Long.valueOf(permissionValue); crawlPermission = CrawlPermission.findById(permissionId); MailTemplate mailTemplate = MailTemplate.findByName( StringUtils.isNotEmpty(template) ? template : crawlPermission.permissionRequestMailTemplate != null ? crawlPermission.permissionRequestMailTemplate.name : Const.DEFAULT_TEMPLATE ); String toMails = crawlPermission.contactPerson.email; String messageSubject = mailTemplate.subject; String messageBody = mailTemplate.readTemplate(); messageBody = mailTemplate.readTemplate(); String[] placeHolderArray = Utils.INSTANCE.getMailArray(mailTemplate.placeHolders); String licenseUrl = routes.LicenseController.form(crawlPermission.token).absoluteURL(request()).toString(); licenseUrl = injectServerName(licenseUrl); messageBody = CrawlPermission. replaceTwoStringsInText( messageBody , Const.PLACE_HOLDER_DELIMITER + placeHolderArray[0] + Const.PLACE_HOLDER_DELIMITER , Const.PLACE_HOLDER_DELIMITER + placeHolderArray[1] + Const.PLACE_HOLDER_DELIMITER , crawlPermission.target.title , licenseUrl); res = ok( crawlpermissionpreview.render( crawlPermission, User.findByEmail(request().username()), toMails, mailTemplate.getName(), messageSubject, messageBody ) ); } } } if (action.equals("reject")) { Logger.debug("reject crawl permission requests"); rejectSelectedCrawlPermissions(crawlPermissions); res = redirect(routes.CrawlPermissionController.index()); } if (action.equals("selectall")) { Logger.debug("select all listed in page crawl permissions"); res = redirect(routes.CrawlPermissionController.list( pageNo, Const.NAME, Const.ASC, "", status, Const.SELECT_ALL)); } if (action.equals("deselectall")) { Logger.debug("deselect all listed in page crawl permissions"); res = redirect(routes.CrawlPermissionController.list( pageNo, Const.NAME, Const.ASC, "", status, Const.DESELECT_ALL)); } } return res; } /** * This method sends email preview to the user. */ public static Result sendPreview() { Logger.debug("send preview"); Result res = ok(); String preview = getFormParam(Const.PREVIEW); if (preview != null) { boolean sendingRes = true; Logger.debug("mail to contact person:" + getFormParam(Const.EMAIL) + "."); String email = request().username(); //getFormParam(Const.EMAIL); String messageSubject = getFormParam(Const.SUBJECT); String messageBody = getFormParam(Const.BODY); if (email != null) { EmailHelper.sendMessage(email, messageSubject, messageBody); } else { Logger.debug("Missing contact email. Please check contact person"); sendingRes = false; } if (!sendingRes) { flash("message", "Missing contact email. Please check contact person"); } res = redirect(routes.CrawlPermissionController.index()); } return res; } /** * This method checks if crawl permission for given target already exists. * @param target * @return true if exists false otherwise */ public static boolean checkCrawlPermissionTarget(String target) { Logger.debug("checkCrawlPermissionTarget target: " + target); boolean res = false; List<CrawlPermission> list = CrawlPermission.filterByTarget(target); if (list != null && list.size() > 0) { res = true; } return res; } /** * This method is checking if crawl permission for given target already exists and returns result in JSON format. * @param target * @return JSON result */ public static Result crawlPermissionExist(String target) { Logger.debug("crawlPermissionExist target: " + target); boolean res = checkCrawlPermissionTarget(target); Logger.debug("crawl permission exists res: " + res + ", target: " + target); return ok(Json.toJson(res)); } /** * This method is checking if crawl permission for given target already exists and returns result in JSON format. * @param target * @return JSON result */ public static Result crawlPermissionExistAtHigherLevel(String target) { Logger.debug("crawlPermissionExistAtHigherLevel target: " + target); boolean res = false; String path = ""; if (target != null) { if (target.contains(Const.SLASH_DELIMITER)) { String[] parts = target.split(Const.SLASH_DELIMITER); for (String part: parts) { try { res = checkCrawlPermissionTarget(path + part); if (res) { break; } else { path = path + part + Const.SLASH_DELIMITER; } } catch (Exception e) { Logger.debug("crawlPermissionExistAtHigherLevel error: " + e); } } } } Logger.debug("crawl permission in higher level exists res: " + res + ", target: " + target); return ok(Json.toJson(res)); } /** * This method is checking if crawl permission for given target for higher level * would be possible and returns result in JSON format. * @param target * @return JSON result */ public static Result checkForHigherLevelPrompt(String target) { Logger.debug("checkForHigherLevelPrompt target: " + target); boolean res = false; if (target != null) { if (target.contains(Const.SLASH_DELIMITER)) { String[] parts = target.split(Const.SLASH_DELIMITER); if (parts.length > 1) { res = true; } } } Logger.debug("crawl permission in higher level exists res: " + res + ", target: " + target); return ok(Json.toJson(res)); } /** * This method checks if permission contains a contact person. It is * necessary in order to send permission request to this person. * Otherwise send buttons are disabled. * @param list * @return check result */ public static boolean haveContactPerson(List<CrawlPermission> permissionList) { boolean res = true; Iterator<CrawlPermission> permissionItr = permissionList.iterator(); while (permissionItr.hasNext()) { CrawlPermission permission = permissionItr.next(); if (permission.contactPerson == null) { res = false; } } return res; } @BodyParser.Of(BodyParser.Json.class) public static Result filterByJson(String name) { JsonNode jsonData = null; if (name != null) { List<CrawlPermission> permissions = CrawlPermission.filterByName(name); jsonData = Json.toJson(permissions); } return ok(jsonData); } public static CrawlPermission setContactPerson(CrawlPermission crawlPermission, String url) { crawlPermission.contactPerson.url = url; return crawlPermission; } }