use of ai.elimu.model.Contributor in project webapp by elimu-ai.
the class WordCreateController method handleSubmit.
@RequestMapping(method = RequestMethod.POST)
public String handleSubmit(HttpSession session, @Valid Word word, BindingResult result, Model model) {
logger.info("handleSubmit");
Word existingWord = wordDao.readByText(word.getLocale(), word.getText());
if (existingWord != null) {
result.rejectValue("text", "NonUnique");
}
Contributor contributor = (Contributor) session.getAttribute("contributor");
List<Allophone> allophones = allophoneDao.readAllOrderedByUsage(contributor.getLocale());
// Verify that only valid Allophones are used
String allAllophonesCombined = "";
for (Allophone allophone : allophones) {
allAllophonesCombined += allophone.getValueIpa();
}
if (StringUtils.isNotBlank(word.getPhonetics())) {
for (char allophoneCharacter : word.getPhonetics().toCharArray()) {
String allophone = String.valueOf(allophoneCharacter);
if (!allAllophonesCombined.contains(allophone)) {
result.rejectValue("phonetics", "Invalid");
break;
}
}
}
if (result.hasErrors()) {
model.addAttribute("word", word);
model.addAttribute("allophones", allophones);
model.addAttribute("wordTypes", WordType.values());
model.addAttribute("spellingConsistencies", SpellingConsistency.values());
return "content/word/create";
} else {
if (!"I".equals(word.getText())) {
word.setText(word.getText().toLowerCase());
}
word.setTimeLastUpdate(Calendar.getInstance());
wordDao.create(word);
WordRevisionEvent wordRevisionEvent = new WordRevisionEvent();
wordRevisionEvent.setContributor(contributor);
wordRevisionEvent.setCalendar(Calendar.getInstance());
wordRevisionEvent.setWord(word);
wordRevisionEvent.setText(word.getText());
wordRevisionEvent.setPhonetics(word.getPhonetics());
wordRevisionEventDao.create(wordRevisionEvent);
// Label Image with Word of matching title
Image matchingImage = imageDao.read(word.getText(), word.getLocale());
if (matchingImage != null) {
Set<Word> labeledWords = matchingImage.getWords();
if (!labeledWords.contains(word)) {
labeledWords.add(word);
matchingImage.setWords(labeledWords);
imageDao.update(matchingImage);
}
}
// Delete syllables that are actual words
Syllable syllable = syllableDao.readByText(contributor.getLocale(), word.getText());
if (syllable != null) {
syllableDao.delete(syllable);
}
if (EnvironmentContextLoaderListener.env == Environment.PROD) {
String text = URLEncoder.encode(contributor.getFirstName() + " just added a new Word:\n" + "• Language: \"" + word.getLocale().getLanguage() + "\"\n" + "• Text: \"" + word.getText() + "\"\n" + "• Phonetics (IPA): /" + word.getPhonetics() + "/\n" + "• Word type: " + word.getWordType() + "\n" + "• Spelling consistency: " + word.getSpellingConsistency() + "\n" + "See ") + "http://elimu.ai/content/word/edit/" + word.getId();
String iconUrl = contributor.getImageUrl();
SlackApiHelper.postMessage(SlackApiHelper.getChannelId(Team.CONTENT_CREATION), text, iconUrl, null);
}
return "redirect:/content/word/list#" + word.getId();
}
}
use of ai.elimu.model.Contributor in project webapp by elimu-ai.
the class WordCreateController method handleRequest.
@RequestMapping(method = RequestMethod.GET)
public String handleRequest(Model model, HttpSession session) {
logger.info("handleRequest");
Word word = new Word();
model.addAttribute("word", word);
Contributor contributor = (Contributor) session.getAttribute("contributor");
List<Allophone> allophones = allophoneDao.readAllOrderedByUsage(contributor.getLocale());
model.addAttribute("allophones", allophones);
model.addAttribute("wordTypes", WordType.values());
model.addAttribute("spellingConsistencies", SpellingConsistency.values());
return "content/word/create";
}
use of ai.elimu.model.Contributor in project webapp by elimu-ai.
the class ProjectListController method handleListRequest.
@RequestMapping(value = "/list", method = RequestMethod.GET)
public String handleListRequest(Model model, HttpSession session) {
logger.info("handleListRequest");
Contributor contributor = (Contributor) session.getAttribute("contributor");
List<Project> projects = projectDao.read(contributor);
if (EnvironmentContextLoaderListener.env == Environment.DEV) {
if (projects.isEmpty()) {
// To ease development, auto-generate Projects
projects = generateProjects(contributor);
}
}
model.addAttribute("projects", projects);
return "project/list";
}
use of ai.elimu.model.Contributor in project webapp by elimu-ai.
the class AppCreateController method handleSubmit.
@RequestMapping(method = RequestMethod.POST)
public String handleSubmit(ApplicationVersion applicationVersion, @RequestParam("bytes") MultipartFile multipartFile, BindingResult result, Model model, HttpSession session, @PathVariable Long appGroupId, @PathVariable Long projectId, @PathVariable Long appCategoryId) {
logger.info("handleSubmit");
Project project = projectDao.read(projectId);
AppCategory appCategory = appCategoryDao.read(appCategoryId);
AppGroup appGroup = appGroupDao.read(appGroupId);
boolean isUpdateOfExistingApplication = applicationVersion.getApplication() != null;
logger.info("isUpdateOfExistingApplication: " + isUpdateOfExistingApplication);
Contributor contributor = (Contributor) session.getAttribute("contributor");
String packageName = null;
if (multipartFile.isEmpty()) {
result.rejectValue("bytes", "NotNull");
} else {
try {
byte[] bytes = multipartFile.getBytes();
Integer fileSizeInKb = bytes.length / 1024;
logger.info("fileSizeInKb: " + fileSizeInKb + " (" + (fileSizeInKb / 1024) + "MB)");
String contentType = multipartFile.getContentType();
logger.info("contentType: " + contentType);
// Auto-detect applicationId, versionCode, etc.
ByteArrayApkFile byteArrayApkFile = new ByteArrayApkFile(bytes);
ApkMeta apkMeta = byteArrayApkFile.getApkMeta();
packageName = apkMeta.getPackageName();
logger.info("packageName: " + packageName);
String label = apkMeta.getLabel();
logger.info("label: " + label);
byte[] icon = byteArrayApkFile.getIconFile().getData();
logger.info("icon.length: " + (icon.length / 1024) + "kB");
Integer versionCode = apkMeta.getVersionCode().intValue();
logger.info("versionCode: " + versionCode);
String versionName = apkMeta.getVersionName();
logger.info("versionName: " + versionName);
Integer minSdkVersion = Integer.valueOf(apkMeta.getMinSdkVersion());
logger.info("minSdkVersion: " + minSdkVersion);
// Check if Application already exists in the same AppCategory
// TODO
applicationVersion.setBytes(bytes);
applicationVersion.setFileSizeInKb(fileSizeInKb);
applicationVersion.setChecksumMd5(ChecksumHelper.calculateMD5(bytes));
applicationVersion.setContentType(contentType);
applicationVersion.setVersionCode(versionCode);
applicationVersion.setVersionName(versionName);
applicationVersion.setLabel(label);
applicationVersion.setMinSdkVersion(minSdkVersion);
applicationVersion.setIcon(icon);
applicationVersion.setTimeUploaded(Calendar.getInstance());
applicationVersion.setContributor(contributor);
if (isUpdateOfExistingApplication) {
// Verify that the packageName of the APK update matches that of the Application
if (!applicationVersion.getApplication().getPackageName().equals(packageName)) {
result.rejectValue("application", "NonUnique");
}
}
if (!isUpdateOfExistingApplication) {
// Verify that an Application with identical packageName has not already been uploaded withing the same Project
Application existingApplication = applicationDao.readByPackageName(project, packageName);
if (existingApplication != null) {
result.rejectValue("application", "NonUnique", new String[] { "application" }, null);
}
}
if (isUpdateOfExistingApplication) {
// Verify that the versionCode is higher than previous ones
List<ApplicationVersion> existingApplicationVersions = applicationVersionDao.readAll(applicationVersion.getApplication());
for (ApplicationVersion existingApplicationVersion : existingApplicationVersions) {
if (existingApplicationVersion.getVersionCode() >= applicationVersion.getVersionCode()) {
result.rejectValue("versionCode", "TooLow");
break;
}
}
}
} catch (IOException ex) {
logger.error(ex);
}
}
if (result.hasErrors()) {
model.addAttribute("project", project);
model.addAttribute("appCategory", appCategory);
model.addAttribute("appGroup", appGroup);
return "project/app/create";
} else {
Application application = applicationVersion.getApplication();
logger.info("application: " + application);
if (application == null) {
// First-time upload for packageName
// Create new Application
application = new Application();
// TODO: Add Locale to each Project?
application.setLocale(contributor.getLocale());
application.setPackageName(packageName);
application.setApplicationStatus(ApplicationStatus.MISSING_APK);
application.setContributor(contributor);
application.setProject(project);
applicationDao.create(application);
appGroup.getApplications().add(application);
appGroupDao.update(appGroup);
applicationVersion.setApplication(application);
applicationVersionDao.create(applicationVersion);
application.setApplicationStatus(ApplicationStatus.ACTIVE);
applicationDao.update(application);
} else {
// Update of existing packageName previously uploaded
// Create new ApplicationVersion for the existing Application
applicationVersionDao.create(applicationVersion);
}
// Refresh REST API cache
// jsonService.refreshApplicationsInAppCollection(appCollection);
jsonService.refreshApplicationsInAppCollection();
if (EnvironmentContextLoaderListener.env == Environment.PROD) {
String applicationDescription = !isUpdateOfExistingApplication ? "Application" : "APK version";
String text = URLEncoder.encode(contributor.getFirstName() + " just uploaded a new " + applicationDescription + ":\n" + "• Project: \"" + project.getName() + "\"\n" + "• App Category: \"" + appCategory.getName() + "\"\n" + "• Package name: \"" + application.getPackageName() + "\"\n" + "• Version code: " + applicationVersion.getVersionCode() + "\n" + "See ") + "http://elimu.ai/project/" + project.getId() + "/app-category/" + appCategory.getId() + "/app-group/" + appGroup.getId() + "/app/" + application.getId() + "/edit";
SlackApiHelper.postMessage("G6UR7UH2S", text, null, null);
}
if (!isUpdateOfExistingApplication) {
return "redirect:/project/{projectId}/app-category/{appCategoryId}/app-group/{appGroupId}/app/list#" + application.getId();
} else {
return "redirect:/project/{projectId}/app-category/{appCategoryId}/app-group/{appGroupId}/app/" + application.getId() + "/edit";
}
}
}
use of ai.elimu.model.Contributor in project webapp by elimu-ai.
the class AppEditController method handleSubmit.
@RequestMapping(method = RequestMethod.POST)
public String handleSubmit(@PathVariable Long projectId, @PathVariable Long appCategoryId, @PathVariable Long appGroupId, @PathVariable Long applicationId, HttpSession session, @Valid Application application, BindingResult result, Model model) {
logger.info("handleSubmit");
Project project = projectDao.read(projectId);
model.addAttribute("project", project);
AppCategory appCategory = appCategoryDao.read(appCategoryId);
model.addAttribute("appCategory", appCategory);
AppGroup appGroup = appGroupDao.read(appGroupId);
model.addAttribute("appGroup", appGroup);
if (result.hasErrors()) {
model.addAttribute("application", application);
List<ApplicationVersion> applicationVersions = applicationVersionDao.readAll(application);
model.addAttribute("applicationVersions", applicationVersions);
model.addAttribute("applicationStatuses", ApplicationStatus.values());
return "project/app/edit";
} else {
applicationDao.update(application);
if (application.getApplicationStatus() == ApplicationStatus.DELETED) {
// Delete corresponding ApplicationVersions
List<ApplicationVersion> applicationVersions = applicationVersionDao.readAll(application);
for (ApplicationVersion applicationVersion : applicationVersions) {
applicationVersionDao.delete(applicationVersion);
}
// Refresh REST API cache
// jsonService.refreshApplicationsInAppCollection(appCollection);
jsonService.refreshApplicationsInAppCollection();
if (EnvironmentContextLoaderListener.env == Environment.PROD) {
// Notify project members in Slack
Contributor contributor = (Contributor) session.getAttribute("contributor");
String text = URLEncoder.encode(contributor.getFirstName() + " just deleted an Application:\n" + "• Project: \"" + project.getName() + "\"\n" + "• App Category: \"" + appCategory.getName() + "\"\n" + "• Package name: \"" + application.getPackageName() + "\"\n" + "See ") + "http://elimu.ai/project/" + project.getId() + "/app-category/" + appCategory.getId() + "/app-group/" + appGroup.getId() + "/app/" + application.getId() + "/edit";
SlackApiHelper.postMessage("G6UR7UH2S", text, null, null);
}
}
return "redirect:/project/" + projectId + "/app-category/" + appCategoryId + "/app-group/" + appGroupId + "/app/list";
}
}
Aggregations