diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/InfoBoxCallbackListener.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/InfoBoxCallbackListener.java index 440453f98c31f6d1024b5a69537c3084ed6da3c6..799af461dac74fbf559d9dd066516845733f47a5 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/InfoBoxCallbackListener.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/InfoBoxCallbackListener.java @@ -42,6 +42,6 @@ public class InfoBoxCallbackListener<T> extends CallbackListenerAdapter<T> final AbstractAsyncCallback<T> callback, final String failureMessage, final Throwable throwable) { - infoBox.displayError(failureMessage); + infoBox.displayError(failureMessage.replace("\n", "<br>")); } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBO.java index bd0d4c4959e5f41664352b829577baae65110d85..9d31ce62d4af8a9657e5999bd399eed40ee2ad45 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBO.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.Set; import org.springframework.dao.DataAccessException; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DataRetrievalFailureException; import ch.systemsx.cisd.common.collections.IKeyExtractor; @@ -55,6 +56,7 @@ import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils; */ public class VocabularyBO extends AbstractBusinessObject implements IVocabularyBO { + private static final int MAX_NUMBER_OF_INVAID_TERMS_IN_ERROR_MESSAGE = 10; private VocabularyPE vocabularyPE; public VocabularyBO(final IDAOFactory daoFactory, final Session session) @@ -209,9 +211,32 @@ public class VocabularyBO extends AbstractBusinessObject implements IVocabularyB assert vocabularyPE != null : "Unspecified vocabulary"; try { + StringBuilder builder = new StringBuilder(); + int numberOfInvalidTerms = 0; for (VocabularyTermPE term : vocabularyPE.getTerms()) { - getVocabularyTermDAO().validate(term); + try + { + getVocabularyTermDAO().validate(term); + } catch (DataIntegrityViolationException ex) + { + numberOfInvalidTerms++; + if (numberOfInvalidTerms <= MAX_NUMBER_OF_INVAID_TERMS_IN_ERROR_MESSAGE) + { + builder.append('\n').append(ex.getMessage()); + } + } + } + if (builder.length() > 0) + { + builder.insert(0, "Invalid terms:"); + int additionalTerms = numberOfInvalidTerms - MAX_NUMBER_OF_INVAID_TERMS_IN_ERROR_MESSAGE; + if (additionalTerms > 0) + { + builder.append("\n").append("and ").append(additionalTerms); + builder.append(" more invalid terms."); + } + throw new UserFailureException("Invalid terms:" + builder); } getVocabularyDAO().createOrUpdateVocabulary(vocabularyPE); } catch (final DataAccessException e) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/VocabularyPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/VocabularyPE.java index 8e1cc5e887b1b6bea645767ab79755d0d9f49cf6..80912fcdd83f701b9878ab15c7bc304d75cf5331 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/VocabularyPE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/VocabularyPE.java @@ -19,7 +19,7 @@ package ch.systemsx.cisd.openbis.generic.shared.dto; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -79,7 +79,7 @@ public class VocabularyPE extends HibernateAbstractRegistrationHolder implements private String description; - private Set<VocabularyTermPE> terms = new HashSet<VocabularyTermPE>(); + private Set<VocabularyTermPE> terms = new LinkedHashSet<VocabularyTermPE>(); private boolean managedInternally; diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBOTest.java index bcc3194dcd155b4e4add97816ef77e2d4009d29f..39e71f14e95abc43bc740d33b564628f3e62ad2c 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBOTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBOTest.java @@ -206,7 +206,7 @@ public final class VocabularyBOTest extends AbstractBOTest one(daoFactory).getHomeDatabaseInstance(); will(returnValue(ManagerTestTool.EXAMPLE_DATABASE_INSTANCE)); - one(vocabularyTermDAO).validate(with(aNonNull(VocabularyTermPE.class))); + exactly(3).of(vocabularyTermDAO).validate(with(aNonNull(VocabularyTermPE.class))); will(throwException(new DataIntegrityViolationException(null))); } });