package edu.asu.spring.quadriga.web.dictionary;
import java.security.Principal;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import edu.asu.spring.quadriga.aspects.annotations.AccessPolicies;
import edu.asu.spring.quadriga.aspects.annotations.CheckedElementType;
import edu.asu.spring.quadriga.aspects.annotations.ElementAccessPolicy;
import edu.asu.spring.quadriga.domain.IUser;
import edu.asu.spring.quadriga.domain.dictionary.IDictionaryItems;
import edu.asu.spring.quadriga.domain.impl.WordpowerReply.DictionaryEntry;
import edu.asu.spring.quadriga.domain.impl.dictionary.Item;
import edu.asu.spring.quadriga.exceptions.QuadrigaAccessException;
import edu.asu.spring.quadriga.exceptions.QuadrigaStorageException;
import edu.asu.spring.quadriga.service.IQuadrigaRoleManager;
import edu.asu.spring.quadriga.service.IUserManager;
import edu.asu.spring.quadriga.service.dictionary.IDictionaryManager;
import edu.asu.spring.quadriga.web.login.RoleNames;
/**
* This class will handle list dictionaries items controller for the dictionary
* (collaborators)
*
* @author : Lohith Dwaraka
*
*/
@Controller
public class DictionaryItemCollabController {
@Autowired
private IDictionaryManager dictonaryManager;
private static final Logger logger = LoggerFactory
.getLogger(DictionaryController.class);
@Autowired
private IUserManager usermanager;
@Autowired
private IQuadrigaRoleManager collaboratorRoleManager;
/**
* Retrieve the dictionary items associated with the logged in user
*
* @param dictionaryid
* @param model
* @param principal
* @return
* @throws QuadrigaStorageException
* @throws QuadrigaAccessException
*/
@RequestMapping(value = "auth/dictionaries/collab/{dictionaryid}", method = RequestMethod.GET)
public String getDictionaryCollabPage(
@PathVariable("dictionaryid") String dictionaryid, ModelMap model,
Principal principal) throws QuadrigaStorageException,
QuadrigaAccessException {
IUser user = usermanager.getUser(principal.getName());
List<IDictionaryItems> dictionaryItemList = dictonaryManager
.getDictionaryItemsDetailsCollab(dictionaryid);
String dictionaryName = dictonaryManager.getDictionaryName(dictionaryid);
List<String> roles = dictonaryManager.getDictionaryCollaboratorRoles(
user.getUserName(), dictionaryid);
for (String tempRole : roles) {
String roleType = collaboratorRoleManager.getQuadrigaRoleByDbId(
IQuadrigaRoleManager.DICT_ROLES, tempRole).getId();
if (roleType
.equals(RoleNames.ROLE_DICTIONARY_COLLABORATOR_READ_WRITE)) {
model.addAttribute("roleAccess", 1);
}
}
model.addAttribute("dictionaryItemList", dictionaryItemList);
model.addAttribute("dictName", dictionaryName);
model.addAttribute("dictionaryid", dictionaryid);
return "auth/dictionary/dictionarycollab";
}
/**
* Admin can use this to delete a dictionary item to dictionary
*
* @return Return to list dictionary item page
* @throws QuadrigaStorageException
*/
@AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.DICTIONARY, paramIndex = 2, userRole = {
RoleNames.ROLE_DICTIONARY_COLLABORATOR_ADMIN,
RoleNames.ROLE_DICTIONARY_COLLABORATOR_READ_WRITE }) })
@RequestMapping(value = "auth/dictionaries/deleteDictionaryItemsCollab/{dictionaryid}", method = RequestMethod.POST)
public String deleteDictionaryItem(HttpServletRequest req,
@PathVariable("dictionaryid") String dictionaryId, ModelMap model,
Principal principal) throws QuadrigaStorageException, QuadrigaAccessException {
IUser user = usermanager.getUser(principal.getName());
String[] values = req.getParameterValues("selected");
String msg = "";
String errormsg = "";
int flag = 0;
if (values == null) {
model.addAttribute("collab", 1);
model.addAttribute("delsuccess", 0);
// model.addAttribute("delerrormsg", "Items were not selected");
List<IDictionaryItems> dictionaryItemList = dictonaryManager
.getDictionaryItemsDetailsCollab(dictionaryId);
String dictionaryName = dictonaryManager
.getDictionaryName(dictionaryId);
model.addAttribute("dictionaryItemList", dictionaryItemList);
model.addAttribute("dictName", dictionaryName);
List<String> roles = dictonaryManager
.getDictionaryCollaboratorRoles(user.getUserName(),
dictionaryId);
for (String tempRole : roles) {
String roleType = collaboratorRoleManager
.getQuadrigaRoleByDbId(IQuadrigaRoleManager.DICT_ROLES,
tempRole).getId();
if (roleType
.equals(RoleNames.ROLE_DICTIONARY_COLLABORATOR_READ_WRITE)) {
model.addAttribute("roleAccess", 1);
}
}
model.addAttribute("dictID", dictionaryId);
return "auth/dictionary/dictionarycollab";
} else {
for (int i = 0; i < values.length; i++) {
logger.info("Deleting item for dictionary id: " + dictionaryId
+ " and term id : " + i + " : " + values[i]);
dictonaryManager.deleteDictionaryItemsCollab(dictionaryId,
values[i]);
if (!msg.equals("")) {
flag = 1;
errormsg = msg;
}
}
}
if (flag == 0) {
model.addAttribute("delsuccess", 1);
// model.addAttribute("delsuccessmsg",
// "Items deleted successfully");
} else if (flag == 1) {
logger.info(" Errormsg " + errormsg);
if (errormsg.equals("Item doesnot exists in this dictionary")) {
model.addAttribute("delsuccess", 0);
model.addAttribute("delerrormsg",
"Items doesn't exist for dictionary id :"
+ dictionaryId);
} else {
model.addAttribute("delsuccess", 0);
model.addAttribute("delerrormsg", errormsg);
}
}
List<IDictionaryItems> dictionaryItemList = dictonaryManager
.getDictionaryItemsDetailsCollab(dictionaryId);
String dictionaryName = dictonaryManager
.getDictionaryName(dictionaryId);
List<String> role = dictonaryManager.getDictionaryCollaboratorRoles(
user.getUserName(), dictionaryId);
for (String tempRole : role) {
String roleType = collaboratorRoleManager.getQuadrigaRoleByDbId(
IQuadrigaRoleManager.DICT_ROLES, tempRole).getId();
if (roleType
.equals(RoleNames.ROLE_DICTIONARY_COLLABORATOR_READ_WRITE)) {
model.addAttribute("roleAccess", 1);
}
}
model.addAttribute("dictionaryItemList", dictionaryItemList);
model.addAttribute("dictName", dictionaryName);
model.addAttribute("dictID", dictionaryId);
return "auth/dictionary/dictionarycollab";
}
/**
* Admin can use this to update a dictionary item's item to dictionary
*
* @return Return to list dictionary item page
*/
@AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.DICTIONARY, paramIndex = 2, userRole = {
RoleNames.ROLE_DICTIONARY_COLLABORATOR_ADMIN,
RoleNames.ROLE_DICTIONARY_COLLABORATOR_READ_WRITE }) })
@RequestMapping(value = "auth/dictionaries/updateDictionaryItemsCollab/{dictionaryid}", method = RequestMethod.POST)
public String updateDictionaryItem(HttpServletRequest req,
@PathVariable("dictionaryid") String dictionaryId, ModelMap model,
Principal principal) throws QuadrigaStorageException, QuadrigaAccessException {
IUser user = usermanager.getUser(principal.getName());
String[] values = req.getParameterValues("selected");
String msg = "";
String errormsg = "";
int flag = 0;
if (values == null) {
model.addAttribute("updatesuccess", 0);
List<IDictionaryItems> dictionaryItemList = dictonaryManager
.getDictionaryItemsDetailsCollab(dictionaryId);
String dictionaryName = dictonaryManager
.getDictionaryName(dictionaryId);
List<String> roles = dictonaryManager
.getDictionaryCollaboratorRoles(user.getUserName(),
dictionaryId);
for (String tempRole : roles) {
String roleType = collaboratorRoleManager
.getQuadrigaRoleByDbId(IQuadrigaRoleManager.DICT_ROLES,
tempRole).getId();
if (roleType
.equals(RoleNames.ROLE_DICTIONARY_COLLABORATOR_READ_WRITE)) {
model.addAttribute("roleAccess", 1);
}
}
model.addAttribute("collab", 1);
model.addAttribute("dictionaryItemList", dictionaryItemList);
model.addAttribute("dictName", dictionaryName);
model.addAttribute("dictID", dictionaryId);
return "auth/dictionary/dictionarycollab";
} else {
for (int i = 0; i < values.length; i++) {
List<DictionaryEntry> dictionaryEntryList = dictonaryManager
.getUpdateFromWordPower(dictionaryId, values[i]);
Iterator<DictionaryEntry> I = dictionaryEntryList.iterator();
if (I.hasNext()) {
DictionaryEntry dictionaryEntry = I.next();
dictonaryManager.updateDictionariesItems(dictionaryId,
values[i], dictionaryEntry.getLemma(),
dictionaryEntry.getPos());
} else {
msg = "Error getting data from Word Power";
flag = 1;
errormsg = msg;
}
if (!msg.equals("")) {
flag = 1;
errormsg = msg;
}
}
}
if (flag == 0) {
// these things don't need to be logged.
logger.debug("Successfully updated");
model.addAttribute("updatesuccess", 1);
model.addAttribute("updatesuccessmsg", "Items updated successfully");
} else if (flag == 1) {
logger.info("Please check errormsg : " + errormsg);
if (errormsg.equals("Item doesnot exists in this dictionary")) {
model.addAttribute("updatesuccess", 0);
model.addAttribute("updateerrormsg",
"Items doesn't exist for dictionary id :"
+ dictionaryId);
} else {
model.addAttribute("updatesuccess", 0);
model.addAttribute("updateerrormsg", errormsg);
}
}
logger.debug("Item Returned ");
List<IDictionaryItems> dictionaryItemList = dictonaryManager
.getDictionaryItemsDetailsCollab(dictionaryId);
String dictionaryName = dictonaryManager
.getDictionaryName(dictionaryId);
model.addAttribute("dictionaryItemList", dictionaryItemList);
List<String> role = dictonaryManager.getDictionaryCollaboratorRoles(
user.getUserName(), dictionaryId);
for (String tempRole : role) {
String roleType = collaboratorRoleManager.getQuadrigaRoleByDbId(
IQuadrigaRoleManager.DICT_ROLES, tempRole).getId();
if (roleType
.equals(RoleNames.ROLE_DICTIONARY_COLLABORATOR_READ_WRITE)) {
model.addAttribute("roleAccess", 1);
}
}
model.addAttribute("dictName", dictionaryName);
model.addAttribute("dictID", dictionaryId);
return "auth/dictionary/dictionarycollab";
}
/**
* This methods adds the selected items to the dictionary.
*
* @param req
* @param dictionaryId
* @param dictionaryItems
* @param model
* @param principal
* @return
* @throws QuadrigaStorageException
* @throws QuadrigaAccessException
*/
@AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.DICTIONARY, paramIndex = 2, userRole = {
RoleNames.ROLE_DICTIONARY_COLLABORATOR_ADMIN,
RoleNames.ROLE_DICTIONARY_COLLABORATOR_READ_WRITE }) })
@RequestMapping(value = "auth/dictionaries/addDictionaryItemsCollab/{dictionaryid}", method = RequestMethod.POST)
public String addDictionaryItem(HttpServletRequest req,
@PathVariable("dictionaryid") String dictionaryId,
@ModelAttribute("SpringWeb") Item dictionaryItems, ModelMap model,
Principal principal) throws QuadrigaStorageException,
QuadrigaAccessException {
IUser user = usermanager.getUser(principal.getName());
String msg = "";
String[] values = req.getParameterValues("selected");
if (values != null) {
dictonaryManager.addDictionaryItems(dictionaryItems, values,
dictionaryId);
} else {
model.addAttribute("additemsuccess", 2);
List<IDictionaryItems> dictionaryItemList = dictonaryManager
.getDictionaryItemsDetailsCollab(dictionaryId);
String dictionaryName = dictonaryManager
.getDictionaryName(dictionaryId);
List<String> roles = dictonaryManager
.getDictionaryCollaboratorRoles(user.getUserName(),
dictionaryId);
for (String tempRole : roles) {
String roleType = collaboratorRoleManager
.getQuadrigaRoleByDbId(IQuadrigaRoleManager.DICT_ROLES,
tempRole).getId();
if (roleType
.equals(RoleNames.ROLE_DICTIONARY_COLLABORATOR_READ_WRITE)) {
model.addAttribute("roleAccess", 1);
}
}
model.addAttribute("collab", 1);
model.addAttribute("dictionaryItemList", dictionaryItemList);
model.addAttribute("dictName", dictionaryName);
model.addAttribute("dictID", dictionaryId);
return "auth/dictionary/dictionarycollab";
}
if (msg.equals("")) {
model.addAttribute("additemsuccess", 1);
} else {
if (msg.equals("ItemExists")) {
model.addAttribute("additemsuccess", 0);
model.addAttribute("errormsg",
"Items already exist for dictionary id :"
+ dictionaryId);
} else {
model.addAttribute("additemssuccess", 0);
model.addAttribute("errormsg", msg);
}
}
List<IDictionaryItems> dictionaryItemList = dictonaryManager
.getDictionaryItemsDetailsCollab(dictionaryId);
String dictionaryName = dictonaryManager
.getDictionaryName(dictionaryId);
List<String> role = dictonaryManager.getDictionaryCollaboratorRoles(
user.getUserName(), dictionaryId);
for (String tempRole : role) {
String roleType = collaboratorRoleManager.getQuadrigaRoleByDbId(
IQuadrigaRoleManager.DICT_ROLES, tempRole).getId();
if (roleType
.equals(RoleNames.ROLE_DICTIONARY_COLLABORATOR_READ_WRITE)) {
model.addAttribute("roleAccess", 1);
}
}
model.addAttribute("dictionaryItemList", dictionaryItemList);
model.addAttribute("dictName", dictionaryName);
model.addAttribute("dictID", dictionaryId);
return "auth/dictionary/dictionarycollab";
}
/**
* Handles the add dictionary item page
*
* @return Return to the adddictionaryitems JSP
*/
@RequestMapping(value = "auth/dictionaries/addDictionaryItemsCollab/{dictionaryid}", method = RequestMethod.GET)
public String addDictionaryPage(
@PathVariable("dictionaryid") String dictionaryid, ModelMap model) {
model.addAttribute("collab", 1);
model.addAttribute("dictionaryid", dictionaryid);
return "auth/dictionaries/addDictionaryItemsCollab";
}
/**
* Admin can use this to search from term and pos from word power
*
* @return Return to list dictionary item page
* @throws QuadrigaStorageException
* @throws QuadrigaUIAccessException
*/
@RequestMapping(value = "auth/dictionaries/dictionarycollab/wordSearch/{dictionaryid}", method = RequestMethod.POST)
public String searchDictionaryItemRestHandle(
@PathVariable("dictionaryid") String dictionaryid,
@RequestParam("itemName") String item,
@RequestParam("posdropdown") String pos, ModelMap model,
Principal principal) throws QuadrigaStorageException,
QuadrigaAccessException {
IUser user = usermanager.getUser(principal.getName());
try {
List<DictionaryEntry> dictionaryEntryList = null;
if (!item.equals("")) {
logger.debug("Query for Item :" + item + " and pos :" + pos);
dictionaryEntryList = dictonaryManager.searchWordPower(item,
pos);
}
model.addAttribute("status", 1);
model.addAttribute("dictionaryEntryList", dictionaryEntryList);
List<IDictionaryItems> dictionaryItemList = dictonaryManager
.getDictionaryItems(dictionaryid);
String dictionaryName = dictonaryManager
.getDictionaryName(dictionaryid);
model.addAttribute("dictionaryItemList", dictionaryItemList);
model.addAttribute("dictName", dictionaryName);
model.addAttribute("dictionaryid", dictionaryid);
if (dictionaryEntryList == null) {
model.addAttribute("errorstatus", 1);
}
model.addAttribute("collab", 1);
} catch (QuadrigaStorageException e) {
throw new QuadrigaStorageException(
"Oops the DB is an hard hangover, please try later");
} catch (Exception e) {
logger.error(e.getMessage());
}
return "auth/dictionaries/addDictionaryItemsCollab";
}
}