package edu.asu.spring.quadriga.web.dictionary;
import java.security.Principal;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
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.IQuadrigaRole;
import edu.asu.spring.quadriga.domain.IUser;
import edu.asu.spring.quadriga.domain.dictionary.IDictionary;
import edu.asu.spring.quadriga.domain.dictionary.IDictionaryCollaborator;
import edu.asu.spring.quadriga.domain.dictionary.IDictionaryItems;
import edu.asu.spring.quadriga.domain.factory.dictionary.IDictionaryFactory;
import edu.asu.spring.quadriga.domain.impl.WordpowerReply.DictionaryEntry;
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
*
* @author : Lohith Dwaraka
*
*/
@Controller
public class DictionaryController {
@Autowired
private IDictionaryManager dictonaryManager;
@Autowired
private IUserManager usermanager;
@Autowired
private IQuadrigaRoleManager collaboratorRoleManager;
@Autowired
private IDictionaryFactory dictionaryFactory;
@Autowired
private IDictionaryManager dictionaryManager;
@Autowired
private MessageSource messageSource;
private static final Logger logger = LoggerFactory.getLogger(DictionaryController.class);
/**
* Admin can use this page to check the list of dictionary items in a
* dictionary and to search and add items from the word power
*
* @return Return to the list dictionary items page of the Quadriga
* @throws QuadrigaStorageException
* @throws QuadrigaAccessException
* @throws JSONException
*/
@AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.DICTIONARY, paramIndex = 1, userRole = {
RoleNames.ROLE_DICTIONARY_COLLABORATOR_ADMIN, RoleNames.ROLE_DICTIONARY_COLLABORATOR_READ,
RoleNames.ROLE_DICTIONARY_COLLABORATOR_READ_WRITE }) })
@RequestMapping(value = "auth/dictionaries/{dictionaryid}", method = RequestMethod.GET)
public String getDictionaryPage(@PathVariable("dictionaryid") String dictionaryid, ModelMap model,
Principal principal) throws QuadrigaStorageException, QuadrigaAccessException, JSONException {
// fetch the dictionary details
IDictionary dictionary = dictionaryManager.getDictionaryDetails(dictionaryid);
String userName = principal.getName();
// TODO: getDictionariesItems() should return IDictionaryItems
List<IDictionaryItems> dictionaryItemList = dictonaryManager.getDictionaryItems(dictionaryid);
model.addAttribute("dictionaryItemList", dictionaryItemList);
model.addAttribute("dictionary", dictionary);
List<IDictionaryCollaborator> existingCollaborators = dictonaryManager.showCollaboratingUsers(dictionaryid);
model.addAttribute("collaboratingUsers", existingCollaborators);
IDictionary dictionaryObj = dictionaryFactory.createDictionaryObject();
dictionaryObj.setDictionaryId(dictionaryid);
dictionaryObj = dictionaryManager.getDictionaryDetails(dictionaryid);
model.addAttribute("owner", dictionaryObj.getOwner().getUserName().equals(userName));
setPermissions(model, userName, existingCollaborators);
String jsonTreeData = dictonaryManager.getProjectsTree(userName, dictionaryid);
model.addAttribute("core", jsonTreeData);
return "auth/dictionary/dictionary";
}
private void setPermissions(ModelMap model, String userName, List<IDictionaryCollaborator> existingCollaborators) {
for (IDictionaryCollaborator collab : existingCollaborators) {
// if current user is a collaborator, lets get their role
if (collab.getCollaborator().getUserObj().getUserName().equals(userName)) {
List<IQuadrigaRole> roles = collab.getCollaborator().getCollaboratorRoles();
for (IQuadrigaRole role : roles) {
if (role.getId().equals(RoleNames.ROLE_DICTIONARY_COLLABORATOR_ADMIN)) {
model.addAttribute("isAdmin", true);
model.addAttribute("hasWrite", true);
model.addAttribute("hasRead", true);
}
if (role.getId().equals(RoleNames.ROLE_DICTIONARY_COLLABORATOR_READ_WRITE)) {
model.addAttribute("hasWrite", true);
model.addAttribute("hasRead", true);
}
if (role.getId().equals(RoleNames.ROLE_DICTIONARY_COLLABORATOR_READ)) {
model.addAttribute("hasRead", true);
}
}
}
}
// set owner permissions
if (model.get("owner").equals(true)) {
model.addAttribute("isAdmin", true);
model.addAttribute("hasWrite", true);
model.addAttribute("hasRead", true);
}
}
/**
* 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/deleteDictionaryItems/{dictionaryid}", method = RequestMethod.POST)
public String deleteDictionaryItem(HttpServletRequest req, @PathVariable("dictionaryid") String dictionaryId,
ModelMap model, Principal principal, Locale locale) throws QuadrigaStorageException,
QuadrigaAccessException {
IUser user = usermanager.getUser(principal.getName());
String[] values = req.getParameterValues("selected");
if (values == null) {
List<IDictionaryItems> dictionaryItemList = dictonaryManager.getDictionaryItems(dictionaryId);
String dictionaryName = dictonaryManager.getDictionaryName(dictionaryId);
model.addAttribute("show_error_alert", true);
model.addAttribute("error_alert_msg",
messageSource.getMessage("dictionary.items.remove.no_selection", new Object[] {}, locale));
model.addAttribute("dictionaryItemList", dictionaryItemList);
model.addAttribute("dictName", dictionaryName);
model.addAttribute("dictID", dictionaryId);
IDictionary dictionary = dictionaryManager.getDictionaryDetails(dictionaryId);
model.addAttribute("dictionary", dictionary);
JSONObject core = new JSONObject();
model.addAttribute("core", core.toString());
return "auth/dictionary/dictionary";
}
// Remove entries
for (int i = 0; i < values.length; i++) {
dictonaryManager.deleteDictionariesItems(dictionaryId, values[i], user.getUserName());
}
model.addAttribute("show_success_alert", true);
model.addAttribute("success_alert_msg",
messageSource.getMessage("dictionary.items.remove.success", new Object[] {}, locale));
List<IDictionaryItems> dictionaryItemList = dictonaryManager.getDictionaryItems(dictionaryId);
String dictionaryName = dictonaryManager.getDictionaryName(dictionaryId);
model.addAttribute("dictionaryItemList", dictionaryItemList);
model.addAttribute("dictName", dictionaryName);
model.addAttribute("dictID", dictionaryId);
IDictionary dictionary = dictionaryManager.getDictionaryDetails(dictionaryId);
model.addAttribute("dictionary", dictionary);
JSONObject core = new JSONObject();
model.addAttribute("core", core.toString());
return "auth/dictionary/dictionary";
}
/**
* 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/updateDictionaryItems/{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);
// model.addAttribute("updateerrormsg", "Items were not selected");
List<IDictionaryItems> dictionaryItemList = dictonaryManager.getDictionaryItems(dictionaryId);
String dictionaryName = dictonaryManager.getDictionaryName(dictionaryId);
model.addAttribute("dictionaryItemList", dictionaryItemList);
model.addAttribute("dictName", dictionaryName);
model.addAttribute("dictID", dictionaryId);
JSONObject core = new JSONObject();
model.addAttribute("core", core.toString());
IDictionary dictionary = dictionaryManager.getDictionaryDetails(dictionaryId);
model.addAttribute("dictionary", dictionary);
return "auth/dictionary/dictionary";
} 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.getDictionaryItems(dictionaryId);
String dictionaryName = dictonaryManager.getDictionaryName(dictionaryId);
model.addAttribute("dictionaryItemList", dictionaryItemList);
model.addAttribute("dictName", dictionaryName);
IDictionary dictionary = dictionaryManager.getDictionaryDetails(dictionaryId);
model.addAttribute("dictionary", dictionary);
model.addAttribute("dictID", dictionaryId);
JSONObject core = new JSONObject();
model.addAttribute("core", core.toString());
return "auth/dictionary/dictionary";
}
}