diff --git a/vspace/pom.xml b/vspace/pom.xml index c453493ef..21c22a48a 100644 --- a/vspace/pom.xml +++ b/vspace/pom.xml @@ -168,9 +168,9 @@ runtime - log4j - log4j - 1.2.15 + org.apache.logging.log4j + log4j-core + 2.1 javax.mail diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/aspects/ExhibitionDataAspect.java b/vspace/src/main/java/edu/asu/diging/vspace/core/aspects/ExhibitionDataAspect.java index b3a67339c..de5dc7882 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/aspects/ExhibitionDataAspect.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/aspects/ExhibitionDataAspect.java @@ -31,6 +31,7 @@ import edu.asu.diging.vspace.core.services.IExhibitionManager; import edu.asu.diging.vspace.core.services.IModuleManager; import edu.asu.diging.vspace.core.services.ISpaceManager; +import edu.asu.diging.vspace.core.services.ILanguageService; import edu.asu.diging.vspace.web.exhibit.view.ExhibitionConstants; @Component @@ -48,6 +49,9 @@ public class ExhibitionDataAspect { @Autowired private AuthenticationFacade authFacade; + + @Autowired + private ILanguageService languageService; @After("execution(public * edu.asu.diging.vspace.web..*Controller.*(..))") public void setExhibition(JoinPoint jp) { @@ -69,6 +73,29 @@ public void setExhibition(JoinPoint jp) { * spaces with null space status */ publishedSpaces.addAll(spaceManager.getSpacesWithStatus(null)); + + // Apply language localization to published spaces for navigation + try { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); + String selectedLanguage = request.getParameter("lang"); + if (selectedLanguage == null && request.getSession() != null) { + selectedLanguage = (String) request.getSession().getAttribute("selectedLanguage"); + } + if (selectedLanguage == null) { + selectedLanguage = languageService.getDefaultLanguageCode(); + } + + // Localize space names for navigation + for (ISpace space : publishedSpaces) { + String localizedName = languageService.getLocalizedText(space.getSpaceNames(), selectedLanguage, languageService.getDefaultLanguageCode()); + if (!localizedName.isEmpty()) { + space.setName(localizedName); + } + } + } catch (Exception e) { + // If language localization fails, continue with original names + } + ((Model) obj).addAttribute("publishedSpaces", publishedSpaces); } } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/data/ExhibitionLanguageRepository.java b/vspace/src/main/java/edu/asu/diging/vspace/core/data/ExhibitionLanguageRepository.java new file mode 100644 index 000000000..6b46c747f --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/data/ExhibitionLanguageRepository.java @@ -0,0 +1,24 @@ +package edu.asu.diging.vspace.core.data; + +import org.javers.spring.annotation.JaversSpringDataAuditable; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.stereotype.Repository; + +import edu.asu.diging.vspace.core.model.IExhibition; +import edu.asu.diging.vspace.core.model.IExhibitionLanguage; +import edu.asu.diging.vspace.core.model.impl.ExhibitionLanguage; + +@Repository +@JaversSpringDataAuditable +public interface ExhibitionLanguageRepository extends PagingAndSortingRepository{ + + ExhibitionLanguage findByLabel(String label); + + ExhibitionLanguage findByCode(String code); + + @Query("SELECT l FROM ExhibitionLanguage l WHERE l.exhibition = ?1 AND l.isDefault = true") + IExhibitionLanguage findByExhibitionAndIsDefault(IExhibition exhibition); + +} + diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/data/LocalizedTextRepository.java b/vspace/src/main/java/edu/asu/diging/vspace/core/data/LocalizedTextRepository.java new file mode 100644 index 000000000..aee735f8f --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/data/LocalizedTextRepository.java @@ -0,0 +1,18 @@ +package edu.asu.diging.vspace.core.data; + +import java.util.List; + +import org.javers.spring.annotation.JaversSpringDataAuditable; +import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.stereotype.Repository; + +import edu.asu.diging.vspace.core.model.IExhibitionLanguage; +import edu.asu.diging.vspace.core.model.impl.LocalizedText; + +@Repository +@JaversSpringDataAuditable +public interface LocalizedTextRepository extends PagingAndSortingRepository{ + + List findByExhibitionLanguage(IExhibitionLanguage language); + +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/exception/ExhibitionLanguageDeletionException.java b/vspace/src/main/java/edu/asu/diging/vspace/core/exception/ExhibitionLanguageDeletionException.java new file mode 100644 index 000000000..66c428120 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/exception/ExhibitionLanguageDeletionException.java @@ -0,0 +1,32 @@ +package edu.asu.diging.vspace.core.exception; + +public class ExhibitionLanguageDeletionException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public ExhibitionLanguageDeletionException() { + super(); + } + + public ExhibitionLanguageDeletionException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public ExhibitionLanguageDeletionException(String message, Throwable cause) { + super(message, cause); + } + + public ExhibitionLanguageDeletionException(String message) { + super(message); + } + + public ExhibitionLanguageDeletionException(Throwable cause) { + super(cause); + } + +} + diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/IAboutPageFormFactory.java b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/IAboutPageFormFactory.java new file mode 100644 index 000000000..f82c96ab0 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/IAboutPageFormFactory.java @@ -0,0 +1,13 @@ +package edu.asu.diging.vspace.core.factory; + +import edu.asu.diging.vspace.core.model.impl.ExhibitionAboutPage; +import edu.asu.diging.vspace.web.staff.forms.AboutPageForm; + +public interface IAboutPageFormFactory { + + /** + * Creates About Page form object + */ + AboutPageForm createAboutPageForm(ExhibitionAboutPage exhibitionAboutPage); + +} \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/IExhibitionAboutPageFactory.java b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/IExhibitionAboutPageFactory.java new file mode 100644 index 000000000..04cac6812 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/IExhibitionAboutPageFactory.java @@ -0,0 +1,15 @@ +package edu.asu.diging.vspace.core.factory; + +import java.util.List; + +import edu.asu.diging.vspace.core.model.ILocalizedText; +import edu.asu.diging.vspace.core.model.impl.ExhibitionAboutPage; + +public interface IExhibitionAboutPageFactory { + + /** + * Creates Exhibition About Page + */ + ExhibitionAboutPage createExhibitionAboutPage(String title, String aboutPageText, List localizedTitles, List localizedDescriptions); + +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ILocalizedTextFactory.java b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ILocalizedTextFactory.java new file mode 100644 index 000000000..75b01867a --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ILocalizedTextFactory.java @@ -0,0 +1,29 @@ +package edu.asu.diging.vspace.core.factory; + +import java.util.List; + +import edu.asu.diging.vspace.core.model.ILocalizedText; +import edu.asu.diging.vspace.core.model.IVSpaceElement; +import edu.asu.diging.vspace.core.model.impl.LocalizedText; +import edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm; + +public interface ILocalizedTextFactory { + +// ILocalizedText createLocalizedText(Object entity, LocalizedTextForm localizedTextFormData, List detailList); + + /** + * Adds localized text (names or descriptions) to the specified list. + * + * @param entity The entity (slide or space) to which the details will be added. + * @param localizedTextFormData The localized text form containing the details to be added. + * @param detailList The list in the entity where the details will be added (e.g., slideNames, spaceNames). + */ + LocalizedText createLocalizedText(IVSpaceElement entity, LocalizedText localizedText, + LocalizedTextForm localizedTextFormData, List detailList); + + LocalizedText createOrUpdateLocalizedText(IVSpaceElement entity, LocalizedTextForm localizedTextFormData, + List detailList); + + LocalizedText updateLocalizedText(LocalizedText localizedText, LocalizedTextForm localizedTextFormData); + +} \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ISlideFactory.java b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ISlideFactory.java index 0b2a5f2f0..dd1751166 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ISlideFactory.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ISlideFactory.java @@ -29,4 +29,4 @@ public interface ISlideFactory { */ ISlide createSlide(IModule module, SlideForm form, SlideType type); -} +} \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ISlideFormFactory.java b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ISlideFormFactory.java new file mode 100644 index 000000000..3a542347d --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ISlideFormFactory.java @@ -0,0 +1,11 @@ +package edu.asu.diging.vspace.core.factory; + +import edu.asu.diging.vspace.core.model.IExhibition; +import edu.asu.diging.vspace.core.model.ISlide; +import edu.asu.diging.vspace.web.staff.forms.SlideForm; + +public interface ISlideFormFactory { + + SlideForm createNewSlideForm(ISlide slide, IExhibition startExhibition); + +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ISpaceFactory.java b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ISpaceFactory.java index c311b285d..c064b56a5 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ISpaceFactory.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ISpaceFactory.java @@ -1,6 +1,7 @@ package edu.asu.diging.vspace.core.factory; import edu.asu.diging.vspace.core.model.ISpace; + import edu.asu.diging.vspace.web.staff.forms.SpaceForm; /** @@ -8,6 +9,7 @@ * instances of the edu.asu.diging.vspace.core.model.ISpace interface. */ public interface ISpaceFactory { + /** * (non-javadoc) * Creates an instance of the ISpace interface based on the given diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ISpaceFormFactory.java b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ISpaceFormFactory.java new file mode 100644 index 000000000..daac8b772 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ISpaceFormFactory.java @@ -0,0 +1,11 @@ +package edu.asu.diging.vspace.core.factory; + +import edu.asu.diging.vspace.core.model.IExhibition; +import edu.asu.diging.vspace.core.model.ISpace; +import edu.asu.diging.vspace.web.staff.forms.SpaceForm; + +public interface ISpaceFormFactory { + + SpaceForm createNewSpaceForm(ISpace space, IExhibition startExhibtion); + +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ITextBlockFactory.java b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ITextBlockFactory.java index bd0978179..a9603905b 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ITextBlockFactory.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/ITextBlockFactory.java @@ -22,5 +22,15 @@ public interface ITextBlockFactory { * @return The created text block instance of the edu.asu.diging.vspace.core.model.ITextBlock. */ ITextBlock createTextBlock(ISlide slide, String text); + + /** + * Creates a new text block with multilingual support. + * + * @param slide The slide to which the text block will be added. + * @param text The text content of the text block. + * @param languageCode The language code for the text content. + * @return The created text block instance of the edu.asu.diging.vspace.core.model.ITextBlock. + */ + ITextBlock createTextBlockWithLanguage(ISlide slide, String text, String languageCode); } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/ExhibitionAboutPageFactory.java b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/ExhibitionAboutPageFactory.java new file mode 100644 index 000000000..128fc45ba --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/ExhibitionAboutPageFactory.java @@ -0,0 +1,27 @@ +package edu.asu.diging.vspace.core.factory.impl; + +import java.util.List; + +import org.springframework.stereotype.Component; + +import edu.asu.diging.vspace.core.factory.IExhibitionAboutPageFactory; +import edu.asu.diging.vspace.core.model.ILocalizedText; +import edu.asu.diging.vspace.core.model.impl.ExhibitionAboutPage; + +@Component +public class ExhibitionAboutPageFactory implements IExhibitionAboutPageFactory{ + + @Override + public ExhibitionAboutPage createExhibitionAboutPage(String title, String aboutPageText, + List localizedTitles, List localizedDescriptions) { + + ExhibitionAboutPage exhibitionAboutPage = new ExhibitionAboutPage(); + exhibitionAboutPage.setTitle(title); + exhibitionAboutPage.setAboutPageText(aboutPageText); + exhibitionAboutPage.setExhibitionTitles(localizedTitles); + exhibitionAboutPage.setExhibitionTextDescriptions(localizedDescriptions); + + return exhibitionAboutPage; + } + +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/LocalizedTextFactory.java b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/LocalizedTextFactory.java new file mode 100644 index 000000000..425144aaa --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/LocalizedTextFactory.java @@ -0,0 +1,71 @@ +package edu.asu.diging.vspace.core.factory.impl; + +import java.util.List; + +import javax.transaction.Transactional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.thymeleaf.util.StringUtils; + +import edu.asu.diging.vspace.core.data.ExhibitionLanguageRepository; +import edu.asu.diging.vspace.core.data.LocalizedTextRepository; +import edu.asu.diging.vspace.core.factory.ILocalizedTextFactory; +import edu.asu.diging.vspace.core.model.ILocalizedText; +import edu.asu.diging.vspace.core.model.IVSpaceElement; +import edu.asu.diging.vspace.core.model.impl.ExhibitionLanguage; +import edu.asu.diging.vspace.core.model.impl.LocalizedText; +import edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm; + +@Service +@Transactional +public class LocalizedTextFactory implements ILocalizedTextFactory { + + @Autowired + private LocalizedTextRepository localizedTextRepo; + + @Autowired + private ExhibitionLanguageRepository exhibitionLanguageRepository; + + @Override + public LocalizedText createOrUpdateLocalizedText(IVSpaceElement entity, LocalizedTextForm localizedTextFormData, List detailList) { + if (StringUtils.isEmpty(localizedTextFormData.getText())) { + return null; + } + LocalizedText localizedText = localizedTextRepo.findById(localizedTextFormData.getLocalizedTextId()).orElse(null); + if (localizedText != null) { + updateLocalizedText(localizedText, localizedTextFormData); + } else { + createLocalizedText(entity, localizedText, localizedTextFormData, detailList); + } + + return localizedText; + } + + /** + * Adds localized text (names or descriptions) to the specified list. + * + * @param entity The entity (slide or space) to which the details will be added. + * @param localizedTextFormData The localized text form containing the details to be added. + * @param detailList The list in the entity where the details will be added (e.g., slideNames, spaceNames). + */ + @Override + public LocalizedText createLocalizedText(IVSpaceElement vspaceElement,LocalizedText localizedText, LocalizedTextForm localizedTextFormData, List detailList) { + if (StringUtils.isEmpty(localizedTextFormData.getText())) { + return null; + } + ExhibitionLanguage exhibitionLanguage = exhibitionLanguageRepository.findById(localizedTextFormData.getExhibitionLanguageId()).orElse(null); + if (exhibitionLanguage != null) { + localizedText = new LocalizedText(exhibitionLanguage, localizedTextFormData.getText()); + } + detailList.add(localizedText); + + return localizedText; + } + + @Override + public LocalizedText updateLocalizedText(LocalizedText localizedText, LocalizedTextForm localizedTextFormData) { + localizedText.setText(localizedTextFormData.getText()); + return localizedText; + } +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/SlideFactory.java b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/SlideFactory.java index 139e401cf..469281c55 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/SlideFactory.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/SlideFactory.java @@ -1,11 +1,11 @@ package edu.asu.diging.vspace.core.factory.impl; import java.util.ArrayList; + import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; - import edu.asu.diging.vspace.core.factory.IChoiceFactory; import edu.asu.diging.vspace.core.factory.ISlideFactory; import edu.asu.diging.vspace.core.model.IBranchingPoint; @@ -40,11 +40,12 @@ public ISlide createSlide(IModule module, SlideForm form, SlideType type) { slide = new BranchingPoint(); List choices = choiceFactory.createChoices(form.getChoices()); ((IBranchingPoint) slide).setChoices(choices); - } + } slide.setName(form.getName()); slide.setDescription(form.getDescription()); slide.setModule(module); slide.setContents(new ArrayList()); return slide; - } + } + } \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/SpaceFactory.java b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/SpaceFactory.java index 373769f59..2914ebca0 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/SpaceFactory.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/SpaceFactory.java @@ -1,7 +1,6 @@ package edu.asu.diging.vspace.core.factory.impl; import org.springframework.stereotype.Service; - import edu.asu.diging.vspace.core.factory.ISpaceFactory; import edu.asu.diging.vspace.core.model.ISpace; import edu.asu.diging.vspace.core.model.impl.Space; @@ -10,14 +9,16 @@ @Service public class SpaceFactory implements ISpaceFactory { - /* (non-Javadoc) - * @see edu.asu.diging.vspace.core.factory.impl.ISpaceFactory#createSpace(edu.asu.diging.vspace.web.staff.forms.SpaceForm) - */ - @Override - public ISpace createSpace(SpaceForm form) { - ISpace space = new Space(); - space.setName(form.getName()); - space.setDescription(form.getDescription()); - return space; - } -} + /** + * Creates a new space based on the provided form. + * @param form The form containing details for creating the space. + * @return The newly created space and saves it to the repository. + */ + @Override + public ISpace createSpace(SpaceForm form) { + ISpace space = new Space(); + space.setName(form.getName()); + space.setDescription(form.getDescription()); + return space; + } +} \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/TextBlockFactory.java b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/TextBlockFactory.java index c7de3e291..e8fe75a20 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/TextBlockFactory.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/factory/impl/TextBlockFactory.java @@ -1,22 +1,22 @@ package edu.asu.diging.vspace.core.factory.impl; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import edu.asu.diging.vspace.core.data.ExhibitionLanguageRepository; import edu.asu.diging.vspace.core.factory.ITextBlockFactory; import edu.asu.diging.vspace.core.model.ISlide; import edu.asu.diging.vspace.core.model.ITextBlock; +import edu.asu.diging.vspace.core.model.impl.ExhibitionLanguage; +import edu.asu.diging.vspace.core.model.impl.LocalizedText; import edu.asu.diging.vspace.core.model.impl.TextBlock; @Service public class TextBlockFactory implements ITextBlockFactory { - /* - * (non-Javadoc) - * - * @see - * edu.asu.diging.vspace.core.factory.impl.ITextBlockFactory#createTextBlock( - * java.lang.String, java.lang.String) - */ + @Autowired + private ExhibitionLanguageRepository exhibitionLanguageRepository; + @Override public ITextBlock createTextBlock(ISlide slide, String text) { ITextBlock textBlock = new TextBlock(); @@ -25,5 +25,20 @@ public ITextBlock createTextBlock(ISlide slide, String text) { return textBlock; } + + @Override + public ITextBlock createTextBlockWithLanguage(ISlide slide, String text, String languageCode) { + ITextBlock textBlock = new TextBlock(); + textBlock.setText(text); + textBlock.setSlide(slide); + + ExhibitionLanguage exhibitionLanguage = exhibitionLanguageRepository.findByCode(languageCode); + if (exhibitionLanguage != null) { + LocalizedText localizedText = new LocalizedText(exhibitionLanguage, text); + textBlock.getLocalizedTexts().add(localizedText); + } + + return textBlock; + } } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/IExhibitionLanguage.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/IExhibitionLanguage.java index fd868906e..27e6bf0ca 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/model/IExhibitionLanguage.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/IExhibitionLanguage.java @@ -1,13 +1,16 @@ package edu.asu.diging.vspace.core.model; + public interface IExhibitionLanguage extends IVSpaceElement { String getCode(); String getLabel(); + void setLabel(String label); + boolean isDefault(); - void setDefault(boolean isDefault); - + void setDefault(boolean isDefault); + } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/ILocalizedText.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/ILocalizedText.java new file mode 100644 index 000000000..ef24360e7 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/ILocalizedText.java @@ -0,0 +1,16 @@ +package edu.asu.diging.vspace.core.model; + +import edu.asu.diging.vspace.core.model.impl.ExhibitionLanguage; + +public interface ILocalizedText { + String getId(); + + String getText(); + + void setText(String text); + + ExhibitionLanguage getExhibitionLanguage(); + + void setExhibitionLanguage( ExhibitionLanguage exhibitionLanguage); + +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/ISlide.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/ISlide.java index 59985eee6..dfbd25b07 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/model/ISlide.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/ISlide.java @@ -15,4 +15,28 @@ public interface ISlide extends IVSpaceElement { IImageBlock getFirstImageBlock(); ITextBlock getFirstMatchedTextBlock(String searchTerm); + + List getSlideNames(); + + void setSlideNames(List slideNames); + + void setSlideDescriptions(List slideDescriptions); + + List getSlideDescriptions(); + + /** + * Get the localized name for the slide in the specified language + * @param languageCode The language code to get the name in + * @param defaultLanguageCode The fallback language code if the requested language is not available + * @return The localized name or fallback to default name + */ + String getLocalizedName(String languageCode, String defaultLanguageCode); + + /** + * Get the localized description for the slide in the specified language + * @param languageCode The language code to get the description in + * @param defaultLanguageCode The fallback language code if the requested language is not available + * @return The localized description or fallback to default description + */ + String getLocalizedDescription(String languageCode, String defaultLanguageCode); } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/ISpace.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/ISpace.java index 9debb13ad..bd9ed57d8 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/model/ISpace.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/ISpace.java @@ -33,5 +33,13 @@ public interface ISpace extends IVSpaceElement { void setShowUnpublishedLinks(Boolean showUnpublishedLinks); void setHideIncomingLinks(boolean hideIncomingLinks); + + List getSpaceNames(); + + void setSpaceNames(List spaceNames); + + void setSpaceDescriptions(List spaceDescriptions); + + List getSpaceDescriptions() ; } \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/ITextBlock.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/ITextBlock.java index b86e08556..1a7e9f72c 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/model/ITextBlock.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/ITextBlock.java @@ -1,5 +1,7 @@ package edu.asu.diging.vspace.core.model; +import java.util.List; + public interface ITextBlock extends IContentBlock { void setText(String text); @@ -11,5 +13,25 @@ public interface ITextBlock extends IContentBlock { String getId(); String htmlRenderedText(); + + List getLocalizedTexts(); + + void setLocalizedTexts(List localizedTexts); + + /** + * Get localized text for the given language code, with fallback to default language + * @param languageCode The language code to retrieve text for + * @param defaultLanguageCode The default language code to fall back to + * @return The localized text, or original text if no localization exists + */ + String getLocalizedText(String languageCode, String defaultLanguageCode); + + /** + * Get HTML-rendered localized text for the given language code + * @param languageCode The language code to retrieve text for + * @param defaultLanguageCode The default language code to fall back to + * @return The HTML-rendered localized text + */ + String getLocalizedHtmlRenderedText(String languageCode, String defaultLanguageCode); } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/Exhibition.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/Exhibition.java index f7c79dfb9..4b614fa9e 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/Exhibition.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/Exhibition.java @@ -17,7 +17,8 @@ import org.hibernate.annotations.NotFound; import org.hibernate.annotations.NotFoundAction; import org.hibernate.annotations.Parameter; - +import org.springframework.data.jpa.repository.Query; +import com.fasterxml.jackson.annotation.JsonBackReference; import edu.asu.diging.vspace.core.model.ExhibitionModes; import edu.asu.diging.vspace.core.model.IExhibition; import edu.asu.diging.vspace.core.model.IExhibitionLanguage; @@ -37,7 +38,8 @@ public class Exhibition extends VSpaceElement implements IExhibition { @GeneratedValue(generator = "exhibit_id_generator") @GenericGenerator(name = "exhibit_id_generator", parameters = @Parameter(name = "prefix", value = "EXH"), strategy = "edu.asu.diging.vspace.core.data.IdGenerator") private String id; - + + @JsonBackReference() @OneToOne(targetEntity = Space.class) private ISpace startSpace; diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/ExhibitionAboutPage.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/ExhibitionAboutPage.java index 5542a291f..def8a159d 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/ExhibitionAboutPage.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/ExhibitionAboutPage.java @@ -1,16 +1,24 @@ package edu.asu.diging.vspace.core.model.impl; +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; import javax.persistence.Lob; -import javax.persistence.Transient; +import javax.persistence.OneToMany; -import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.Parameter; import org.commonmark.node.Node; import org.commonmark.parser.Parser; import org.commonmark.renderer.html.HtmlRenderer; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Parameter; + +import edu.asu.diging.vspace.core.model.ILocalizedText; /** * Model for Exhibition About Page @@ -19,7 +27,7 @@ * */ @Entity -public class ExhibitionAboutPage { +public class ExhibitionAboutPage extends VSpaceElement { @Id @GeneratedValue(generator = "exh_abtpg_id_generator") @GenericGenerator(name = "exh_abtpg_id_generator", parameters = @Parameter(name = "prefix", value = "EXHABT"), strategy = "edu.asu.diging.vspace.core.data.IdGenerator") @@ -30,6 +38,18 @@ public class ExhibitionAboutPage { @Lob private String aboutPageText; + + @OneToMany(targetEntity = LocalizedText.class, cascade={CascadeType.ALL}) + @JoinTable(name="AboutPage_LocText_titles", + joinColumns = @JoinColumn(name = "ExhibitionAboutPage_Id", referencedColumnName="id") + ) + private List localizedTitles = new ArrayList(); + + @OneToMany(targetEntity = LocalizedText.class, cascade={CascadeType.ALL}) + @JoinTable(name="AboutPage_LocText_descriptions", + joinColumns = @JoinColumn(name = "ExhibitionAboutPage_Id", referencedColumnName="id") + ) + private List localizedDescriptions = new ArrayList(); public String getId() { return id; @@ -42,7 +62,7 @@ public void setId(String id) { public String getTitle() { return title; } - + public void setTitle(String title) { this.title = title; } @@ -50,11 +70,27 @@ public void setTitle(String title) { public String getAboutPageText() { return aboutPageText; } - + public void setAboutPageText(String aboutPageText) { this.aboutPageText = aboutPageText; } - + + public List getExhibitionTitles() { + return localizedTitles; + } + + public void setExhibitionTitles(List exhibitionTitles) { + this.localizedTitles = exhibitionTitles; + } + + public List getExhibitionTextDescriptions() { + return localizedDescriptions; + } + + public void setExhibitionTextDescriptions(List exhibitionTextDescriptions) { + this.localizedDescriptions = exhibitionTextDescriptions; + } + /* * (non-Javadoc) * @@ -67,4 +103,4 @@ public String htmlRenderedText() { HtmlRenderer renderer = HtmlRenderer.builder().build(); return renderer.render(document); } -} +} \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/ExhibitionLanguage.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/ExhibitionLanguage.java index 9ee58d3ed..b901940e6 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/ExhibitionLanguage.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/ExhibitionLanguage.java @@ -3,6 +3,7 @@ import java.util.Objects; import javax.persistence.CascadeType; + import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @@ -10,7 +11,10 @@ import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; +import com.fasterxml.jackson.annotation.JsonBackReference; + import edu.asu.diging.vspace.core.model.IExhibition; + import edu.asu.diging.vspace.core.model.IExhibitionLanguage; @Entity @@ -22,8 +26,9 @@ public class ExhibitionLanguage extends VSpaceElement implements IExhibitionLang private String id; private String label; - + @ManyToOne(targetEntity = Exhibition.class, cascade=CascadeType.ALL) + @JsonBackReference() private IExhibition exhibition; private String code; @@ -84,7 +89,7 @@ public boolean isDefault() { public void setDefault(boolean isDefault) { this.isDefault = isDefault; } - + @Override public int hashCode() { return Objects.hash(code, exhibition, label); @@ -104,4 +109,4 @@ public boolean equals(Object obj) { } -} +} \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/LocalizedText.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/LocalizedText.java new file mode 100644 index 000000000..b3492d04a --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/LocalizedText.java @@ -0,0 +1,61 @@ +package edu.asu.diging.vspace.core.model.impl; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Parameter; +import com.fasterxml.jackson.annotation.JsonManagedReference; + +import edu.asu.diging.vspace.core.model.ILocalizedText; + +@Entity +public class LocalizedText implements ILocalizedText { + + @Id + @GeneratedValue(generator = "localized_text_id_generator") + @GenericGenerator(name = "localized_text_id_generator", parameters = @Parameter(name = "prefix", value = "LOCTEXT"), strategy = "edu.asu.diging.vspace.core.data.IdGenerator") + private String id; + + @ManyToOne + @JoinColumn(name = "LOC_EXH_LANG") + @JsonManagedReference() + private ExhibitionLanguage exhibitionLanguage; + + private String text; + + public LocalizedText() { + super(); + } + + public LocalizedText(ExhibitionLanguage exhibitionLanguage, String text) { + super(); + this.exhibitionLanguage = exhibitionLanguage; + this.text = text; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public ExhibitionLanguage getExhibitionLanguage() { + return exhibitionLanguage; + } + + public void setExhibitionLanguage(ExhibitionLanguage exhibitionLanguage) { + this.exhibitionLanguage = exhibitionLanguage; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } +} \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/Slide.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/Slide.java index 350de758e..33bd775d6 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/Slide.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/Slide.java @@ -1,25 +1,25 @@ package edu.asu.diging.vspace.core.model.impl; +import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Optional; - import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; - +import javax.persistence.JoinColumn; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; - import com.fasterxml.jackson.annotation.JsonIgnore; - import edu.asu.diging.vspace.core.model.IContentBlock; import edu.asu.diging.vspace.core.model.IImageBlock; +import edu.asu.diging.vspace.core.model.ILocalizedText; import edu.asu.diging.vspace.core.model.IModule; import edu.asu.diging.vspace.core.model.ISequence; import edu.asu.diging.vspace.core.model.ISlide; @@ -44,6 +44,34 @@ public class Slide extends VSpaceElement implements ISlide { @JsonIgnore @ManyToMany(mappedBy = "slides", targetEntity = Sequence.class) private List sequence; + + @OneToMany(targetEntity = LocalizedText.class, cascade={CascadeType.ALL}) + @JoinTable(name="Slide_LangObj_names", + joinColumns = @JoinColumn(name = "Slide_Id", referencedColumnName="id"), + inverseJoinColumns = @JoinColumn(name = "LocalizedText_Id", referencedColumnName="id")) + private List slideNames = new ArrayList(); + + @OneToMany(targetEntity = LocalizedText.class, cascade={CascadeType.ALL}) + @JoinTable(name="Slide_LangObj_descriptions", + joinColumns = @JoinColumn(name = "Slide_Id", referencedColumnName="id"), + inverseJoinColumns = @JoinColumn(name = "LocalizedText_Id", referencedColumnName="id")) + private List slideDescriptions = new ArrayList(); + + public List getSlideNames() { + return slideNames; + } + + public void setSlideNames(List slideNames) { + this.slideNames = slideNames; + } + + public List getSlideDescriptions() { + return slideDescriptions; + } + + public void setSlideDescriptions(List slideDescriptions) { + this.slideDescriptions = slideDescriptions; + } /* * (non-Javadoc) @@ -173,4 +201,68 @@ public ITextBlock getFirstMatchedTextBlock(String searchTerm) { } return null; } + + @Override + public String getLocalizedName(String languageCode, String defaultLanguageCode) { + if (slideNames == null || slideNames.isEmpty()) { + return getName() != null ? getName() : ""; + } + vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ModuleOverviewManager.java + if (languageCode != null && !languageCode.trim().isEmpty()) { + for (ILocalizedText localizedText : slideNames) { + if (localizedText.getExhibitionLanguage() != null && + languageCode.equals(localizedText.getExhibitionLanguage().getCode())) { + return localizedText.getText() != null ? localizedText.getText() : ""; + } + } + } + + if (defaultLanguageCode != null && !defaultLanguageCode.trim().isEmpty() && !defaultLanguageCode.equals(languageCode)) { + for (ILocalizedText localizedText : slideNames) { + if (localizedText.getExhibitionLanguage() != null && + defaultLanguageCode.equals(localizedText.getExhibitionLanguage().getCode())) { + return localizedText.getText() != null ? localizedText.getText() : ""; + } + } + } + + + return getName() != null ? getName() : ""; + } + + @Override + public String getLocalizedDescription(String languageCode, String defaultLanguageCode) { + if (slideDescriptions == null || slideDescriptions.isEmpty()) { + return getDescription() != null ? getDescription() : ""; + } + + // First, try to find text in the requested language + if (languageCode != null && !languageCode.trim().isEmpty()) { + for (ILocalizedText localizedText : slideDescriptions) { + if (localizedText.getExhibitionLanguage() != null && + languageCode.equals(localizedText.getExhibitionLanguage().getCode())) { + return localizedText.getText() != null ? localizedText.getText() : ""; + } + } + } + + // If not found, try default language + if (defaultLanguageCode != null && !defaultLanguageCode.trim().isEmpty() && !defaultLanguageCode.equals(languageCode)) { + for (ILocalizedText localizedText : slideDescriptions) { + if (localizedText.getExhibitionLanguage() != null && + defaultLanguageCode.equals(localizedText.getExhibitionLanguage().getCode())) { + return localizedText.getText() != null ? localizedText.getText() : ""; + } + } + } + + // Last resort: return the first available text or the base description + for (ILocalizedText localizedText : slideDescriptions) { + if (localizedText.getText() != null && !localizedText.getText().trim().isEmpty()) { + return localizedText.getText(); + } + } + + return getDescription() != null ? getDescription() : ""; + } } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/Space.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/Space.java index 66018dd30..0cdb03338 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/Space.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/Space.java @@ -1,12 +1,17 @@ package edu.asu.diging.vspace.core.model.impl; +import java.util.ArrayList; + import java.util.List; import javax.persistence.Access; import javax.persistence.AccessType; +import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.JoinTable; +import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Transient; @@ -17,8 +22,10 @@ import org.hibernate.annotations.Parameter; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonManagedReference; import edu.asu.diging.vspace.core.model.IExternalLink; +import edu.asu.diging.vspace.core.model.ILocalizedText; import edu.asu.diging.vspace.core.model.IModuleLink; import edu.asu.diging.vspace.core.model.IPrefix; import edu.asu.diging.vspace.core.model.ISpace; @@ -54,10 +61,25 @@ public class Space extends VSpaceElement implements ISpace { @OneToOne(targetEntity = VSImage.class) @NotFound(action = NotFoundAction.IGNORE) private IVSImage image; - + + @OneToMany(targetEntity = LocalizedText.class, cascade={CascadeType.ALL}) + @JoinTable(name="Space_LangObj_names", + joinColumns = @JoinColumn(name = "Space_Id", referencedColumnName="id"), + inverseJoinColumns = @JoinColumn(name = "LocalizedText_Id", referencedColumnName="id")) + @JsonManagedReference() + private List spaceNames = new ArrayList(); + + @OneToMany(targetEntity = LocalizedText.class, cascade={CascadeType.ALL}) + @JoinTable(name="Space_LangObj_descriptions", + joinColumns = @JoinColumn(name = "Space_Id", referencedColumnName="id"), + inverseJoinColumns = @JoinColumn(name = "LocalizedText_Id", referencedColumnName="id") + ) + @JsonManagedReference() + private List spaceDescriptions = new ArrayList(); + @Transient private Boolean incomingLinks; - + /* * (non-Javadoc) * @@ -200,10 +222,24 @@ public boolean isHideIncomingLinks() { return hideIncomingLinks; } - @Override public void setHideIncomingLinks(boolean hideIncomingLinks) { this.hideIncomingLinks = hideIncomingLinks; } + + public List getSpaceNames() { + return spaceNames; + } + public void setSpaceNames(List spaceNames) { + this.spaceNames = spaceNames; + } + + public List getSpaceDescriptions() { + return spaceDescriptions; + } + + public void setSpaceDescriptions(List spaceDescriptions) { + this.spaceDescriptions = spaceDescriptions; + } } \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/TextBlock.java b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/TextBlock.java index 2ffb5a31b..4e575c62c 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/TextBlock.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/model/impl/TextBlock.java @@ -1,13 +1,21 @@ package edu.asu.diging.vspace.core.model.impl; +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.CascadeType; import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; import javax.persistence.Lob; +import javax.persistence.OneToMany; import javax.persistence.Transient; import org.commonmark.node.Node; import org.commonmark.parser.Parser; import org.commonmark.renderer.html.HtmlRenderer; +import edu.asu.diging.vspace.core.model.ILocalizedText; import edu.asu.diging.vspace.core.model.ITextBlock; @Entity @@ -15,40 +23,87 @@ public class TextBlock extends ContentBlock implements ITextBlock { @Lob private String text; + + @OneToMany(targetEntity = LocalizedText.class, cascade={CascadeType.ALL}) + @JoinTable(name="TextBlock_LangObj_texts", + joinColumns = @JoinColumn(name = "TextBlock_Id", referencedColumnName="id"), + inverseJoinColumns = @JoinColumn(name = "LocalizedText_Id", referencedColumnName="id")) + private List localizedTexts = new ArrayList(); - /* - * (non-Javadoc) - * - * @see edu.asu.diging.vspace.core.model.impl.ITextBlock#getText() - */ @Override public String getText() { return text; } - /* - * (non-Javadoc) - * - * @see - * edu.asu.diging.vspace.core.model.impl.ITextBlock#setText(java.lang.String) - */ @Override public void setText(String text) { this.text = text; } - /* - * (non-Javadoc) - * - * @see - * edu.asu.diging.vspace.core.model.impl.ITextBlock#htmlRenderedText() - */ @Override @Transient public String htmlRenderedText() { Parser parser = Parser.builder().build(); - Node document = parser.parse(text); + Node document = parser.parse(text != null ? text : ""); HtmlRenderer renderer = HtmlRenderer.builder().build(); return renderer.render(document); } + + @Override + public List getLocalizedTexts() { + return localizedTexts; + } + + @Override + public void setLocalizedTexts(List localizedTexts) { + this.localizedTexts = localizedTexts; + } + + @Override + public String getLocalizedText(String languageCode, String defaultLanguageCode) { + if (localizedTexts == null || localizedTexts.isEmpty()) { + return text != null ? text : ""; + } + + // First, try to find text in the requested language + if (languageCode != null && !languageCode.isEmpty()) { + for (ILocalizedText localizedText : localizedTexts) { + if (localizedText.getExhibitionLanguage() != null && + languageCode.equals(localizedText.getExhibitionLanguage().getCode())) { + return localizedText.getText() != null ? localizedText.getText() : ""; + } + } + } + + // If not found, try default language + if (defaultLanguageCode != null && !defaultLanguageCode.isEmpty() && !defaultLanguageCode.equals(languageCode)) { + for (ILocalizedText localizedText : localizedTexts) { + if (localizedText.getExhibitionLanguage() != null && + defaultLanguageCode.equals(localizedText.getExhibitionLanguage().getCode())) { + return localizedText.getText() != null ? localizedText.getText() : ""; + } + } + } + + // Last resort: return the first available localized text or original text + for (ILocalizedText localizedText : localizedTexts) { + if (localizedText.getText() != null && !localizedText.getText().trim().isEmpty()) { + return localizedText.getText(); + } + } + + return text != null ? text : ""; + } + + @Override + public String getLocalizedHtmlRenderedText(String languageCode, String defaultLanguageCode) { + String localizedText = getLocalizedText(languageCode, defaultLanguageCode); + if (localizedText != null && !localizedText.isEmpty()) { + Parser parser = Parser.builder().build(); + Node document = parser.parse(localizedText); + HtmlRenderer renderer = HtmlRenderer.builder().build(); + return renderer.render(document); + } + return ""; + } } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/IContentBlockManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IContentBlockManager.java index 743148ce3..98e9c1147 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/IContentBlockManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IContentBlockManager.java @@ -28,6 +28,8 @@ public interface IContentBlockManager { List getAllContentBlocks(String slideId); ITextBlock createTextBlock(String slideId, String content, Integer contentOrder); + + ITextBlock createTextBlockWithLanguage(String slideId, String content, Integer contentOrder, String languageCode); CreationReturnValue createImageBlock(String slideId, byte[] image, String filename, Integer contentOrder) throws ImageCouldNotBeStoredException; diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExhibitionAboutPageManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExhibitionAboutPageManager.java index 55f404e85..94fd96120 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExhibitionAboutPageManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExhibitionAboutPageManager.java @@ -3,6 +3,7 @@ import java.util.List; import edu.asu.diging.vspace.core.model.impl.ExhibitionAboutPage; +import edu.asu.diging.vspace.web.staff.forms.AboutPageForm; /** * IExhibitionAboutPageManager allows to store and manage {@link ExhibitionAboutPage}. * @author Avirup Biswas @@ -17,10 +18,11 @@ public interface IExhibitionAboutPageManager { /** * This method stores Exhibition About page information and returns the {@link ExhibitionAboutPage} which is being stored - * @param {@link ExhibitionAboutPage} This object contains Exhibition about page values to be stored. + * @param {@link AboutPageForm} This object contains Exhibition about page values to be stored. * @return {@link ExhibitionAboutPage} Returns the object after being stored. Object will now have an ID. */ - ExhibitionAboutPage store(ExhibitionAboutPage exhibitionAboutPage); + ExhibitionAboutPage store(AboutPageForm aboutPageForm); ExhibitionAboutPage getExhibitionAboutPage(); } + diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExhibitionManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExhibitionManager.java index e7ac5a475..959f9b08f 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExhibitionManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IExhibitionManager.java @@ -2,9 +2,12 @@ import java.util.List; +import edu.asu.diging.vspace.core.exception.ExhibitionLanguageDeletionException; import edu.asu.diging.vspace.core.model.IExhibition; +import edu.asu.diging.vspace.core.model.IExhibitionLanguage; +import edu.asu.diging.vspace.core.model.ILocalizedText; import edu.asu.diging.vspace.core.model.impl.Exhibition; - +import edu.asu.diging.vspace.core.model.impl.LocalizedText; /* * (non-Javadoc) * @@ -34,6 +37,12 @@ public interface IExhibitionManager { IExhibition getStartExhibition(); - void updateExhibitionLanguages(IExhibition exhibition, List languages, String defaultLanguage); + void updateExhibitionLanguages(Exhibition exhibition, List languages, String defaultLanguage) throws ExhibitionLanguageDeletionException; + + void deleteLocalizedTexts(List emptyLocalizedTexts); + + IExhibitionLanguage getDefaultLanguage(IExhibition exhibition); + List getLocalizedTexts(IExhibitionLanguage language); + } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/ILanguageService.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/ILanguageService.java new file mode 100644 index 000000000..f423cd57d --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/ILanguageService.java @@ -0,0 +1,33 @@ +package edu.asu.diging.vspace.core.services; + +import java.util.List; + +import edu.asu.diging.vspace.core.model.IExhibitionLanguage; +import edu.asu.diging.vspace.core.model.ILocalizedText; + +/** + * Service to handle language selection and localized text retrieval + */ +public interface ILanguageService { + + /** + * Gets localized text for the specified language from a list of localized texts + * @param localizedTexts List of localized texts + * @param languageCode Language code to find (e.g., "en", "es") + * @param defaultLanguageCode Fallback language code if primary not found + * @return The text in the requested language, or default language, or first available + */ + String getLocalizedText(List localizedTexts, String languageCode, String defaultLanguageCode); + + /** + * Gets the default exhibition language code + * @return Default language code + */ + String getDefaultLanguageCode(); + + /** + * Gets all available exhibition languages + * @return List of exhibition languages + */ + List getAvailableLanguages(); +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/IModuleOverviewManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IModuleOverviewManager.java index 4b9c13b77..0f9f9abd0 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/IModuleOverviewManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/IModuleOverviewManager.java @@ -15,5 +15,17 @@ public interface IModuleOverviewManager { * @throws ModuleNotFoundException */ public ModuleOverview getModuleOverview(String moduleId) throws ModuleNotFoundException; + + /** + * This method returns a ModuleOverview based on a module Id with localized slide names. It fetches all Sequences which belong to the module and + * convert this into a SequenceOverview node with localized slide names. This SequenceOverviewNode is added to + * ModuleOverview + * @param moduleId The ID of the module + * @param selectedLanguage The language code for the selected language + * @param defaultLanguageCode The default language code to fall back to + * @return ModuleOverview which contains the module and the list of sequences and its slides with localized names + * @throws ModuleNotFoundException + */ + public ModuleOverview getModuleOverview(String moduleId, String selectedLanguage, String defaultLanguageCode) throws ModuleNotFoundException; } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/ISlideManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/ISlideManager.java index 4982390b3..93a69f683 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/ISlideManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/ISlideManager.java @@ -5,11 +5,14 @@ import org.springframework.data.domain.Pageable; import edu.asu.diging.vspace.core.model.IBranchingPoint; import edu.asu.diging.vspace.core.model.IChoice; +import edu.asu.diging.vspace.core.model.ILocalizedText; import edu.asu.diging.vspace.core.model.IModule; import edu.asu.diging.vspace.core.model.ISlide; import edu.asu.diging.vspace.core.model.display.SlideType; +import edu.asu.diging.vspace.core.model.impl.LocalizedText; import edu.asu.diging.vspace.core.model.impl.Sequence; import edu.asu.diging.vspace.core.model.impl.Slide; +import edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm; import edu.asu.diging.vspace.web.staff.forms.SlideForm; public interface ISlideManager { @@ -31,4 +34,9 @@ public interface ISlideManager { List getSlideSequences(String slideId, String moduleId); Page findByNameOrDescription(Pageable requestedPage,String searchText); + + void updateNameAndDescription(ISlide slide, SlideForm slideForm); + + void addSlideLocalizedText(ISlide slide, LocalizedTextForm localizedTextFormData, List localizedTextList); + } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/ISpaceManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/ISpaceManager.java index b8be74816..75e0beb82 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/ISpaceManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/ISpaceManager.java @@ -6,12 +6,15 @@ import org.springframework.data.domain.Pageable; import edu.asu.diging.vspace.core.exception.SpaceDoesNotExistException; +import edu.asu.diging.vspace.core.model.ILocalizedText; import edu.asu.diging.vspace.core.model.ISpace; import edu.asu.diging.vspace.core.model.IVSImage; import edu.asu.diging.vspace.core.model.impl.Space; import edu.asu.diging.vspace.core.model.impl.SpaceLink; import edu.asu.diging.vspace.core.model.impl.SpaceStatus; import edu.asu.diging.vspace.core.services.impl.CreationReturnValue; +import edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm; +import edu.asu.diging.vspace.web.staff.forms.SpaceForm; public interface ISpaceManager { @@ -38,6 +41,10 @@ public interface ISpaceManager { Iterable addIncomingLinkInfoToSpaces(Iterable spaces); Page findByNameOrDescription(Pageable requestedPage,String searchText); + + void updateNameAndDescription(ISpace space, SpaceForm spaceForm); + + void addSpaceDetails(ISpace space, LocalizedTextForm names, List localizedTextList); List findByName(String name); diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ContentBlockManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ContentBlockManager.java index 872e12ddf..9e414e664 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ContentBlockManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ContentBlockManager.java @@ -130,13 +130,6 @@ public List getAllContentBlocks(String slideId) { return slide.getContents(); } - /* - * (non-Javadoc) - * - * @see - * edu.asu.diging.vspace.core.services.impl.ITextBlock#createTextBlock(java. - * lang.String, java.lang.String) - */ @Override public ITextBlock createTextBlock(String slideId, String text, Integer contentOrder) { ISlide slide = slideManager.getSlide(slideId); @@ -145,6 +138,15 @@ public ITextBlock createTextBlock(String slideId, String text, Integer contentOr textBlock = textBlockRepo.save((TextBlock) textBlock); return textBlock; } + + @Override + public ITextBlock createTextBlockWithLanguage(String slideId, String text, Integer contentOrder, String languageCode) { + ISlide slide = slideManager.getSlide(slideId); + ITextBlock textBlock = textBlockFactory.createTextBlockWithLanguage(slide, text, languageCode); + textBlock.setContentOrder(contentOrder); + textBlock = textBlockRepo.save((TextBlock) textBlock); + return textBlock; + } @Override public ISpaceBlock createSpaceBlock(String slideId, String title, Integer contentOrder, ISpace space) { diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExhibitionAboutPageManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExhibitionAboutPageManager.java index c53c841ea..8d2db7e8f 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExhibitionAboutPageManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExhibitionAboutPageManager.java @@ -1,19 +1,29 @@ package edu.asu.diging.vspace.core.services.impl; import java.util.ArrayList; + import java.util.List; import javax.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.thymeleaf.util.StringUtils; +import edu.asu.diging.vspace.core.data.ExhibitionAboutPageRepository; +import edu.asu.diging.vspace.core.data.ExhibitionLanguageRepository; +import edu.asu.diging.vspace.core.data.LocalizedTextRepository; import edu.asu.diging.vspace.core.data.ExhibitionAboutPageRepository; import edu.asu.diging.vspace.core.model.IExhibition; +import edu.asu.diging.vspace.core.model.ILocalizedText; import edu.asu.diging.vspace.core.model.impl.Exhibition; import edu.asu.diging.vspace.core.model.impl.ExhibitionAboutPage; +import edu.asu.diging.vspace.core.model.impl.ExhibitionLanguage; +import edu.asu.diging.vspace.core.model.impl.LocalizedText; import edu.asu.diging.vspace.core.services.IExhibitionAboutPageManager; import edu.asu.diging.vspace.core.services.IExhibitionManager; +import edu.asu.diging.vspace.web.staff.forms.AboutPageForm; +import edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm; /** * * @author Avirup Biswas @@ -29,6 +39,12 @@ public class ExhibitionAboutPageManager implements IExhibitionAboutPageManager{ @Autowired private IExhibitionManager exhibitionManager; + @Autowired + private ExhibitionLanguageRepository exhibitionLanguageRepository; + + @Autowired + private LocalizedTextRepository localizedTextRepo; + /* (non-Javadoc) * @see edu.asu.diging.vspace.core.services.IExhibitionAboutPageManager#findAll() */ @@ -44,12 +60,27 @@ public List findAll() { * @see edu.asu.diging.vspace.core.services.IExhibitionAboutPageManager#store() */ @Override - public ExhibitionAboutPage store(ExhibitionAboutPage exhibitionAboutPage) { + public ExhibitionAboutPage store(AboutPageForm aboutPageForm) { IExhibition exhibition = exhibitionManager.getStartExhibition(); if(!exhibition.isAboutPageConfigured()) { exhibition.setAboutPageConfigured(true); exhibitionManager.storeExhibition((Exhibition)exhibition); } + + ExhibitionAboutPage exhibitionAboutPage = getExhibitionAboutPage(); + exhibitionAboutPage.setTitle(aboutPageForm.getDefaultTitle().getText()); + exhibitionAboutPage.setAboutPageText(aboutPageForm.getDefaultAboutPageText().getText()); + + setLocalizedText(aboutPageForm.getDefaultTitle(), exhibitionAboutPage.getExhibitionTitles()); + setLocalizedText(aboutPageForm.getDefaultAboutPageText(), exhibitionAboutPage.getExhibitionTextDescriptions()); + + for(LocalizedTextForm title:aboutPageForm.getTitles()) { + setLocalizedText(title, exhibitionAboutPage.getExhibitionTitles()); + } + for(LocalizedTextForm aboutPageText:aboutPageForm.getAboutPageTexts()) { + setLocalizedText(aboutPageText, exhibitionAboutPage.getExhibitionTextDescriptions()); + } + return repo.save(exhibitionAboutPage); } @@ -64,5 +95,26 @@ public ExhibitionAboutPage getExhibitionAboutPage() { List aboutPageList = findAll(); return aboutPageList != null && !aboutPageList.isEmpty() ? aboutPageList.get(0):new ExhibitionAboutPage(); } - -} + + private void setLocalizedText(LocalizedTextForm textForm, List localizedTextList) { + if (textForm!=null) { + LocalizedText localizedText = localizedTextRepo.findById(textForm.getLocalizedTextId()).orElse(null); + + if(StringUtils.isEmpty(textForm.getText())){ + //then delete the localized text if it has no text + if(localizedText!=null) { + localizedTextRepo.delete(localizedText); + localizedTextList.remove(localizedText); + } + return; + } + if (localizedText != null) { + localizedText.setText(textForm.getText()); + } else { + ExhibitionLanguage exhibitionLanguage = exhibitionLanguageRepository.findById(textForm.getExhibitionLanguageId()).orElse(null); + localizedText = new LocalizedText(exhibitionLanguage, textForm.getText()); + localizedTextList.add(localizedText); + } + } + } +} \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExhibitionManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExhibitionManager.java index 516cd81c1..243675edc 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExhibitionManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ExhibitionManager.java @@ -15,13 +15,18 @@ import edu.asu.diging.vspace.config.ConfigConstants; import edu.asu.diging.vspace.config.ExhibitionLanguageConfig; +import edu.asu.diging.vspace.core.data.ExhibitionLanguageRepository; import edu.asu.diging.vspace.core.data.ExhibitionRepository; +import edu.asu.diging.vspace.core.data.LocalizedTextRepository; +import edu.asu.diging.vspace.core.exception.ExhibitionLanguageDeletionException; import edu.asu.diging.vspace.core.exception.LanguageListConfigurationNotFoundException; import edu.asu.diging.vspace.core.factory.impl.ExhibitionFactory; import edu.asu.diging.vspace.core.model.IExhibition; import edu.asu.diging.vspace.core.model.IExhibitionLanguage; +import edu.asu.diging.vspace.core.model.ILocalizedText; import edu.asu.diging.vspace.core.model.impl.Exhibition; import edu.asu.diging.vspace.core.model.impl.ExhibitionLanguage; +import edu.asu.diging.vspace.core.model.impl.LocalizedText; import edu.asu.diging.vspace.core.services.IExhibitionManager; @Transactional @@ -36,6 +41,12 @@ public class ExhibitionManager implements IExhibitionManager { @Autowired private ExhibitionFactory exhibitFactory; + + @Autowired + private LocalizedTextRepository localizedTextRepo; + + @Autowired + private ExhibitionLanguageRepository exhibitionLanguageRepository; /* * (non-Javadoc) @@ -101,10 +112,10 @@ public IExhibition getStartExhibition() { * @param exhibition * @param defaultLanguage * @param languages - * @throws LanguageListConfigurationNotFoundException + * @throws ExhibitionLanguageDeletionException */ @Override - public void updateExhibitionLanguages(IExhibition exhibition, List codes, String defaultLanguage) { + public void updateExhibitionLanguages(Exhibition exhibition, List codes, String defaultLanguage) throws ExhibitionLanguageDeletionException{ if(CollectionUtils.isEmpty(exhibitionLanguageConfig.getExhibitionLanguageList())) { throw new LanguageListConfigurationNotFoundException("Exhibition Language Configuration not found"); } @@ -112,9 +123,9 @@ public void updateExhibitionLanguages(IExhibition exhibition, List codes if(CollectionUtils.isEmpty(codes) ) { return; } - + // Adds defaultLanguage to codes list if not already exists. - if(!StringUtils.isEmpty(defaultLanguage) && !codes.contains(defaultLanguage)) { + if(StringUtils.hasText(defaultLanguage) && !codes.contains(defaultLanguage)) { codes.add(defaultLanguage); } @@ -126,11 +137,37 @@ public void updateExhibitionLanguages(IExhibition exhibition, List codes }); // Removes exhibition language if unselected. - List languagesToBeRemoved = exhibition.getLanguages().stream() + List exhibitionLanguageToBeRemoved = exhibition.getLanguages().stream() .filter(language -> !codes.contains(language.getCode())).collect(Collectors.toList()); - - exhibition.getLanguages().removeAll(languagesToBeRemoved); + for (IExhibitionLanguage language : exhibitionLanguageToBeRemoved ) { + if(!getLocalizedTexts(language).isEmpty()) { + throw new ExhibitionLanguageDeletionException("Exhibition cannot be deleted as it is not empty") ; + } + } + exhibition.getLanguages().removeAll(exhibitionLanguageToBeRemoved); + } + + /** + * Return list localized texts linked to the given exhibition language + * @param exhibitionLanguage + */ + @Override + public List getLocalizedTexts(IExhibitionLanguage language) { + return localizedTextRepo.findByExhibitionLanguage(language); + } + + /** + * Removes localized texts from parent entities and delete them. + * + */ + @Override + public void deleteLocalizedTexts(List emptyLocalizedTexts) { + + List convertedLocalizedTextsList = emptyLocalizedTexts.stream() + .map(localizedText -> (LocalizedText) localizedText) + .collect(Collectors.toList()); + localizedTextRepo.deleteAll(convertedLocalizedTextsList); } /** @@ -153,4 +190,9 @@ private IExhibitionLanguage addExhibitionLanguage(IExhibition exhibition, Map la return exhibitionLanguage; } -} + + public IExhibitionLanguage getDefaultLanguage(IExhibition exhibition){ + return exhibitionLanguageRepository.findByExhibitionAndIsDefault(exhibition); + } + +} \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/LanguageService.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/LanguageService.java new file mode 100644 index 000000000..495430ff3 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/LanguageService.java @@ -0,0 +1,79 @@ +package edu.asu.diging.vspace.core.services.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import edu.asu.diging.vspace.core.model.IExhibition; +import edu.asu.diging.vspace.core.model.IExhibitionLanguage; +import edu.asu.diging.vspace.core.model.ILocalizedText; +import edu.asu.diging.vspace.core.services.IExhibitionManager; +import edu.asu.diging.vspace.core.services.ILanguageService; + +@Service +public class LanguageService implements ILanguageService { + + @Autowired + private IExhibitionManager exhibitionManager; + + @Override + public String getLocalizedText(List localizedTexts, String languageCode, String defaultLanguageCode) { + if (localizedTexts == null || localizedTexts.isEmpty()) { + return ""; + } + + if (StringUtils.hasText(languageCode)) { + for (ILocalizedText localizedText : localizedTexts) { + if (localizedText.getExhibitionLanguage() != null && + languageCode.equals(localizedText.getExhibitionLanguage().getCode())) { + return localizedText.getText() != null ? localizedText.getText() : ""; + } + } + } + + if (StringUtils.hasText(defaultLanguageCode) && !defaultLanguageCode.equals(languageCode)) { + for (ILocalizedText localizedText : localizedTexts) { + if (localizedText.getExhibitionLanguage() != null && + defaultLanguageCode.equals(localizedText.getExhibitionLanguage().getCode())) { + return localizedText.getText() != null ? localizedText.getText() : ""; + } + } + } + + IExhibition exhibition = exhibitionManager.getStartExhibition(); + if (exhibition != null) { + IExhibitionLanguage defaultLang = exhibitionManager.getDefaultLanguage(exhibition); + if (defaultLang != null) { + for (ILocalizedText localizedText : localizedTexts) { + if (localizedText.getExhibitionLanguage() != null && + defaultLang.getCode().equals(localizedText.getExhibitionLanguage().getCode())) { + return localizedText.getText() != null ? localizedText.getText() : ""; + } + } + } + } + } + + @Override + public String getDefaultLanguageCode() { + IExhibition exhibition = exhibitionManager.getStartExhibition(); + if (exhibition != null) { + IExhibitionLanguage defaultLang = exhibitionManager.getDefaultLanguage(exhibition); + if (defaultLang != null) { + return defaultLang.getCode(); + } + } + return "en"; // fallback to English + } + + @Override + public List getAvailableLanguages() { + IExhibition exhibition = exhibitionManager.getStartExhibition(); + if (exhibition != null && exhibition.getLanguages() != null) { + return exhibition.getLanguages(); + } + return List.of(); // return empty list if no languages available + } +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ModuleOverviewManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ModuleOverviewManager.java index 67f65144f..9ea2333f0 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ModuleOverviewManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/ModuleOverviewManager.java @@ -12,6 +12,7 @@ import edu.asu.diging.vspace.core.model.ISequence; import edu.asu.diging.vspace.core.model.ISlide; import edu.asu.diging.vspace.core.model.impl.BranchingPoint; +import edu.asu.diging.vspace.core.services.ILanguageService; import edu.asu.diging.vspace.core.services.IModuleManager; import edu.asu.diging.vspace.core.services.IModuleOverviewManager; import edu.asu.diging.vspace.core.services.impl.model.ModuleOverview; @@ -24,7 +25,14 @@ public class ModuleOverviewManager implements IModuleOverviewManager { @Autowired private IModuleManager moduleManager; + @Autowired + private ILanguageService languageService; + public ModuleOverview getModuleOverview(String moduleId) throws ModuleNotFoundException{ + return getModuleOverview(moduleId, languageService.getDefaultLanguageCode(), languageService.getDefaultLanguageCode()); + } + + public ModuleOverview getModuleOverview(String moduleId, String selectedLanguage, String defaultLanguageCode) throws ModuleNotFoundException{ IModule module = moduleManager.getModule(moduleId); if(module==null) { throw new ModuleNotFoundException("Module not found"); @@ -33,12 +41,12 @@ public ModuleOverview getModuleOverview(String moduleId) throws ModuleNotFoundEx List sequences = moduleManager.getModuleSequences(moduleId); - SequenceOverview sequenceOverviewNode = createSequenceOverviewNode(startSequence); + SequenceOverview sequenceOverviewNode = createSequenceOverviewNode(startSequence, selectedLanguage, defaultLanguageCode); List otherSequences = new ArrayList(); for(ISequence sequence : sequences) { if(sequence != startSequence) { - otherSequences.add(createSequenceOverviewNode(sequence)); + otherSequences.add(createSequenceOverviewNode(sequence, selectedLanguage, defaultLanguageCode)); } } @@ -55,6 +63,10 @@ public ModuleOverview getModuleOverview(String moduleId) throws ModuleNotFoundEx * @return ModuleOverview which contains the module and the list of sequences and its slides */ private SequenceOverview createSequenceOverviewNode(ISequence sequence) { + return createSequenceOverviewNode(sequence, languageService.getDefaultLanguageCode(), languageService.getDefaultLanguageCode()); + } + + private SequenceOverview createSequenceOverviewNode(ISequence sequence, String selectedLanguage, String defaultLanguageCode) { if(sequence==null) { return null; } @@ -62,17 +74,22 @@ private SequenceOverview createSequenceOverviewNode(ISequence sequence) { SequenceOverview sequenceOverview = new SequenceOverview(); sequenceOverview.setName(sequence.getName()); sequenceOverview.setId(sequence.getId()); - List slideOverviews = createSlideOverviewNode(sequence.getSlides()); + List slideOverviews = createSlideOverviewNode(sequence.getSlides(), selectedLanguage, defaultLanguageCode); sequenceOverview.setSlideOverviews(slideOverviews); return sequenceOverview; } private List createSlideOverviewNode(List slides){ + return createSlideOverviewNode(slides, languageService.getDefaultLanguageCode(), languageService.getDefaultLanguageCode()); + } + + private List createSlideOverviewNode(List slides, String selectedLanguage, String defaultLanguageCode){ List slideOverviews = new ArrayList(); for(ISlide slide : slides) { SlideOverview slideOverview = new SlideOverview(); slideOverview.setId(slide.getId()); - slideOverview.setName(slide.getName()); + String localizedName = slide.getLocalizedName(selectedLanguage, defaultLanguageCode); + slideOverview.setName(localizedName != null && !localizedName.isEmpty() ? localizedName : slide.getName()); if(slide instanceof BranchingPoint) { slideOverview.setBranchingPoint(true); List sequenceChoices = ((BranchingPoint)slide).getChoices(); diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/SlideManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/SlideManager.java index fefd99c1e..298610136 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/SlideManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/SlideManager.java @@ -18,10 +18,12 @@ import edu.asu.diging.vspace.core.data.ChoiceRepository; import edu.asu.diging.vspace.core.data.SequenceRepository; import edu.asu.diging.vspace.core.data.SlideRepository; +import edu.asu.diging.vspace.core.factory.ILocalizedTextFactory; import edu.asu.diging.vspace.core.factory.impl.ChoiceFactory; import edu.asu.diging.vspace.core.factory.impl.SlideFactory; import edu.asu.diging.vspace.core.model.IBranchingPoint; import edu.asu.diging.vspace.core.model.IChoice; +import edu.asu.diging.vspace.core.model.ILocalizedText; import edu.asu.diging.vspace.core.model.IModule; import edu.asu.diging.vspace.core.model.ISlide; import edu.asu.diging.vspace.core.model.display.SlideType; @@ -29,8 +31,11 @@ import edu.asu.diging.vspace.core.model.impl.Choice; import edu.asu.diging.vspace.core.model.impl.Sequence; import edu.asu.diging.vspace.core.model.impl.Slide; +import edu.asu.diging.vspace.core.services.IExhibitionManager; import edu.asu.diging.vspace.core.services.ISlideManager; +import edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm; import edu.asu.diging.vspace.web.staff.forms.SlideForm; +import edu.asu.diging.vspace.web.staff.forms.factory.SlideFormFactory; @Service public class SlideManager implements ISlideManager { @@ -52,6 +57,9 @@ public class SlideManager implements ISlideManager { @Autowired private ChoiceFactory choiceFactory; + + @Autowired + private ILocalizedTextFactory localizedTextFactory; private final Logger logger = LoggerFactory.getLogger(getClass()); @@ -167,4 +175,27 @@ public Page findByNameOrDescription(Pageable requestedPage, String searc return slideRepo.findDistinctByNameContainingOrDescriptionContaining(requestedPage, searchText,searchText); } + + @Override + public void updateNameAndDescription(ISlide slide, SlideForm slideForm) { + slide.setName(slideForm.getDefaultName().getText()); + slide.setDescription(slideForm.getDefaultDescription().getText()); + + List localizedTextNames = slide.getSlideNames(); + List localizedTextDescriptions = slide.getSlideDescriptions(); + addSlideLocalizedText(slide,slideForm.getDefaultName(), localizedTextNames); + addSlideLocalizedText(slide,slideForm.getDefaultDescription(), localizedTextDescriptions); + + for(LocalizedTextForm title:slideForm.getNames()) { + addSlideLocalizedText(slide, title, localizedTextNames); + } + for(LocalizedTextForm text: slideForm.getDescriptions()) { + addSlideLocalizedText(slide, text, localizedTextDescriptions); + } + } + + @Override + public void addSlideLocalizedText(ISlide slide, LocalizedTextForm localizedTextFormData, List localizedTextList) { + localizedTextFactory.createOrUpdateLocalizedText(slide, localizedTextFormData, localizedTextList); + } } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/SpaceManager.java b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/SpaceManager.java index 297143ead..ed75a2299 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/SpaceManager.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/core/services/impl/SpaceManager.java @@ -28,8 +28,10 @@ import edu.asu.diging.vspace.core.exception.FileStorageException; import edu.asu.diging.vspace.core.exception.SpaceDoesNotExistException; import edu.asu.diging.vspace.core.factory.IImageFactory; +import edu.asu.diging.vspace.core.factory.ILocalizedTextFactory; import edu.asu.diging.vspace.core.factory.ISpaceDisplayFactory; import edu.asu.diging.vspace.core.file.IStorageEngine; +import edu.asu.diging.vspace.core.model.ILocalizedText; import edu.asu.diging.vspace.core.model.ISpace; import edu.asu.diging.vspace.core.model.IVSImage; import edu.asu.diging.vspace.core.model.SortByField; @@ -44,6 +46,8 @@ import edu.asu.diging.vspace.core.services.IImageService; import edu.asu.diging.vspace.core.services.ISpaceManager; import edu.asu.diging.vspace.core.services.impl.model.ImageData; +import edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm; +import edu.asu.diging.vspace.web.staff.forms.SpaceForm; @Transactional @Service @@ -83,6 +87,9 @@ public class SpaceManager implements ISpaceManager { @Autowired private SpaceLinkDisplayRepository spaceLinkDisplayRepo; + @Autowired + private ILocalizedTextFactory localizedTextFactory; + @Value("${page_size}") private int pageSize; @@ -375,6 +382,33 @@ private Sort getSortingParameters(String sortedBy, String order) { } return sortingParameters; } + + @Override + public void updateNameAndDescription(ISpace space, SpaceForm spaceForm) { + space.setName(spaceForm.getDefaultName().getText()); + space.setDescription(spaceForm.getDefaultDescription().getText()); + List names = space.getSpaceNames(); + List descriptions = space.getSpaceDescriptions(); + + addSpaceDetails(space,spaceForm.getDefaultName(), names); + addSpaceDetails(space,spaceForm.getDefaultDescription(), descriptions); + for(LocalizedTextForm title:spaceForm.getNames()) { + addSpaceDetails(space,title, names); + } + for(LocalizedTextForm text:spaceForm.getDescriptions()) { + addSpaceDetails(space,text, descriptions); + } + } + + /** + * Adds name to spaceNames List of the given space object. + * @param space The space to which the name will be added. + * @param name The localized text form containing the name to be added. + */ + @Override + public void addSpaceDetails(ISpace space, LocalizedTextForm name, List localizedTextList) { + localizedTextFactory.createOrUpdateLocalizedText(space, name, localizedTextList); + } @Override public int getTotalSpaceCount(String searchTerm) { diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/exhibit/view/ExhibitionSlideController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/exhibit/view/ExhibitionSlideController.java index 8965c7539..b13f8ac4a 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/exhibit/view/ExhibitionSlideController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/exhibit/view/ExhibitionSlideController.java @@ -2,6 +2,9 @@ import java.util.List; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -26,6 +29,7 @@ import edu.asu.diging.vspace.core.services.IExhibitionAboutPageManager; import edu.asu.diging.vspace.core.services.IExhibitionManager; +import edu.asu.diging.vspace.core.services.ILanguageService; import edu.asu.diging.vspace.core.services.IModuleManager; import edu.asu.diging.vspace.core.services.ISequenceManager; import edu.asu.diging.vspace.core.services.ISpaceManager; @@ -56,6 +60,9 @@ public class ExhibitionSlideController { @Autowired private IExhibitionManager exhibitManager; + + @Autowired + private ILanguageService languageService; @RequestMapping(value = { "/exhibit/{spaceId}/module/{moduleId}/sequence/{sequenceId}/slide/{slideId}", @@ -67,7 +74,9 @@ public String slide(Model model, @PathVariable("slideId") String slideId, @RequestParam(required = false, name = "back") boolean back, @RequestParam(required = false, name = "branchingPoint") String branchingPointId, @RequestParam(required = false, name = "previousSequenceId") String previousSequenceId, - @PathVariable("moduleId") String moduleId) + @RequestParam(required = false, name = "languageCode") String languageCode, + @PathVariable("moduleId") String moduleId, + HttpServletRequest request) throws ModuleNotFoundException, SequenceNotFoundException, SlidesInSequenceNotFoundException, SlideNotFoundException, SpaceDoesNotExistException, SpaceNotFoundException { @@ -87,6 +96,18 @@ public String slide(Model model, @PathVariable("slideId") String slideId, model.addAttribute("startSequenceId", startSequenceId); IExhibition exhibition = exhibitManager.getStartExhibition(); model.addAttribute("exhibitionConfig", exhibition); + + HttpSession session = request.getSession(); + if (languageCode != null) { + session.setAttribute("selectedLanguage", languageCode); + } else { + languageCode = (String) session.getAttribute("selectedLanguage"); + if (languageCode == null) { + languageCode = languageService.getDefaultLanguageCode(); + } + } + model.addAttribute("selectedLanguage", languageCode); + model.addAttribute("defaultLanguageCode", languageService.getDefaultLanguageCode()); ISequence sequenceExist = moduleManager.checkIfSequenceExists(moduleId, sequenceId); if (sequenceExist == null) { throw new SequenceNotFoundException(sequenceId); @@ -136,7 +157,7 @@ public String slide(Model model, @PathVariable("slideId") String slideId, ( slideManager.getSlide(sequenceHistory.peekBranchingPointId()))); } - ModuleOverview moduleOverview = moduleOverviewManager.getModuleOverview(moduleId); + ModuleOverview moduleOverview = moduleOverviewManager.getModuleOverview(moduleId, languageCode, languageService.getDefaultLanguageCode()); moduleOverview.setName(module.getName()); moduleOverview.setId(module.getId()); model.addAttribute("overview", moduleOverview); diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/exhibit/view/ExhibitionSpaceController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/exhibit/view/ExhibitionSpaceController.java index dc7738b8a..288a58f95 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/exhibit/view/ExhibitionSpaceController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/exhibit/view/ExhibitionSpaceController.java @@ -24,6 +24,11 @@ import edu.asu.diging.vspace.core.services.ISpaceLinkManager; import edu.asu.diging.vspace.core.services.ISpaceManager; import edu.asu.diging.vspace.core.services.ISpaceTextBlockManager; +import edu.asu.diging.vspace.core.services.ILanguageService; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import org.springframework.web.bind.annotation.RequestParam; @Controller public class ExhibitionSpaceController { @@ -54,9 +59,14 @@ public class ExhibitionSpaceController { @Autowired private ISpaceTextBlockManager spaceTextBlockManager; + + @Autowired + private ILanguageService languageService; @RequestMapping(value = { "/exhibit/space/{id}", "/preview/{"+ExhibitionConstants.PREVIEW_ID+"}/space/{id}" }) - public String space(@PathVariable("id") String id, Model model) { + public String space(@PathVariable("id") String id, + @RequestParam(value = "lang", required = false) String languageCode, + HttpServletRequest request, Model model) { ISpace space = spaceManager.getSpace(id); List spaceLinks; Boolean isSpacePublished = true; @@ -73,7 +83,31 @@ public String space(@PathVariable("id") String id, Model model) { model.addAttribute("isSpacePublished", isSpacePublished); IExhibition exhibition = exhibitManager.getStartExhibition(); model.addAttribute("exhibitionConfig", exhibition); + + // Handle language selection + HttpSession session = request.getSession(); + if (languageCode != null) { + session.setAttribute("selectedLanguage", languageCode); + } else { + languageCode = (String) session.getAttribute("selectedLanguage"); + if (languageCode == null) { + languageCode = languageService.getDefaultLanguageCode(); + } + } + + String localizedSpaceName = languageService.getLocalizedText(space.getSpaceNames(), languageCode, languageService.getDefaultLanguageCode()); + String localizedSpaceDescription = languageService.getLocalizedText(space.getSpaceDescriptions(), languageCode, languageService.getDefaultLanguageCode()); + + if (!localizedSpaceName.isEmpty()) { + space.setName(localizedSpaceName); + } + if (!localizedSpaceDescription.isEmpty()) { + space.setDescription(localizedSpaceDescription); + } + model.addAttribute("space", space); + model.addAttribute("selectedLanguage", languageCode); + model.addAttribute("availableLanguages", languageService.getAvailableLanguages()); model.addAttribute("moduleList", moduleLinkManager.getLinkDisplays(id)); model.addAttribute("spaceTextBlocks", spaceTextBlockManager.getSpaceTextBlockDisplays(id)); if (space.isShowUnpublishedLinks()) { diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSequenceController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSequenceController.java index 672725bd6..ebe156eb2 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSequenceController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSequenceController.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.RequestMethod; import edu.asu.diging.vspace.core.model.ISequence; +import edu.asu.diging.vspace.core.services.ILanguageService; import edu.asu.diging.vspace.core.services.IModuleManager; import edu.asu.diging.vspace.core.services.ISequenceManager; import edu.asu.diging.vspace.web.staff.forms.SequenceForm; @@ -25,11 +26,18 @@ public class AddSequenceController { @Autowired private IModuleManager moduleManager; + @Autowired + private ILanguageService languageService; + @RequestMapping(value = "/staff/module/{id}/sequence/add", method = RequestMethod.GET) public String showAddSequence(@PathVariable("id") String moduleId, Model model) { model.addAttribute("moduleId", moduleId); model.addAttribute("sequence", new SequenceForm()); model.addAttribute("slides", moduleManager.getModuleSlides(moduleId)); + + model.addAttribute("selectedLanguage", languageService.getDefaultLanguageCode()); + model.addAttribute("defaultLanguageCode", languageService.getDefaultLanguageCode()); + return "staff/modules/sequences/add"; } @RequestMapping(value = "/staff/module/{moduleId}/sequence/add", method = RequestMethod.POST) diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSlideController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSlideController.java index a16b34bdf..747e2b5e4 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSlideController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSlideController.java @@ -11,34 +11,40 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import edu.asu.diging.vspace.core.factory.ISlideFormFactory; import edu.asu.diging.vspace.core.model.IBranchingPoint; -import edu.asu.diging.vspace.core.model.IChoiceBlock; import edu.asu.diging.vspace.core.model.IModule; import edu.asu.diging.vspace.core.model.ISlide; import edu.asu.diging.vspace.core.model.display.SlideType; -import edu.asu.diging.vspace.core.services.IContentBlockManager; +import edu.asu.diging.vspace.core.model.impl.Slide; +import edu.asu.diging.vspace.core.services.IExhibitionManager; import edu.asu.diging.vspace.core.services.IModuleManager; import edu.asu.diging.vspace.core.services.ISlideManager; +import edu.asu.diging.vspace.core.services.impl.ExhibitionManager; import edu.asu.diging.vspace.web.staff.forms.SlideForm; @Controller public class AddSlideController { + + @Autowired + private IExhibitionManager exhibitionManager; @Autowired private ISlideManager slideManager; @Autowired private IModuleManager moduleManager; - + @Autowired - private IContentBlockManager contentBlockManager; + private ISlideFormFactory slideFormFactory; + @RequestMapping(value = "/staff/module/{id}/slide/add", method = RequestMethod.GET) public String showAddSlide(@PathVariable("id") String moduleId, Model model) { model.addAttribute("moduleId", moduleId); - model.addAttribute("slide", new SlideForm()); + model.addAttribute("slide", slideFormFactory.createNewSlideForm(new Slide(), exhibitionManager.getStartExhibition())); model.addAttribute("sequences", moduleManager.getModuleSequences(moduleId)); - + return "staff/modules/slides/add"; } @@ -51,12 +57,12 @@ public String addSlide(Model model, @PathVariable("moduleId") String moduleId, @ String slideId; if(type.equals(SlideType.BRANCHING_POINT)) { IBranchingPoint branchingPoint = slideManager.createBranchingPoint(module, slideForm, type); - IChoiceBlock choiceBlock = contentBlockManager.createChoiceBlock(branchingPoint.getId(), null, 0, true); slideId = branchingPoint.getId(); } - else { + else { ISlide slide = slideManager.createSlide(module, slideForm, type); slideId = slide.getId(); + slideManager.updateNameAndDescription(slide,slideForm); } return "redirect:/staff/module/{moduleId}/slide/" + slideId; diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSpaceController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSpaceController.java index 587ec6df5..736ba3595 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSpaceController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddSpaceController.java @@ -1,8 +1,8 @@ package edu.asu.diging.vspace.web.staff; import java.io.IOException; -import java.security.Principal; +import java.security.Principal; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -17,13 +17,16 @@ import edu.asu.diging.vspace.core.exception.ImageDoesNotExistException; import edu.asu.diging.vspace.core.factory.ISpaceFactory; +import edu.asu.diging.vspace.core.factory.ISpaceFormFactory; import edu.asu.diging.vspace.core.model.ISpace; import edu.asu.diging.vspace.core.model.IVSImage; +import edu.asu.diging.vspace.core.model.impl.Space; import edu.asu.diging.vspace.core.model.impl.SpaceStatus; import edu.asu.diging.vspace.core.services.IExhibitionManager; import edu.asu.diging.vspace.core.services.IImageService; import edu.asu.diging.vspace.core.services.ISpaceManager; import edu.asu.diging.vspace.core.services.impl.CreationReturnValue; +import edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm; import edu.asu.diging.vspace.web.staff.forms.SpaceForm; @Controller @@ -41,23 +44,35 @@ public class AddSpaceController { private IImageService imageService; @Autowired - private IExhibitionManager exhibitManager; - + private ISpaceFormFactory spaceFormFactory; + + @Autowired + private IExhibitionManager exhibitionManager; + @RequestMapping(value = "/staff/space/add", method = RequestMethod.GET) public String showAddSpace(Model model) { - model.addAttribute("space", new SpaceForm()); - model.addAttribute("images", imageService.getImages(1)); - + ISpace space = new Space(); + model.addAttribute("space", spaceFormFactory.createNewSpaceForm(space, exhibitionManager.getStartExhibition())); + model.addAttribute("images", imageService.getImages(1)); + return "staff/spaces/add"; } @RequestMapping(value = "/staff/space/add", method = RequestMethod.POST) public String addSpace(Model model, @ModelAttribute SpaceForm spaceForm, @RequestParam("file") MultipartFile file, Principal principal, @RequestParam(value = "imageId", required=false) String imageId, RedirectAttributes redirectAttrs) throws IOException { - ISpace space = spaceFactory.createSpace(spaceForm); - space.setSpaceStatus(SpaceStatus.UNPUBLISHED); - exhibitManager.getStartExhibition(); + ISpace space; + LocalizedTextForm nameSpace = spaceForm.getNames().stream().filter(name -> name != null).findFirst().orElse(null); + LocalizedTextForm descriptionSpace = spaceForm.getDescriptions().stream().filter(description -> description != null).findFirst().orElse(null); + spaceForm.setDefaultDescription(descriptionSpace); + spaceForm.setDefaultName(nameSpace); + space = spaceFactory.createSpace(spaceForm); + spaceManager.updateNameAndDescription(space, spaceForm); + + space.setSpaceStatus(SpaceStatus.UNPUBLISHED); + exhibitionManager.getStartExhibition(); + byte[] bgImage = null; String filename = null; if (file != null) { diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddTextBlockController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddTextBlockController.java index fac4734cc..8003bf5cc 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddTextBlockController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/AddTextBlockController.java @@ -13,21 +13,31 @@ import edu.asu.diging.vspace.core.model.ITextBlock; import edu.asu.diging.vspace.core.services.IContentBlockManager; +import edu.asu.diging.vspace.core.services.ILanguageService; @Controller public class AddTextBlockController { @Autowired private IContentBlockManager contentBlockManager; + + @Autowired + private ILanguageService languageService; @RequestMapping(value = "/staff/module/{moduleId}/slide/{id}/textcontent", method = RequestMethod.POST) public ResponseEntity addTextBlock(@PathVariable("id") String slideId, - @PathVariable("moduleId") String moduleId, @RequestParam("content") String content) throws IOException { + @PathVariable("moduleId") String moduleId, + @RequestParam("content") String content, + @RequestParam(value = "languageCode", required = false) String languageCode) throws IOException { Integer contentOrder = contentBlockManager.findMaxContentOrder(slideId); contentOrder = contentOrder == null ? 0 : contentOrder + 1; - ITextBlock textBlock = contentBlockManager.createTextBlock(slideId, content, contentOrder); + if (languageCode == null || languageCode.isEmpty()) { + languageCode = languageService.getDefaultLanguageCode(); + } + + ITextBlock textBlock = contentBlockManager.createTextBlockWithLanguage(slideId, content, contentOrder, languageCode); return new ResponseEntity<>(textBlock.getId(), HttpStatus.OK); } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DeleteSpaceController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DeleteSpaceController.java index 7feb0f9db..11deff0ea 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DeleteSpaceController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DeleteSpaceController.java @@ -1,6 +1,7 @@ package edu.asu.diging.vspace.web.staff; import org.slf4j.Logger; + import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DeleteTextBlockController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DeleteTextBlockController.java index 269f0365b..037b486be 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DeleteTextBlockController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/DeleteTextBlockController.java @@ -2,6 +2,7 @@ import java.io.IOException; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditSlideController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditSlideController.java index 7db7d59f4..0b4ac135c 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditSlideController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditSlideController.java @@ -14,11 +14,14 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; +import edu.asu.diging.vspace.core.factory.ISlideFormFactory; import edu.asu.diging.vspace.core.model.IBranchingPoint; +import edu.asu.diging.vspace.core.model.IExhibition; import edu.asu.diging.vspace.core.model.ISlide; import edu.asu.diging.vspace.core.model.display.SlideType; import edu.asu.diging.vspace.core.model.impl.BranchingPoint; import edu.asu.diging.vspace.core.model.impl.Slide; +import edu.asu.diging.vspace.core.services.IExhibitionManager; import edu.asu.diging.vspace.core.services.IModuleManager; import edu.asu.diging.vspace.core.services.ISlideManager; import edu.asu.diging.vspace.web.staff.forms.SlideForm; @@ -31,6 +34,12 @@ public class EditSlideController { @Autowired private IModuleManager moduleManager; + + @Autowired + private IExhibitionManager exhibitionManager; + + @Autowired + private ISlideFormFactory slideFormFactory; @RequestMapping(value = "/staff/module/{moduleId}/slide/{slideId}/edit/description", method = RequestMethod.POST) public ResponseEntity saveDescription(@RequestParam("description") String description, @@ -53,9 +62,7 @@ public ResponseEntity saveTitle(@RequestParam("title") String title, @RequestMapping(value="/staff/module/{moduleId}/slide/{slideId}/edit", method=RequestMethod.GET) public String show(Model model, @PathVariable("moduleId") String moduleId, @PathVariable("slideId") String slideId) { ISlide slide = slideManager.getSlide(slideId); - SlideForm slideForm = new SlideForm(); - slideForm.setName(slide.getName()); - slideForm.setDescription(slide.getDescription()); + SlideForm slideForm = slideFormFactory.createNewSlideForm(slide, exhibitionManager.getStartExhibition()); if(slide instanceof BranchingPoint) { slideForm.setType(SlideType.BRANCHING_POINT.toString()); IBranchingPoint branchingPoint = (IBranchingPoint) slide; @@ -76,15 +83,14 @@ public String show(Model model, @PathVariable("moduleId") String moduleId, @Path @RequestMapping(value="/staff/module/{moduleId}/slide/{slideId}/edit", method=RequestMethod.POST) public String save(@ModelAttribute SlideForm slideForm, @PathVariable("moduleId") String moduleId, @PathVariable("slideId") String slideId) { ISlide slide = slideManager.getSlide(slideId); - slide.setName(slideForm.getName()); - slide.setDescription(slideForm.getDescription()); SlideType type = slideForm.getType().isEmpty() ? null : SlideType.valueOf(slideForm.getType()); + if(type.equals(SlideType.BRANCHING_POINT)) { List editedChoices = slideForm.getChoices(); slideManager.updateBranchingPoint((IBranchingPoint)slide, editedChoices); - } else { - slideManager.updateSlide((Slide)slide); } + slideManager.updateNameAndDescription(slide, slideForm); + slideManager.updateSlide((Slide)slide); return "redirect:/staff/module/{moduleId}/slide/{slideId}"; } } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditSpaceController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditSpaceController.java index 9c9e5ca8a..750167499 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditSpaceController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/EditSpaceController.java @@ -8,7 +8,9 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import edu.asu.diging.vspace.core.factory.ISpaceFormFactory; import edu.asu.diging.vspace.core.model.ISpace; +import edu.asu.diging.vspace.core.services.IExhibitionManager; import edu.asu.diging.vspace.core.services.ISpaceManager; import edu.asu.diging.vspace.web.staff.forms.SpaceForm; @@ -17,25 +19,24 @@ public class EditSpaceController { @Autowired private ISpaceManager spaceManager; - + + @Autowired + private ISpaceFormFactory spaceFormFactory; + + @Autowired + private IExhibitionManager exhibitionManager; + @RequestMapping(value="/staff/space/{spaceId}/edit", method=RequestMethod.GET) public String show(Model model, @PathVariable("spaceId") String spaceId) { - ISpace space = spaceManager.getSpace(spaceId); - SpaceForm spaceForm = new SpaceForm(); - spaceForm.setName(space.getName()); - spaceForm.setDescription(space.getDescription()); - model.addAttribute("spaceForm", spaceForm); + model.addAttribute("spaceForm", spaceFormFactory.createNewSpaceForm(spaceManager.getSpace(spaceId), exhibitionManager.getStartExhibition())); model.addAttribute("spaceId", spaceId); - return "staff/spaces/edit"; } @RequestMapping(value="/staff/space/{spaceId}/edit", method=RequestMethod.POST) public String save(@ModelAttribute SpaceForm spaceForm, @PathVariable("spaceId") String spaceId) { ISpace space = spaceManager.getSpace(spaceId); - space.setName(spaceForm.getName()); - space.setDescription(spaceForm.getDescription()); - + spaceManager.updateNameAndDescription(space, spaceForm); spaceManager.storeSpace(space, null, null); return "redirect:/staff/space/{spaceId}"; } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ExhibitionAboutPageController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ExhibitionAboutPageController.java index 829f94490..0ba91f937 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ExhibitionAboutPageController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ExhibitionAboutPageController.java @@ -1,6 +1,7 @@ package edu.asu.diging.vspace.web.staff; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; @@ -11,8 +12,16 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import edu.asu.diging.vspace.core.factory.IAboutPageFormFactory; +import edu.asu.diging.vspace.core.model.IExhibition; +import edu.asu.diging.vspace.core.model.ILocalizedText; import edu.asu.diging.vspace.core.model.impl.ExhibitionAboutPage; +import edu.asu.diging.vspace.core.model.impl.ExhibitionLanguage; +import edu.asu.diging.vspace.core.model.impl.LocalizedText; import edu.asu.diging.vspace.core.services.IExhibitionAboutPageManager; +import edu.asu.diging.vspace.core.services.IExhibitionManager; +import edu.asu.diging.vspace.web.staff.forms.AboutPageForm; +import edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm; /** * @@ -24,23 +33,20 @@ public class ExhibitionAboutPageController { @Autowired private IExhibitionAboutPageManager aboutPageManager; - + + @Autowired + private IAboutPageFormFactory exhibitionAboutPageFactory; + @RequestMapping(value = "/staff/exhibit/about", method = RequestMethod.GET) - public String showAboutPage(Model model) { - List aboutPageList = aboutPageManager.findAll(); - ExhibitionAboutPage exhibitionAboutPage = aboutPageList != null && !aboutPageList.isEmpty() ? aboutPageList.get(0):new ExhibitionAboutPage(); - model.addAttribute("aboutPage", exhibitionAboutPage); + public String showAboutPage(Model model) { + model.addAttribute("aboutPage", exhibitionAboutPageFactory.createAboutPageForm(aboutPageManager.getExhibitionAboutPage())); return "staff/exhibit/aboutPage"; } @RequestMapping(value = "/staff/exhibit/about", method = RequestMethod.POST) - public String createOrUpdateAboutPage(@ModelAttribute ExhibitionAboutPage aboutPageForm, RedirectAttributes attributes) throws IOException { - List aboutPageList = aboutPageManager.findAll(); - ExhibitionAboutPage exhibitionAboutPage = aboutPageList != null && !aboutPageList.isEmpty() ? aboutPageList.get(0):new ExhibitionAboutPage(); - exhibitionAboutPage.setTitle(aboutPageForm.getTitle()); - exhibitionAboutPage.setAboutPageText(aboutPageForm.getAboutPageText()); - exhibitionAboutPage = aboutPageManager.store(exhibitionAboutPage); + public String createOrUpdateAboutPage(@ModelAttribute AboutPageForm aboutPageForm, RedirectAttributes attributes) throws IOException { + aboutPageManager.store(aboutPageForm); attributes.addAttribute("alertType", "success"); attributes.addAttribute("message", "Successfully Saved!"); attributes.addAttribute("showAlert", "true"); diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ExhibitionConfigurationController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ExhibitionConfigurationController.java index 4e6a1c6db..ab570e24a 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ExhibitionConfigurationController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ExhibitionConfigurationController.java @@ -11,6 +11,8 @@ import javax.validation.Valid; import org.javers.common.collections.Arrays; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -27,6 +29,7 @@ import edu.asu.diging.vspace.config.ExhibitionLanguageConfig; import edu.asu.diging.vspace.core.data.SpaceRepository; +import edu.asu.diging.vspace.core.exception.ExhibitionLanguageDeletionException; import edu.asu.diging.vspace.core.factory.impl.ExhibitionFactory; import edu.asu.diging.vspace.core.model.ExhibitionModes; import edu.asu.diging.vspace.core.model.IExhibition; @@ -60,6 +63,8 @@ public class ExhibitionConfigurationController { @Autowired private ExhibitionLanguageConfig exhibitionLanguageConfig; + private final Logger logger = LoggerFactory.getLogger(getClass()); + public static final String EXH_PREVIEW = "EXH_PREVIEW_"; @RequestMapping("/staff/exhibit/config") @@ -93,24 +98,18 @@ public String showExhibitions(Model model) { * @param spaceParam * @param attributes * @return - */ + * @throws IOException + */ @RequestMapping(value = "/staff/exhibit/config", method = RequestMethod.POST) public RedirectView createOrUpdateExhibition(HttpServletRequest request, @RequestParam(required = false, name = "exhibitionParam") String exhibitID, - @RequestParam("spaceParam") String spaceID, - @Valid @ModelAttribute("exhibitionConfigurationForm") ExhibitionConfigurationForm exhibitionConfigForm, - BindingResult result, + @RequestParam("spaceParam") String spaceID, @RequestParam("title") String title, + @RequestParam("exhibitionMode") ExhibitionModes exhibitMode, + @RequestParam(value = "customMessage", required = false, defaultValue = "") String customMessage, + @RequestParam("exhibitLanguage") List languages, + @RequestParam("defaultExhibitLanguage") String defaultLanguage, RedirectAttributes attributes) throws IOException { - if(result.hasErrors()) { - attributes.addAttribute("showAlert", true); - attributes.addAttribute("alertType", "danger"); - attributes.addAttribute("message", result.getFieldError().getDefaultMessage()); - return new RedirectView(request.getContextPath() + "/staff/exhibit/config"); - } - ExhibitionModes exhibitMode = exhibitionConfigForm.getExhibitionMode(); - List languages = exhibitionConfigForm.getExhibitLanguage(); - String defaultLanguage = exhibitionConfigForm.getDefaultExhibitLanguage(); - String customMessage = exhibitionConfigForm.getCustomMessage(); + IExhibition exhibition; if (exhibitID == null || exhibitID.isEmpty()) { @@ -119,12 +118,20 @@ public RedirectView createOrUpdateExhibition(HttpServletRequest request, exhibition = exhibitionManager.getExhibitionById(exhibitID); } exhibition.setStartSpace(spaceManager.getSpace(spaceID)); - exhibition.setTitle(exhibitionConfigForm.getTitle()); + exhibition.setTitle(title); exhibition.setMode(exhibitMode); - - exhibitionManager.updateExhibitionLanguages(exhibition, languages, defaultLanguage); - - if (exhibitMode.equals(ExhibitionModes.OFFLINE) && !customMessage.equals(ExhibitionModes.OFFLINE.getValue())) { + try { + exhibitionManager.updateExhibitionLanguages((Exhibition) exhibition,languages,defaultLanguage); + + } catch (ExhibitionLanguageDeletionException e) { + attributes.addAttribute("alertType", "failure"); + attributes.addAttribute("message", "Could not delete the Exhibition Language as it has localized data associated to it."); + attributes.addAttribute("showAlert", "true"); + logger.info("Could not delete the Exhibition Language as it has localized data associated to it.",e); + return new RedirectView(request.getContextPath() + "/staff/exhibit/config"); + } + + if(exhibitMode.equals(ExhibitionModes.OFFLINE) && !customMessage.equals(ExhibitionModes.OFFLINE.getValue())) { exhibition.setCustomMessage(customMessage); } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ModuleController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ModuleController.java index 31e8ccd3d..801605993 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ModuleController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/ModuleController.java @@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import edu.asu.diging.vspace.core.model.IModule; +import edu.asu.diging.vspace.core.services.ILanguageService; import edu.asu.diging.vspace.core.services.IModuleLinkManager; import edu.asu.diging.vspace.core.services.IModuleManager; @@ -19,6 +20,9 @@ public class ModuleController { @Autowired private IModuleLinkManager moduleLinkManager; + + @Autowired + private ILanguageService languageService; @RequestMapping(STAFF_MODULE_PATH+"{id}") public String showModule(@PathVariable String id, Model model) { @@ -28,6 +32,10 @@ public String showModule(@PathVariable String id, Model model) { model.addAttribute("sequences", moduleManager.getModuleSequences(id)); model.addAttribute("moduleStatus", module.getModuleStatus()); model.addAttribute("spacesList", moduleLinkManager.findSpaceListFromModuleId(id)); + + model.addAttribute("selectedLanguage", languageService.getDefaultLanguageCode()); + model.addAttribute("defaultLanguageCode", languageService.getDefaultLanguageCode()); + return "staff/modules/module"; } } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SequenceController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SequenceController.java index 0aafb5717..393001404 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SequenceController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SequenceController.java @@ -14,8 +14,10 @@ import org.springframework.web.bind.annotation.RequestMethod; import edu.asu.diging.vspace.core.model.ISlide; +import edu.asu.diging.vspace.core.services.ILanguageService; import edu.asu.diging.vspace.core.services.IModuleManager; import edu.asu.diging.vspace.core.services.ISequenceManager; +import edu.asu.diging.vspace.web.staff.dto.SlideDTO; import edu.asu.diging.vspace.web.staff.forms.SequenceForm; @Controller @@ -26,13 +28,30 @@ public class SequenceController { @Autowired private IModuleManager moduleManager; + + @Autowired + private ILanguageService languageService; @RequestMapping(value = "/staff/module/{moduleId}/sequence/{id}/slides", method = RequestMethod.GET) - public ResponseEntity> getSequenceSlides(Model model, @PathVariable("moduleId") String moduleId, + public ResponseEntity> getSequenceSlides(Model model, @PathVariable("moduleId") String moduleId, @PathVariable("id") String sequenceId, @ModelAttribute SequenceForm sequenceForm, Principal principal) { List slides = sequenceManager.getSequence(sequenceId).getSlides(); - return new ResponseEntity>(slides, HttpStatus.OK); + String defaultLanguageCode = languageService.getDefaultLanguageCode(); + + List slideDTOs = slides.stream() + .map(slide -> { + String localizedName = slide.getLocalizedName(defaultLanguageCode, defaultLanguageCode); + String localizedDescription = slide.getLocalizedDescription(defaultLanguageCode, defaultLanguageCode); + return new SlideDTO( + slide.getId(), + localizedName != null && !localizedName.isEmpty() ? localizedName : slide.getName(), + localizedDescription != null && !localizedDescription.isEmpty() ? localizedDescription : slide.getDescription() + ); + }) + .collect(java.util.stream.Collectors.toList()); + + return new ResponseEntity>(slideDTOs, HttpStatus.OK); } @RequestMapping(value = "/staff/module/{moduleId}/sequence/{id}", method = RequestMethod.GET) @@ -43,6 +62,9 @@ public String getSequence(Model model, @PathVariable("moduleId") String moduleId model.addAttribute("sequence", sequenceManager.getSequence(sequenceId)); model.addAttribute("selectedSlides", sequenceManager.getSequence(sequenceId).getSlides()); model.addAttribute("allSlides", moduleManager.getModuleSlides(moduleId)); + model.addAttribute("selectedLanguage", languageService.getDefaultLanguageCode()); + model.addAttribute("defaultLanguageCode", languageService.getDefaultLanguageCode()); + return "staff/modules/sequences/sequence"; } } \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SlideController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SlideController.java index 5ed7fbeb9..abd20485b 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SlideController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SlideController.java @@ -20,6 +20,8 @@ import edu.asu.diging.vspace.core.model.ISlide; import edu.asu.diging.vspace.core.model.impl.BranchingPoint; import edu.asu.diging.vspace.core.services.IContentBlockManager; +import edu.asu.diging.vspace.core.services.IExhibitionManager; +import edu.asu.diging.vspace.core.services.ILanguageService; import edu.asu.diging.vspace.core.services.IModuleManager; import edu.asu.diging.vspace.core.services.ISlideManager; import edu.asu.diging.vspace.web.staff.forms.SequenceForm; @@ -36,6 +38,12 @@ public class SlideController { @Autowired private IContentBlockManager contentBlockManager; + + @Autowired + private IExhibitionManager exhibitionManager; + + @Autowired + private ILanguageService languageService; @RequestMapping("/staff/module/{moduleId}/slide/{id}") public String listSlides(@PathVariable("id") String id, @PathVariable("moduleId") String moduleId, Model model) { @@ -48,6 +56,10 @@ public String listSlides(@PathVariable("id") String id, @PathVariable("moduleId" model.addAttribute("slideContents", slideContents); model.addAttribute("contentCount", slideContents.size() > 0 ? slideContents.get(slideContents.size() - 1).getContentOrder() : 0); + + model.addAttribute("availableLanguages", languageService.getAvailableLanguages()); + model.addAttribute("defaultLanguageCode", languageService.getDefaultLanguageCode()); + if (slideManager.getSlide(id) instanceof BranchingPoint) { model.addAttribute("choices", ((IBranchingPoint) slide).getChoices()); } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SpaceController.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SpaceController.java index e36571afb..65dda5cf9 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SpaceController.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/SpaceController.java @@ -57,6 +57,7 @@ public String showSpace(@PathVariable String id, Model model) { model.addAttribute("linksOnThisSpace", spaceManager.getOutgoingLinks(id)); model.addAttribute("linksToThisSpace",spaceManager.getIncomingLinks(id)); model.addAttribute("space", space); + model.addAttribute("spaceLinks", spaceLinkManager.getLinkDisplays(id)); model.addAttribute("externalLinks", externalLinkManager.getLinkDisplays(id)); model.addAttribute("moduleLinks", moduleLinkManager.getLinkDisplays(id)); diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/dto/SlideDTO.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/dto/SlideDTO.java new file mode 100644 index 000000000..c95546219 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/dto/SlideDTO.java @@ -0,0 +1,43 @@ +package edu.asu.diging.vspace.web.staff.dto; + +/** + * Data Transfer Object for slide information in staff interface + */ +public class SlideDTO { + private String id; + private String name; + private String description; + + public SlideDTO() { + } + + public SlideDTO(String id, String name, String description) { + this.id = id; + this.name = name; + this.description = description; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/AboutPageForm.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/AboutPageForm.java new file mode 100644 index 000000000..035832f04 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/AboutPageForm.java @@ -0,0 +1,69 @@ +package edu.asu.diging.vspace.web.staff.forms; + +import java.util.ArrayList; + +import java.util.List; + +public class AboutPageForm { + + private String title; + + private String aboutPageText; + + private LocalizedTextForm defaultTitle; + + private LocalizedTextForm defaultAboutPageText; + + private List titles = new ArrayList(); + + private List aboutPageTexts = new ArrayList(); + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAboutPageText() { + return aboutPageText; + } + + public void setAboutPageText(String aboutPageText) { + this.aboutPageText = aboutPageText; + } + + public LocalizedTextForm getDefaultTitle() { + return defaultTitle; + } + + public void setDefaultTitle(LocalizedTextForm defaultTitle) { + this.defaultTitle = defaultTitle; + } + + public LocalizedTextForm getDefaultAboutPageText() { + return defaultAboutPageText; + } + + public void setDefaultAboutPageText(LocalizedTextForm defaultAboutPageText) { + this.defaultAboutPageText = defaultAboutPageText; + } + + public List getTitles() { + return titles; + } + + public void setTitles(List titles) { + this.titles = titles; + } + + public List getAboutPageTexts() { + return aboutPageTexts; + } + + public void setAboutPageTexts(List aboutPageTexts) { + this.aboutPageTexts = aboutPageTexts; + } + +} \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/LocalizedTextForm.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/LocalizedTextForm.java new file mode 100644 index 000000000..994e394bd --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/LocalizedTextForm.java @@ -0,0 +1,69 @@ +package edu.asu.diging.vspace.web.staff.forms; + +public class LocalizedTextForm { + + private String text; + + private String localizedTextId; + + private String exhibitionLanguageId; + + private String exhibitionLanguageLabel; + + private Boolean isDefaultExhibitionLanguage; + + + public LocalizedTextForm() { + super(); + } + + public LocalizedTextForm(String text, String localizedTextId, String exhibitionLanguageId, + String exhibitionLanguageLabel) { + super(); + this.text = text; + this.localizedTextId = localizedTextId; + this.exhibitionLanguageId = exhibitionLanguageId; + this.exhibitionLanguageLabel = exhibitionLanguageLabel; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public String getLocalizedTextId() { + return localizedTextId; + } + + public void setLocalizedTextId(String localizedTextId) { + this.localizedTextId = localizedTextId; + } + + public String getExhibitionLanguageId() { + return exhibitionLanguageId; + } + + public void setExhibitionLanguageId(String exhibitionLanguageId) { + this.exhibitionLanguageId = exhibitionLanguageId; + } + + public String getExhibitionLanguageLabel() { + return exhibitionLanguageLabel; + } + + public void setExhibitionLanguageLabel(String exhibitionLanguageLabel) { + this.exhibitionLanguageLabel = exhibitionLanguageLabel; + } + + public Boolean getIsDefaultExhibitionLanguage() { + return isDefaultExhibitionLanguage; + } + + public void setIsDefaultExhibitionLanguage(Boolean isDefaultExhibitionLanguage) { + this.isDefaultExhibitionLanguage = isDefaultExhibitionLanguage; + } +} + diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/SlideForm.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/SlideForm.java index 8632427f6..ca8bf6657 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/SlideForm.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/SlideForm.java @@ -1,14 +1,22 @@ package edu.asu.diging.vspace.web.staff.forms; +import java.util.ArrayList; import java.util.List; + public class SlideForm { private String name; private String description; + private LocalizedTextForm defaultName; + private LocalizedTextForm defaultDescription; private String type; private List choices; + private List names = new ArrayList(); + + private List descriptions = new ArrayList(); + public String getName() { return name; } @@ -33,4 +41,30 @@ public List getChoices() { public void setChoices(List choices) { this.choices = choices; } + public List getNames() { + return names; + } + public void setNames(List names) { + this.names = names; + } + public List getDescriptions() { + return descriptions; + } + public void setDescriptions(List descriptions) { + this.descriptions = descriptions; + } + public LocalizedTextForm getDefaultName() { + return defaultName; + } + public void setDefaultName(LocalizedTextForm defaultName) { + this.defaultName = defaultName; + } + public LocalizedTextForm getDefaultDescription() { + return defaultDescription; + } + public void setDefaultDescription(LocalizedTextForm defaultDescription) { + this.defaultDescription = defaultDescription; + } + + } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/SpaceForm.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/SpaceForm.java index 17c1b104d..d6eb77617 100644 --- a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/SpaceForm.java +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/SpaceForm.java @@ -1,9 +1,22 @@ package edu.asu.diging.vspace.web.staff.forms; +import java.util.ArrayList; + +import java.util.List; + public class SpaceForm { - private String name; - private String description; + private String name; + + private String description; + + private LocalizedTextForm defaultName; + + private LocalizedTextForm defaultDescription; + + private List names = new ArrayList(); + + private List descriptions = new ArrayList(); public String getName() { return name; @@ -17,4 +30,29 @@ public String getDescription() { public void setDescription(String description) { this.description = description; } + public List getNames() { + return names; + } + public void setNames(List names) { + this.names = names; + } + public List getDescriptions() { + return descriptions; + } + public void setDescriptions(List descriptions) { + this.descriptions = descriptions; + } + public LocalizedTextForm getDefaultName() { + return defaultName; + } + public void setDefaultName(LocalizedTextForm defaultName) { + this.defaultName = defaultName; + } + public LocalizedTextForm getDefaultDescription() { + return defaultDescription; + } + public void setDefaultDescription(LocalizedTextForm defaultDescription) { + this.defaultDescription = defaultDescription; + } + } diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/factory/AboutPageFormFactory.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/factory/AboutPageFormFactory.java new file mode 100644 index 000000000..c9361e0e1 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/factory/AboutPageFormFactory.java @@ -0,0 +1,57 @@ +package edu.asu.diging.vspace.web.staff.forms.factory; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import edu.asu.diging.vspace.core.data.ExhibitionLanguageRepository; +import edu.asu.diging.vspace.core.factory.IAboutPageFormFactory; +import edu.asu.diging.vspace.core.model.IExhibition; +import edu.asu.diging.vspace.core.model.IExhibitionLanguage; +import edu.asu.diging.vspace.core.model.impl.ExhibitionAboutPage; +import edu.asu.diging.vspace.core.services.IExhibitionManager; +import edu.asu.diging.vspace.web.staff.forms.AboutPageForm; + +@Component +public class AboutPageFormFactory implements IAboutPageFormFactory{ + + @Autowired + private IExhibitionManager exhibitionManager; + + @Autowired + private LocalizedTextFormFactory localizedTextFormCreation; + + /** + * Creates About Page form object + */ + @Override + public AboutPageForm createAboutPageForm(ExhibitionAboutPage exhibitionAboutPage) { + AboutPageForm aboutPageForm=new AboutPageForm(); + aboutPageForm.setAboutPageText(exhibitionAboutPage.getAboutPageText()); + aboutPageForm.setTitle(exhibitionAboutPage.getTitle()); + + IExhibition startExhibition = exhibitionManager.getStartExhibition(); + IExhibitionLanguage defaultLanguage = exhibitionManager.getDefaultLanguage(startExhibition); + + if (defaultLanguage != null) { + aboutPageForm.setDefaultTitle(localizedTextFormCreation.createLocalizedTextForm( defaultLanguage, + exhibitionAboutPage.getExhibitionTitles())); + aboutPageForm.setDefaultAboutPageText(localizedTextFormCreation.createLocalizedTextForm( defaultLanguage, + exhibitionAboutPage.getExhibitionTextDescriptions())); + } else { + aboutPageForm.setDefaultTitle(new edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm("", null, null, "Default")); + aboutPageForm.setDefaultAboutPageText(new edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm("", null, null, "Default")); + } + + if (startExhibition != null && startExhibition.getLanguages() != null && !startExhibition.getLanguages().isEmpty()) { + startExhibition.getLanguages().forEach(language -> { + if(!language.isDefault()) { + aboutPageForm.getTitles().add(localizedTextFormCreation.createLocalizedTextForm( language, + exhibitionAboutPage.getExhibitionTitles())); + aboutPageForm.getAboutPageTexts().add(localizedTextFormCreation.createLocalizedTextForm(language, + exhibitionAboutPage.getExhibitionTextDescriptions())); + } + }); + } + return aboutPageForm; + } +} \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/factory/LocalizedTextFormFactory.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/factory/LocalizedTextFormFactory.java new file mode 100644 index 000000000..94e56ef49 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/factory/LocalizedTextFormFactory.java @@ -0,0 +1,36 @@ +package edu.asu.diging.vspace.web.staff.forms.factory; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.thymeleaf.util.StringUtils; + +import edu.asu.diging.vspace.core.model.IExhibitionLanguage; +import edu.asu.diging.vspace.core.model.ILocalizedText; +import edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm; + +@Service +public class LocalizedTextFormFactory { + + /** + * Creates LocalizedTextForm form using provided list of localizedTexts. + * @param exhibitionAboutPage + * @param language + * @param localizedTexts + * @return + */ + public LocalizedTextForm createLocalizedTextForm( IExhibitionLanguage language, List localizedTexts) { + + LocalizedTextForm localizedAboutTextForm = new LocalizedTextForm(null, null, language.getId(), language.getLabel() ); + ILocalizedText localizedText = localizedTexts.stream() + .filter(exhibitionText -> StringUtils.equals(language.getId(), + exhibitionText.getExhibitionLanguage().getId())).findAny().orElse(null); + + if(localizedText != null) { + localizedAboutTextForm.setText(localizedText.getText()); + localizedAboutTextForm.setLocalizedTextId( localizedText.getId()); + } + localizedAboutTextForm.setIsDefaultExhibitionLanguage(language.isDefault()); + return localizedAboutTextForm; + } +} \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/factory/SlideFormFactory.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/factory/SlideFormFactory.java new file mode 100644 index 000000000..0d09133f5 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/factory/SlideFormFactory.java @@ -0,0 +1,55 @@ +package edu.asu.diging.vspace.web.staff.forms.factory; + +import org.springframework.beans.factory.annotation.Autowired; + +import org.springframework.stereotype.Service; + +import edu.asu.diging.vspace.core.factory.ISlideFormFactory; +import edu.asu.diging.vspace.core.model.IExhibition; +import edu.asu.diging.vspace.core.model.IExhibitionLanguage; +import edu.asu.diging.vspace.core.model.ISlide; +import edu.asu.diging.vspace.core.services.IExhibitionManager; +import edu.asu.diging.vspace.web.staff.forms.SlideForm; + +@Service +public class SlideFormFactory implements ISlideFormFactory{ + + @Autowired + private LocalizedTextFormFactory localizedTextFormCreation; + + /** + * Creates new slide form object based on the slide and the exhibition + * + * This method initializes a {@code SlideForm} object and populates it with the name and + * description of the given slide. It then processes the exhibition's supported languages, setting + * the default name and description for the default language, and adds localized names and + * descriptions for other languages. + * + * @param slide The {@code ISlide} containing the slide details. + * @param startExhibition The {@code IExhibition} from which the language settings are derived. + * @return A {@code SlideForm} containing localized slide information. + */ + @Override + public SlideForm createNewSlideForm(ISlide slide, IExhibition startExhibition) { + SlideForm slideForm = new SlideForm(); + slideForm.setName(slide.getName()); + slideForm.setDescription(slide.getDescription()); + + if (startExhibition != null && startExhibition.getLanguages() != null && !startExhibition.getLanguages().isEmpty()) { + startExhibition.getLanguages().forEach(language -> { + if(language.isDefault()) { + slideForm.setDefaultName(localizedTextFormCreation.createLocalizedTextForm(language, slide.getSlideNames())); + slideForm.setDefaultDescription(localizedTextFormCreation.createLocalizedTextForm(language, slide.getSlideDescriptions())); + } + else { + slideForm.getNames().add(localizedTextFormCreation.createLocalizedTextForm(language, slide.getSlideNames())); + slideForm.getDescriptions().add(localizedTextFormCreation.createLocalizedTextForm(language, slide.getSlideDescriptions())); + } + }); + } else { + slideForm.setDefaultName(new edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm("", null, null, "Default")); + slideForm.setDefaultDescription(new edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm("", null, null, "Default")); + } + return slideForm; + } +} \ No newline at end of file diff --git a/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/factory/SpaceFormFactory.java b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/factory/SpaceFormFactory.java new file mode 100644 index 000000000..ac04af9b0 --- /dev/null +++ b/vspace/src/main/java/edu/asu/diging/vspace/web/staff/forms/factory/SpaceFormFactory.java @@ -0,0 +1,52 @@ +package edu.asu.diging.vspace.web.staff.forms.factory; + +import org.springframework.beans.factory.annotation.Autowired; + +import org.springframework.stereotype.Service; + +import edu.asu.diging.vspace.core.factory.ISpaceFormFactory; +import edu.asu.diging.vspace.core.model.IExhibition; +import edu.asu.diging.vspace.core.model.ISpace; +import edu.asu.diging.vspace.core.services.IExhibitionManager; +import edu.asu.diging.vspace.web.staff.forms.SpaceForm; + +@Service +public class SpaceFormFactory implements ISpaceFormFactory { + + @Autowired + private LocalizedTextFormFactory localizedTextFormCreation; + + @Autowired + private IExhibitionManager exhibitionManager; + + /** + * + * Creates new space form object + * @param space + * @return + */ + @Override + public SpaceForm createNewSpaceForm(ISpace space, IExhibition startExhibition) { + SpaceForm spaceForm = new SpaceForm(); + spaceForm.setName(space.getName()); + spaceForm.setDescription(space.getDescription()); + + if (startExhibition != null && startExhibition.getLanguages() != null && !startExhibition.getLanguages().isEmpty()) { + startExhibition.getLanguages().forEach(language -> { + if(language.isDefault()) { + spaceForm.setDefaultName(localizedTextFormCreation.createLocalizedTextForm(language, space.getSpaceNames())); + spaceForm.setDefaultDescription(localizedTextFormCreation.createLocalizedTextForm(language, space.getSpaceDescriptions())); + } + else { + spaceForm.getNames().add(localizedTextFormCreation.createLocalizedTextForm(language, space.getSpaceNames())); + spaceForm.getDescriptions().add(localizedTextFormCreation.createLocalizedTextForm(language, space.getSpaceDescriptions())); + } + }); + } else { + spaceForm.setDefaultName(new edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm("", null, null, "Default")); + spaceForm.setDefaultDescription(new edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm("", null, null, "Default")); + } + + return spaceForm; + } +} \ No newline at end of file diff --git a/vspace/src/main/webapp/WEB-INF/views/exhibition/module.html b/vspace/src/main/webapp/WEB-INF/views/exhibition/module.html index f30770549..e71d862e0 100644 --- a/vspace/src/main/webapp/WEB-INF/views/exhibition/module.html +++ b/vspace/src/main/webapp/WEB-INF/views/exhibition/module.html @@ -210,10 +210,10 @@

[[${module.name}]]

-

[[${currentSlideCon.name}]]

+

[(${currentSlideCon.getLocalizedName(selectedLanguage, defaultLanguageCode) != null && !currentSlideCon.getLocalizedName(selectedLanguage, defaultLanguageCode).isEmpty() ? currentSlideCon.getLocalizedName(selectedLanguage, defaultLanguageCode) : currentSlideCon.name})]

-
[(${contents.htmlRenderedText()})]
+
[(${contents.getLocalizedHtmlRenderedText(selectedLanguage, defaultLanguageCode) != null && !contents.getLocalizedHtmlRenderedText(selectedLanguage, defaultLanguageCode).isEmpty() ? contents.getLocalizedHtmlRenderedText(selectedLanguage, defaultLanguageCode) : contents.htmlRenderedText()})]

Title: [(${contents.getBiblioTitle()})]

description: [(${contents.getDescription()})]

diff --git a/vspace/src/main/webapp/WEB-INF/views/exhibition/space.html b/vspace/src/main/webapp/WEB-INF/views/exhibition/space.html index 041bf1fed..86cc8913e 100644 --- a/vspace/src/main/webapp/WEB-INF/views/exhibition/space.html +++ b/vspace/src/main/webapp/WEB-INF/views/exhibition/space.html @@ -320,6 +320,13 @@ $("#mySideModulenav").css("width", "0"); } + function changeLanguage(languageCode) { + var currentUrl = window.location.href; + var url = new URL(currentUrl); + url.searchParams.set('lang', languageCode); + window.location.href = url.toString(); + } + function closeSpaceDescription(){ $("#rightContent").css("width", "0"); $("#rightContent").css("height", "0"); @@ -621,7 +628,7 @@ onclick="closeNav()">×
+ +
+ +
+

[[${space.name}]] + - - +

Exhibition About Page

-
+ -
- + + +
+
+ + +
+ +
+
+
+
+

[[${aboutPage.defaultTitle.exhibitionLanguageLabel}]]

+ + + + +
+ + + + +
+
+
+
+

[[${title.exhibitionLanguageLabel}]]

+ + + + +
+ + + + +
+
+
-
- -
-

- +

+ +
diff --git a/vspace/src/main/webapp/WEB-INF/views/staff/modules/module.html b/vspace/src/main/webapp/WEB-INF/views/staff/modules/module.html index 872a21f58..ee6a410d8 100644 --- a/vspace/src/main/webapp/WEB-INF/views/staff/modules/module.html +++ b/vspace/src/main/webapp/WEB-INF/views/staff/modules/module.html @@ -328,9 +328,9 @@

All Slides

diff --git a/vspace/src/main/webapp/WEB-INF/views/staff/modules/slides/add.html b/vspace/src/main/webapp/WEB-INF/views/staff/modules/slides/add.html index 2480eb15d..f98ccfddb 100644 --- a/vspace/src/main/webapp/WEB-INF/views/staff/modules/slides/add.html +++ b/vspace/src/main/webapp/WEB-INF/views/staff/modules/slides/add.html @@ -4,6 +4,51 @@ type="text/css" rel="stylesheet"> + +

Add new Slide

-
-
- -
+ + + +
+
+ + +
+ +
+
+
+
+

[[${slide.defaultName.exhibitionLanguageLabel}]]

+ + + + + + + + + +
+ +
+
+

[[${title.exhibitionLanguageLabel}]]

+ + + + +
+ + + + + +
+
+
+
+
+
-
- - -
- + +

+ +

\ No newline at end of file diff --git a/vspace/src/main/webapp/WEB-INF/views/staff/modules/slides/edit.html b/vspace/src/main/webapp/WEB-INF/views/staff/modules/slides/edit.html index 3bea59664..e2bf1c1f4 100644 --- a/vspace/src/main/webapp/WEB-INF/views/staff/modules/slides/edit.html +++ b/vspace/src/main/webapp/WEB-INF/views/staff/modules/slides/edit.html @@ -2,12 +2,55 @@ + + + + +

Edit Slide: [[${slideForm.name}]]

- -
- -
- - + +
+
+ + +
+ +
+
+
+
+ + + + + + + + + +
+ +
+
+ + + + +
+ + + + + +
+
+
+
- +
- -
- - -
+ +

+ + Cancel +

- - Cancel
diff --git a/vspace/src/main/webapp/WEB-INF/views/staff/modules/slides/slide.html b/vspace/src/main/webapp/WEB-INF/views/staff/modules/slides/slide.html index d1708279e..379cdc7a7 100644 --- a/vspace/src/main/webapp/WEB-INF/views/staff/modules/slides/slide.html +++ b/vspace/src/main/webapp/WEB-INF/views/staff/modules/slides/slide.html @@ -1816,12 +1816,13 @@ $("#submitText").on("click", function(e) { $("#addTextAlert").hide(); e.preventDefault(); - // ------------- creating text content blocks ------------ var formData = new FormData(); var token = [[${_csrf.token}]]; var text = markDown.value(); + var languageCode = $('#textBlockLanguage').val(); formData.append('content', text); + formData.append('languageCode', languageCode); markDown.value(''); $.ajax({ url: "[(@{'/staff/module/'+${module.id}+'/slide/'+${slide.id}+'/textcontent'})]", @@ -2685,7 +2686,7 @@ - +
-

Slide: [[${slide.name}]] +

Slide: [(${slide.getLocalizedName(selectedLanguage, defaultLanguageCode) != null && !slide.getLocalizedName(selectedLanguage, defaultLanguageCode).isEmpty() ? slide.getLocalizedName(selectedLanguage, defaultLanguageCode) : slide.name})]

-

[[${slide.description}]]

+

[(${slide.getLocalizedDescription(selectedLanguage, defaultLanguageCode) != null && !slide.getLocalizedDescription(selectedLanguage, defaultLanguageCode).isEmpty() ? slide.getLocalizedDescription(selectedLanguage, defaultLanguageCode) : slide.description})]

  @@ -2901,6 +2902,17 @@ enctype="multipart/form-data" method="post"> + +
+
+ + + +
+ + +
+
+
+
+

[[${space.defaultName.exhibitionLanguageLabel}]]

+ + + + + + + + + +
+
+

Default

+ + + + + + + + + +
+ +
+
+

[[${title.exhibitionLanguageLabel}]]

+ + + + +
+ + + + + +
+
+
+
+
+
@@ -87,7 +177,9 @@

Add new Space

- +

+ +

diff --git a/vspace/src/main/webapp/WEB-INF/views/staff/spaces/edit.html b/vspace/src/main/webapp/WEB-INF/views/staff/spaces/edit.html index 5024388fc..9e51fd80a 100644 --- a/vspace/src/main/webapp/WEB-INF/views/staff/spaces/edit.html +++ b/vspace/src/main/webapp/WEB-INF/views/staff/spaces/edit.html @@ -1,5 +1,50 @@ + + + + + +

Edit Space: [(${spaceForm.name})]

@@ -7,21 +52,53 @@

Edit Space: [(${spaceForm.name})]

+ + + +
+
+ +
+ +
+
+
+
+ + + + + + + + + +
+ +
+
+ + + + +
+ + + + -
- - +
+
+
+
- -
- - -
- - - Cancel + + + +

+ + Cancel +

diff --git a/vspace/src/main/webapp/resources/extra/editElement.js b/vspace/src/main/webapp/resources/extra/editElement.js new file mode 100644 index 000000000..e7f359249 --- /dev/null +++ b/vspace/src/main/webapp/resources/extra/editElement.js @@ -0,0 +1,14 @@ +function openForm(evt, label) { + var i, tabcontent, tablinks; + tabcontent = document.getElementsByClassName("tabcontent"); + for (i = 0; i < tabcontent.length; i++) { + tabcontent[i].style.display = "none"; + } + tablinks = document.getElementsByClassName("tablinks"); + for (i = 0; i < tablinks.length; i++) { + tablinks[i].className = tablinks[i].className.replace(" active", ""); + } + document.getElementById(label).style.display = "block"; + evt.currentTarget.className += " active"; + evt.preventDefault(); +} \ No newline at end of file diff --git a/vspace/src/test/java/ExhibitionAboutPageFactoryTest.java b/vspace/src/test/java/ExhibitionAboutPageFactoryTest.java new file mode 100644 index 000000000..ae9f17581 --- /dev/null +++ b/vspace/src/test/java/ExhibitionAboutPageFactoryTest.java @@ -0,0 +1,75 @@ +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import edu.asu.diging.vspace.core.data.ExhibitionAboutPageRepository; +import edu.asu.diging.vspace.core.model.IExhibitionLanguage; +import edu.asu.diging.vspace.core.model.ILocalizedText; +import edu.asu.diging.vspace.core.model.impl.Exhibition; +import edu.asu.diging.vspace.core.model.impl.ExhibitionAboutPage; +import edu.asu.diging.vspace.core.model.impl.ExhibitionLanguage; +import edu.asu.diging.vspace.core.model.impl.LocalizedText; +import edu.asu.diging.vspace.core.services.IExhibitionManager; +import edu.asu.diging.vspace.core.services.impl.ExhibitionManager; +import edu.asu.diging.vspace.web.staff.forms.AboutPageForm; +import edu.asu.diging.vspace.web.staff.forms.factory.AboutPageFormFactory; +import edu.asu.diging.vspace.web.staff.forms.factory.LocalizedTextFormFactory; + +public class ExhibitionAboutPageFactoryTest { + + @InjectMocks + private AboutPageFormFactory serviceToTest; + + @Mock + private ExhibitionAboutPageRepository repo; + + @Mock + private IExhibitionManager exhibitionManager; + + @Mock + private LocalizedTextFormFactory localizedTextFormCreation; + + @Before + public void init() { + MockitoAnnotations.initMocks(this); + } + + @Test + public void test_createAboutPageForm_success() { + Exhibition exhibition = new Exhibition(); + List languageList = new ArrayList(); + ExhibitionLanguage language2 = new ExhibitionLanguage(); + + + language2.setLabel("English"); + languageList.add(language2); + exhibition.setLanguages(languageList); + + List exhibitionAboutPageList = new ArrayList(); + ExhibitionAboutPage exhbitionAboutPage = new ExhibitionAboutPage(); + LocalizedText locText1 = new LocalizedText(); + locText1.setId( "ID1"); + List titleList = new ArrayList(); + titleList.add(new LocalizedText(language2, "title1")); + List aboutTextList = new ArrayList(); + aboutTextList.add(new LocalizedText( language2, "about text")); + exhbitionAboutPage.setExhibitionTitles(titleList); + exhbitionAboutPage.setExhibitionTextDescriptions(aboutTextList); + exhibitionAboutPageList.add(exhbitionAboutPage); + + //when(repo.findAll()).thenReturn(exhibitionAboutPageList); + when(exhibitionManager.getStartExhibition()).thenReturn(exhibition); + AboutPageForm aboutPageForm = serviceToTest.createAboutPageForm(exhbitionAboutPage); + + assertEquals(aboutPageForm.getAboutPageTexts().size(), 1); + assertEquals(aboutPageForm.getTitles().size(), 1); + } +} diff --git a/vspace/src/test/java/edu/asu/diging/vspace/config/ExhibitionLanguageConfigTest.java b/vspace/src/test/java/edu/asu/diging/vspace/config/ExhibitionLanguageConfigTest.java index 2fa961f49..22dbb7642 100644 --- a/vspace/src/test/java/edu/asu/diging/vspace/config/ExhibitionLanguageConfigTest.java +++ b/vspace/src/test/java/edu/asu/diging/vspace/config/ExhibitionLanguageConfigTest.java @@ -76,10 +76,10 @@ public void test_init_withNullPropertySource() { @Test public void test_getExhibitionLanguageList_success() { Map map1 = new HashMap(); - map1.put("key1", "value1"); - + map1.put("key1", "value1"); Map map2 = new HashMap(); map2.put("key2", "value2"); + List languageList = Arrays.asList(map1, map2); serviceToTest.setExhibitionLanguageList(languageList); diff --git a/vspace/src/test/java/edu/asu/diging/vspace/core/factory/impl/SpaceFactoryTest.java b/vspace/src/test/java/edu/asu/diging/vspace/core/factory/impl/SpaceFactoryTest.java index 3f744902e..7fb8c018d 100644 --- a/vspace/src/test/java/edu/asu/diging/vspace/core/factory/impl/SpaceFactoryTest.java +++ b/vspace/src/test/java/edu/asu/diging/vspace/core/factory/impl/SpaceFactoryTest.java @@ -27,11 +27,11 @@ public void setUp() { @Test public void test_createSpace_success() { - SpaceForm form = mock(SpaceForm.class); + SpaceForm form = new SpaceForm(); String name = "Test Space"; String description = "This is a test Space"; - when(form.getName()).thenReturn(name); - when(form.getDescription()).thenReturn(description); + form.setName(name); + form.setDescription(description); ISpace space = spaceFactory.createSpace(form); assertEquals(name, space.getName()); diff --git a/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/ExhibitionAboutPageManagerTest.java b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/ExhibitionAboutPageManagerTest.java index d25573631..62a7a4de0 100644 --- a/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/ExhibitionAboutPageManagerTest.java +++ b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/ExhibitionAboutPageManagerTest.java @@ -1,31 +1,38 @@ package edu.asu.diging.vspace.core.services.impl; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import org.mockito.runners.MockitoJUnitRunner; import edu.asu.diging.vspace.core.data.ExhibitionAboutPageRepository; +import edu.asu.diging.vspace.core.data.ExhibitionLanguageRepository; +import edu.asu.diging.vspace.core.data.LocalizedTextRepository; import edu.asu.diging.vspace.core.model.IExhibition; import edu.asu.diging.vspace.core.model.impl.Exhibition; import edu.asu.diging.vspace.core.model.impl.ExhibitionAboutPage; +import edu.asu.diging.vspace.core.model.impl.LocalizedText; +import edu.asu.diging.vspace.web.staff.forms.AboutPageForm; +import edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm; /** * * @author Avirup Biswas * */ +@RunWith(MockitoJUnitRunner.class) public class ExhibitionAboutPageManagerTest { @Mock @@ -39,22 +46,55 @@ public class ExhibitionAboutPageManagerTest { @InjectMocks private ExhibitionAboutPageManager serviceToTest; + + @Mock + private LocalizedTextRepository localizedTextRepo; + + @Mock + private ExhibitionLanguageRepository exhibitionLanguageRepository; @Before - public void init() { + public void setup() { MockitoAnnotations.initMocks(this); } @Test public void test_store_success() { + List exhibitionAboutPageList = new ArrayList(); + + exhibitionAboutPageList.add(new ExhibitionAboutPage()); + + AboutPageForm aboutPageForm = new AboutPageForm(); + LocalizedTextForm aboutPageTitle = new LocalizedTextForm("title", "ID1", "langId", "English"); + LocalizedTextForm aboutPageText = new LocalizedTextForm( "about text","ID2", "langId", "English"); + List titleList = new ArrayList(); + titleList.add(aboutPageTitle); + List aboutTextList = new ArrayList(); + aboutTextList.add(aboutPageText); + + aboutPageForm.setTitles(titleList); + aboutPageForm.setAboutPageTexts(aboutTextList); + aboutPageForm.setDefaultTitle(aboutPageText); + aboutPageForm.setDefaultAboutPageText(aboutPageText); + when(repo.findAll()).thenReturn(exhibitionAboutPageList); + + LocalizedText locText1 = new LocalizedText(); + locText1.setId( "ID1"); + + LocalizedText locText2 = new LocalizedText(); + locText1.setId( "ID2"); + when(localizedTextRepo.findById("ID1") ).thenReturn(Optional.of(locText1)); + when(localizedTextRepo.findById("ID2") ).thenReturn(Optional.of(locText2)); + + ExhibitionAboutPage aboutPage = new ExhibitionAboutPage(); Exhibition exhibition = new Exhibition(); - aboutPage.setId("EXHABT000000001"); when(exhibitionManager.getStartExhibition()).thenReturn((IExhibition)exhibition); when(repo.save(aboutPage)).thenReturn(aboutPage); - ExhibitionAboutPage savedExhibAbtPage = serviceToTest.store(aboutPage); - assertNotNull(savedExhibAbtPage.getId()); - verify(repo).save(aboutPage); + + serviceToTest.store(aboutPageForm); + assertEquals(locText1.getText(), "title"); + assertEquals(locText2.getText(), "about text"); } @Test @@ -70,5 +110,40 @@ public void test_findAll_findNone() { List results = serviceToTest.findAll(); assertEquals(results.size(), 0); } + + @Test + public void test_store_failure() { + + Exhibition exhibition = new Exhibition(); + List exhibitionAboutPageList = new ArrayList(); + + exhibitionAboutPageList.add(new ExhibitionAboutPage()); + + AboutPageForm aboutPageForm = new AboutPageForm(); + List titleList = new ArrayList(); + LocalizedTextForm title = new LocalizedTextForm("title", "ID1", "langId", "English"); + titleList.add(title); + List aboutTextList = new ArrayList(); + + LocalizedText locText1 = new LocalizedText(); + locText1.setId( "ID1"); + LocalizedTextForm aboutPageTxt = new LocalizedTextForm( "about text","ID2", "langId", "English"); + aboutTextList.add(aboutPageTxt); + aboutPageForm.setTitles(titleList); + aboutPageForm.setAboutPageTexts(aboutTextList); + aboutPageForm.setDefaultTitle(title); + aboutPageForm.setDefaultAboutPageText(aboutPageTxt); + + when(exhibitionManager.getStartExhibition()).thenReturn((IExhibition)exhibition); + when(localizedTextRepo.findById("ID1") ).thenReturn(Optional.empty()); + when(localizedTextRepo.findById("ID2") ).thenReturn(Optional.empty()); + when(exhibitionLanguageRepository.findById("langId")).thenReturn(Optional.empty()); + //when(aboutPageForm.getDefaultTitle()).thenReturn(title); + when(repo.findAll()).thenReturn(exhibitionAboutPageList); + + serviceToTest.store(aboutPageForm); + assertEquals(locText1.getText(), null); + } + } diff --git a/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/ExhibitionManagerTest.java b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/ExhibitionManagerTest.java index 665f71ed7..7faaa1c54 100644 --- a/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/ExhibitionManagerTest.java +++ b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/ExhibitionManagerTest.java @@ -4,15 +4,19 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import org.hibernate.query.criteria.internal.predicate.IsEmptyPredicate; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -22,25 +26,37 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.beans.factory.annotation.Autowired; + +import com.mysql.cj.x.protobuf.MysqlxCrud.Collection; import edu.asu.diging.vspace.config.ExhibitionLanguageConfig; import edu.asu.diging.vspace.core.data.ExhibitionRepository; + +import edu.asu.diging.vspace.core.data.LocalizedTextRepository; +import edu.asu.diging.vspace.core.exception.ExhibitionLanguageDeletionException; import edu.asu.diging.vspace.core.data.ImageRepository; + import edu.asu.diging.vspace.core.exception.LanguageListConfigurationNotFoundException; import edu.asu.diging.vspace.core.factory.IImageFactory; import edu.asu.diging.vspace.core.factory.impl.ExhibitionFactory; import edu.asu.diging.vspace.core.file.IStorageEngine; import edu.asu.diging.vspace.core.model.IExhibition; +import edu.asu.diging.vspace.core.model.IExhibitionLanguage; +import edu.asu.diging.vspace.core.model.ILocalizedText; import edu.asu.diging.vspace.core.model.impl.Exhibition; import edu.asu.diging.vspace.core.model.impl.ExhibitionLanguage; +import edu.asu.diging.vspace.core.model.impl.LocalizedText; import edu.asu.diging.vspace.core.services.IImageService; - @RunWith(MockitoJUnitRunner.class) public class ExhibitionManagerTest { @Mock private ExhibitionRepository exhibitRepo; + + @Mock + private LocalizedTextRepository localizedTextRepo; @Mock private IStorageEngine storage; @@ -60,10 +76,9 @@ public class ExhibitionManagerTest { @Mock private ExhibitionFactory exhibitFactory; - @InjectMocks private ExhibitionManager serviceToTest; - + @Before public void init() { MockitoAnnotations.initMocks(this); @@ -124,7 +139,7 @@ public void test_getStartExhibition_success() { } @Test - public void test_updateExhibitionLanguages_success() { + public void test_updateExhibitionLanguages_success() throws ExhibitionLanguageDeletionException { Exhibition exhibition = new Exhibition(); List languages = new ArrayList(); @@ -145,11 +160,10 @@ public void test_updateExhibitionLanguages_success() { when(exhibitionLanguageConfig.getExhibitionLanguageList()).thenReturn(mappedLanguages); serviceToTest.updateExhibitionLanguages(exhibition, languages, null); assertEquals(exhibition.getLanguages().size(), 2); - } @Test - public void test_updateExhibitionLanguages_duplicates() { + public void test_updateExhibitionLanguages_duplicates() throws ExhibitionLanguageDeletionException { Exhibition exhibition = new Exhibition(); // Exhibition already consists of 2 languages @@ -184,7 +198,7 @@ public void test_updateExhibitionLanguages_duplicates() { } @Test - public void test_updateExhibitionLanguages_whenCodeIsNotPresentInConfig() { + public void test_updateExhibitionLanguages_whenCodeIsNotPresentInConfig() throws ExhibitionLanguageDeletionException { Exhibition exhibition = new Exhibition(); List languages = new ArrayList(); @@ -204,11 +218,10 @@ public void test_updateExhibitionLanguages_whenCodeIsNotPresentInConfig() { when(exhibitionLanguageConfig.getExhibitionLanguageList()).thenReturn(mappedLanguages); serviceToTest.updateExhibitionLanguages(exhibition, languages, null); assertEquals(exhibition.getLanguages().size(), 1); - } @Test - public void test_updateExhibitionLanguages_defaultLanguage() { + public void test_updateExhibitionLanguages_defaultLanguage() throws ExhibitionLanguageDeletionException { Exhibition exhibition = new Exhibition(); List languages = new ArrayList(); @@ -225,6 +238,7 @@ public void test_updateExhibitionLanguages_defaultLanguage() { mappedLanguages.add(language1); mappedLanguages.add(language2); when(exhibitionLanguageConfig.getExhibitionLanguageList()).thenReturn(mappedLanguages); + serviceToTest.updateExhibitionLanguages(exhibition, languages, "en"); assertEquals(exhibition.getLanguages().size(), 2); exhibition.getLanguages().forEach(language -> { @@ -262,7 +276,7 @@ public void test_updateExhibitionLanguages_whenLanguageListConfigurationNotFound } @Test - public void test_updateExhibitionLanguages_whenLanguageIsUnselected() { + public void test_updateExhibitionLanguages_whenLanguageIsUnselected() throws ExhibitionLanguageDeletionException { Exhibition exhibition = new Exhibition(); List mappedLanguages = new ArrayList(); @@ -275,6 +289,18 @@ public void test_updateExhibitionLanguages_whenLanguageIsUnselected() { language2.put("label", "Afar"); mappedLanguages.add(language1); mappedLanguages.add(language2); + + ExhibitionLanguage languageObj = new ExhibitionLanguage(); + languageObj.setLabel("English"); + languageObj.setCode("en"); + + ExhibitionLanguage languageObj2 = new ExhibitionLanguage(); + languageObj2.setLabel("Afar"); + languageObj2.setCode("aa"); + + List exhibitionLanguages= new ArrayList(); + exhibitionLanguages.add(languageObj); + exhibitionLanguages.add(languageObj2); List languages = new ArrayList(); languages.add("en"); @@ -286,8 +312,60 @@ public void test_updateExhibitionLanguages_whenLanguageIsUnselected() { assertEquals(exhibition.getLanguages().size(), 2); languages.remove("en"); + exhibitionLanguages.remove(languageObj); + when(localizedTextRepo.findByExhibitionLanguage(languageObj)).thenReturn(Collections.emptyList()); + serviceToTest.updateExhibitionLanguages(exhibition, languages, "aa"); - assertEquals(exhibition.getLanguages().size(), 1); - + assertEquals(exhibition.getLanguages().size(),1); } + + @Test + public void test_updateExhibitionLanguages_whenLanguageCouldNotBeDeleted() throws ExhibitionLanguageDeletionException { + Exhibition exhibition = new Exhibition(); + + List mappedLanguages= new ArrayList(); + + Map language1 = new LinkedHashMap(); + language1.put("code", "en"); + language1.put("label", "English"); + Map language2 = new LinkedHashMap(); + language2.put("code", "aa"); + language2.put("label", "Afar"); + mappedLanguages.add(language1); + mappedLanguages.add(language2); + + + List languages= new ArrayList() ; + languages.add("en"); + languages.add("aa"); + + ExhibitionLanguage languageObj = new ExhibitionLanguage(); + languageObj.setLabel("English"); + languageObj.setCode("en"); + + ExhibitionLanguage languageObj2 = new ExhibitionLanguage(); + languageObj2.setLabel("Afar"); + languageObj2.setCode("aa"); + + List exhibitionLanguages= new ArrayList(); + exhibitionLanguages.add(languageObj); + exhibitionLanguages.add(languageObj2); + + LocalizedText localizedText = new LocalizedText(); + localizedText.setExhibitionLanguage(languageObj); + localizedText.setId("LT_01"); + localizedText.setText("Text"); + List localizedTextList = new ArrayList(); + localizedTextList.add(localizedText); + + when(exhibitionLanguageConfig.getExhibitionLanguageList()).thenReturn(mappedLanguages); + serviceToTest.updateExhibitionLanguages(exhibition, languages, "aa"); + assertEquals(exhibition.getLanguages().size(), 2); + + languages.remove("en"); + when(localizedTextRepo.findByExhibitionLanguage(Mockito.any(ExhibitionLanguage.class))).thenReturn(localizedTextList); + Assert.assertThrows(ExhibitionLanguageDeletionException.class, + () -> serviceToTest.updateExhibitionLanguages(exhibition, languages, "aa")); + } } + diff --git a/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SlideFormFactoryTest.java b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SlideFormFactoryTest.java new file mode 100644 index 000000000..2b48d51b2 --- /dev/null +++ b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SlideFormFactoryTest.java @@ -0,0 +1,84 @@ +package edu.asu.diging.vspace.core.services.impl; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import edu.asu.diging.vspace.core.data.SlideRepository; +import edu.asu.diging.vspace.core.factory.impl.ModuleFactory; +import edu.asu.diging.vspace.core.factory.impl.SlideFactory; +import edu.asu.diging.vspace.core.model.IExhibitionLanguage; +import edu.asu.diging.vspace.core.model.ILocalizedText; +import edu.asu.diging.vspace.core.model.IModule; +import edu.asu.diging.vspace.core.model.ISlide; +import edu.asu.diging.vspace.core.model.display.SlideType; +import edu.asu.diging.vspace.core.model.impl.Exhibition; +import edu.asu.diging.vspace.core.model.impl.ExhibitionLanguage; +import edu.asu.diging.vspace.core.model.impl.LocalizedText; +import edu.asu.diging.vspace.core.model.impl.Module; +import edu.asu.diging.vspace.core.model.impl.Slide; +import edu.asu.diging.vspace.web.staff.forms.SlideForm; +import edu.asu.diging.vspace.web.staff.forms.factory.LocalizedTextFormFactory; +import edu.asu.diging.vspace.web.staff.forms.factory.SlideFormFactory; + +public class SlideFormFactoryTest { + + @Mock + private SlideRepository slideRepo; + + @Mock + private ExhibitionManager exhibitionManager; + + @InjectMocks + private SlideFormFactory serviceToTest; + + @Mock + private ModuleFactory moduleFactory; + + @Mock + private LocalizedTextFormFactory localizedTextFormCreation; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); // Initialize annotated mocks + } + + @Test + public void test_createNewSlideForm_success() { + Exhibition exhibition = new Exhibition(); + List languageList = new ArrayList(); + ExhibitionLanguage language2 = new ExhibitionLanguage(); + + language2.setLabel("English"); + languageList.add(language2); + exhibition.setLanguages(languageList); + + List slidePageList = new ArrayList<>(); + Slide slidePage = new Slide(); + LocalizedText locText1 = new LocalizedText(); + locText1.setId( "ID1"); + List titleList = new ArrayList(); + titleList.add(new LocalizedText(language2, "title1")); + List slideTextList = new ArrayList(); + slideTextList.add(new LocalizedText( language2, "slide text")); + slidePage.setSlideNames(titleList); + slidePage.setSlideDescriptions(slideTextList); + slidePageList.add(slidePage); + + when(slideRepo.findAll()).thenReturn(slidePageList); + when(exhibitionManager.getStartExhibition()).thenReturn(exhibition); + SlideForm slideForm = serviceToTest.createNewSlideForm(slidePage, exhibition); + + assertEquals(slideForm.getDescriptions().size(), 1); + assertEquals(slideForm.getNames().size(), 1); + } + +} \ No newline at end of file diff --git a/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SlideManagerTest.java b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SlideManagerTest.java index 6ffb0da77..04297b9c3 100644 --- a/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SlideManagerTest.java +++ b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SlideManagerTest.java @@ -1,5 +1,9 @@ package edu.asu.diging.vspace.core.services.impl; +import static org.junit.Assert.assertEquals; + +import static org.mockito.Mockito.when; + import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -11,13 +15,23 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; - +import edu.asu.diging.vspace.core.data.ExhibitionLanguageRepository; +import edu.asu.diging.vspace.core.data.LocalizedTextRepository; import edu.asu.diging.vspace.core.data.SequenceRepository; import edu.asu.diging.vspace.core.data.SlideRepository; import edu.asu.diging.vspace.core.exception.SlideDoesNotExistException; +import edu.asu.diging.vspace.core.factory.impl.SlideFactory; +import edu.asu.diging.vspace.core.model.IExhibition; +import edu.asu.diging.vspace.core.model.IModule; import edu.asu.diging.vspace.core.model.ISlide; +import edu.asu.diging.vspace.core.model.display.SlideType; +import edu.asu.diging.vspace.core.model.impl.Exhibition; +import edu.asu.diging.vspace.core.model.impl.LocalizedText; import edu.asu.diging.vspace.core.model.impl.Sequence; import edu.asu.diging.vspace.core.model.impl.Slide; +import edu.asu.diging.vspace.core.services.IModuleManager; +import edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm; +import edu.asu.diging.vspace.web.staff.forms.SlideForm; public class SlideManagerTest { @@ -26,9 +40,25 @@ public class SlideManagerTest { @Mock private SlideRepository slideRepo; + + @Mock + private IModuleManager moduleManager; + + @Mock + private ExhibitionManager exhibitionManager; + + @Mock + private SlideFactory slideFactory; + @InjectMocks private SlideManager slideManagerToTest = new SlideManager(); + + @Mock + private LocalizedTextRepository localizedRextRepo; + + @Mock + private ExhibitionLanguageRepository exhibitionLanguageRepository; // setting common used variables and Objects private String slideId, slideIdNotPresent, slideIdOther, moduleId, sequenceId, slideIdNotInSequence, sequenceIdOther; @@ -157,4 +187,76 @@ public void test_deleteSlideById_slideIdPresentManySequences() throws SlideDoesN } + + @Test + public void test_createSlide_success() { + List slidePageList = new ArrayList(); + + slidePageList.add(new Slide()); + + SlideForm slideForm = new SlideForm(); + List titleList = new ArrayList(); + titleList.add(new LocalizedTextForm("title", "ID1", "langId", "English")); + List slideTextList = new ArrayList(); + + slideTextList.add(new LocalizedTextForm( "slide text","ID2", "langId", "English")); + + + slideForm.setNames(titleList); + slideForm.setDescriptions(slideTextList); + slideForm.setType("Slide"); + when(slideRepo.findAll()).thenReturn(slidePageList); + + LocalizedText locText1 = new LocalizedText(); + locText1.setId( "ID1"); + locText1.setText("Title1"); + + LocalizedText locText2 = new LocalizedText(); + locText2.setId( "ID2"); + locText2.setText("Title2"); + when(localizedRextRepo.findById("ID1") ).thenReturn(Optional.of(locText1)); + when(localizedRextRepo.findById("ID2") ).thenReturn(Optional.of(locText2)); + + Slide slide = new Slide(); + Exhibition exhibition = new Exhibition(); + when(exhibitionManager.getStartExhibition()).thenReturn((IExhibition)exhibition); + when(slideRepo.save(slide)).thenReturn(slide); + assertEquals(locText1.getText(), "Title1"); + assertEquals(locText2.getText(), "Title2"); + } + + @Test + public void test_createSlide_failure() { + List slidePageList = new ArrayList(); + + slidePageList.add(new Slide()); + + SlideForm slideForm = new SlideForm(); + List titleList = new ArrayList(); + titleList.add(new LocalizedTextForm("title", "ID1", "langId", "English")); + List slideTextList = new ArrayList(); + + slideTextList.add(new LocalizedTextForm( "slide text","ID2", "langId", "English")); + + slideForm.setNames(titleList); + slideForm.setDescriptions(slideTextList); + slideForm.setType("SLIDE"); + when(slideRepo.findAll()).thenReturn(slidePageList); + + LocalizedText locText1 = new LocalizedText(); + locText1.setId( "ID1"); + Exhibition exhibition = new Exhibition(); + when(exhibitionManager.getStartExhibition()).thenReturn((IExhibition)exhibition); + + + when(localizedRextRepo.findById("ID1") ).thenReturn(Optional.empty()); + when(localizedRextRepo.findById("ID2") ).thenReturn(Optional.empty()); + IModule module = moduleManager.getModule(moduleId); + SlideType type = slideForm.getType().isEmpty() ? null : SlideType.valueOf(slideForm.getType()); + + when(exhibitionLanguageRepository.findById("langId")).thenReturn(Optional.empty()); + slideManagerToTest.createSlide(module, slideForm, type); + assertEquals(locText1.getText(), null); + } + } diff --git a/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SpaceFactoryTest.java b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SpaceFactoryTest.java new file mode 100644 index 000000000..f8cb454fb --- /dev/null +++ b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SpaceFactoryTest.java @@ -0,0 +1,75 @@ +package edu.asu.diging.vspace.core.services.impl; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import edu.asu.diging.vspace.core.data.SpaceRepository; +import edu.asu.diging.vspace.core.factory.impl.SpaceFactory; +import edu.asu.diging.vspace.core.model.IExhibitionLanguage; +import edu.asu.diging.vspace.core.model.ILocalizedText; +import edu.asu.diging.vspace.core.model.impl.Exhibition; +import edu.asu.diging.vspace.core.model.impl.ExhibitionLanguage; +import edu.asu.diging.vspace.core.model.impl.LocalizedText; +import edu.asu.diging.vspace.core.model.impl.Space; +import edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm; +import edu.asu.diging.vspace.web.staff.forms.SpaceForm; +import edu.asu.diging.vspace.web.staff.forms.factory.LocalizedTextFormFactory; +import edu.asu.diging.vspace.web.staff.forms.factory.SpaceFormFactory; + +public class SpaceFactoryTest { + + @Mock + private SpaceRepository spaceRepo; + + @Mock + private ExhibitionManager exhibitionManager; + + @InjectMocks + private SpaceFormFactory serviceToTest; + + @Mock + private LocalizedTextFormFactory localizedTextFormCreation; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); // Initialize annotated mocks + } + + @Test + public void test_createNewSpaceForm_success() { + Exhibition exhibition = new Exhibition(); + List languageList = new ArrayList(); + ExhibitionLanguage language2 = new ExhibitionLanguage(); + language2.setLabel("English"); + languageList.add(language2); + exhibition.setLanguages(languageList); + List spacePageList = new ArrayList(); + Space spacePage = new Space(); + LocalizedText locText1 = new LocalizedText(); + locText1.setId( "ID1"); + List titleList = new ArrayList(); + titleList.add(new LocalizedText(language2, "title1")); + List spaceTextList = new ArrayList(); + spaceTextList.add(new LocalizedText( language2, "space text")); + spacePage.setSpaceNames(titleList); + spacePage.setSpaceDescriptions(spaceTextList); + spacePageList.add(spacePage); + + when(spaceRepo.findAll()).thenReturn(spacePageList); + when(exhibitionManager.getStartExhibition()).thenReturn(exhibition); + SpaceForm spaceForm = serviceToTest.createNewSpaceForm(spacePage, exhibitionManager.getStartExhibition()); + + assertEquals(spaceForm.getDescriptions().size(), 1); + assertEquals(spaceForm.getNames().size(), 1); + } + +} diff --git a/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SpaceManagerTest.java b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SpaceManagerTest.java index 671fa628f..7d8c8ded1 100644 --- a/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SpaceManagerTest.java +++ b/vspace/src/test/java/edu/asu/diging/vspace/core/services/impl/SpaceManagerTest.java @@ -1,5 +1,9 @@ package edu.asu.diging.vspace.core.services.impl; +import static org.junit.Assert.assertEquals; + +import static org.mockito.Mockito.when; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -13,7 +17,9 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import edu.asu.diging.vspace.core.data.ExhibitionLanguageRepository; import edu.asu.diging.vspace.core.data.ImageRepository; +import edu.asu.diging.vspace.core.data.LocalizedTextRepository; import edu.asu.diging.vspace.core.data.SpaceLinkRepository; import edu.asu.diging.vspace.core.data.SpaceRepository; import edu.asu.diging.vspace.core.data.display.SpaceDisplayRepository; @@ -22,19 +28,25 @@ import edu.asu.diging.vspace.core.exception.SpaceDoesNotExistException; import edu.asu.diging.vspace.core.factory.IImageFactory; import edu.asu.diging.vspace.core.factory.ISpaceDisplayFactory; +import edu.asu.diging.vspace.core.factory.ISpaceFactory; import edu.asu.diging.vspace.core.factory.ISpaceLinkDisplayFactory; import edu.asu.diging.vspace.core.factory.ISpaceLinkFactory; import edu.asu.diging.vspace.core.file.IStorageEngine; +import edu.asu.diging.vspace.core.model.IExhibition; import edu.asu.diging.vspace.core.model.ISpace; import edu.asu.diging.vspace.core.model.IVSImage; import edu.asu.diging.vspace.core.model.display.ISpaceDisplay; import edu.asu.diging.vspace.core.model.display.impl.SpaceDisplay; +import edu.asu.diging.vspace.core.model.impl.Exhibition; +import edu.asu.diging.vspace.core.model.impl.LocalizedText; import edu.asu.diging.vspace.core.model.impl.Space; import edu.asu.diging.vspace.core.model.impl.SpaceLink; import edu.asu.diging.vspace.core.model.impl.SpaceStatus; import edu.asu.diging.vspace.core.model.impl.VSImage; import edu.asu.diging.vspace.core.services.IImageService; import edu.asu.diging.vspace.core.services.impl.model.ImageData; +import edu.asu.diging.vspace.web.staff.forms.LocalizedTextForm; +import edu.asu.diging.vspace.web.staff.forms.SpaceForm; public class SpaceManagerTest { @@ -70,10 +82,21 @@ public class SpaceManagerTest { @Mock private ISpaceDisplayFactory spaceDisplayFactory; + + @Mock + private ISpaceFactory spaceFactory; @Mock private ExhibitionManager exhibitionManager; - + + @Mock + private ExhibitionLanguageRepository exhibitionLanguageRepo; + + @Mock + private LocalizedTextRepository localizedRextRepo; + + @Mock + private ExhibitionLanguageRepository exhibitionLanguageRepository; @InjectMocks private SpaceManager managerToTest;