Bugfixes for create and edit steps of person asset.

pull/10/head
Jens Pelzetter 2021-06-01 21:14:40 +02:00
parent 07af86a955
commit b46634f5ec
9 changed files with 230 additions and 194 deletions

View File

@ -18,6 +18,7 @@
*/ */
package org.librecms.ui.contentsections.assets; package org.librecms.ui.contentsections.assets;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
@ -34,6 +35,7 @@ public class CmsAssetEditSteps implements MvcAssetEditSteps {
classes.add(BookmarkEditStep.class); classes.add(BookmarkEditStep.class);
classes.add(FileAssetEditStep.class); classes.add(FileAssetEditStep.class);
classes.add(LegalMetadataEditStep.class); classes.add(LegalMetadataEditStep.class);
classes.add(PersonEditStep.class);
classes.add(PostalAddressEditStep.class); classes.add(PostalAddressEditStep.class);
classes.add(SideNoteEditStep.class); classes.add(SideNoteEditStep.class);

View File

@ -27,8 +27,10 @@ import org.librecms.contentsection.AssetRepository;
import org.librecms.ui.contentsections.AssetPermissionsChecker; import org.librecms.ui.contentsections.AssetPermissionsChecker;
import org.librecms.ui.contentsections.ContentSectionNotFoundException; import org.librecms.ui.contentsections.ContentSectionNotFoundException;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle; import java.time.format.FormatStyle;
import java.util.Optional;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; import javax.inject.Inject;
@ -92,10 +94,17 @@ public class PersonEditStep extends AbstractContactableEntityEditStep {
if (getAsset() instanceof Person) { if (getAsset() instanceof Person) {
editStepModel.setBirthdate( editStepModel.setBirthdate(
DateTimeFormatter Optional
.ofLocalizedDate(FormatStyle.SHORT) .ofNullable(getPerson().getBirthdate())
.withLocale(globalizationHelper.getNegotiatedLocale()) .map(
.format(getPerson().getBirthdate()) birthdate -> birthdate.format(
DateTimeFormatter
.ofLocalizedDate(FormatStyle.SHORT)
.withLocale(
globalizationHelper.getNegotiatedLocale()
)
.withZone(ZoneId.systemDefault())))
.orElse("")
); );
editStepModel.setPersonNames(getPerson().getPersonNames()); editStepModel.setPersonNames(getPerson().getPersonNames());
} else { } else {

View File

@ -40,10 +40,10 @@
</cc:interface> </cc:interface>
<cc:implementation> <cc:implementation>
<div class="ccm-cms-asset-picker" <!-- <div class="ccm-cms-asset-picker"
data-assettype="#{cc.attrs.assetType}" data-assettype="#{cc.attrs.assetType}"
data-contentsection="#{cc.attrs.contentSection}"> data-contentsection="#{cc.attrs.contentSection}">-->
<div aria-hidden="true" <!-- <div aria-hidden="true"
aria-labelledby="#{cc.attrs.assetPickerId}-dialog-title" aria-labelledby="#{cc.attrs.assetPickerId}-dialog-title"
class="modal fade" class="modal fade"
id="#{cc.attrs.assetPickerId}-dialog" id="#{cc.attrs.assetPickerId}-dialog"
@ -126,18 +126,18 @@
</tbody> </tbody>
</table> </table>
</form> </form>
<div class="modal-footer"> <div class="modal-footer">
<button class="btn btn-warning" <button class="btn btn-warning"
data-dismiss="modal" data-dismiss="modal"
type="button"> type="button">
#{CmsAssetsStepsDefaultMessagesBundle['assetpicker.close']} #{CmsAssetsStepsDefaultMessagesBundle['assetpicker.close']}
</button> </button>
</div>
</div> </div>
</div> </div>
</div> </div>-->
</div> <!--</div>-->
</div>
</cc:implementation> </cc:implementation>

View File

@ -70,6 +70,7 @@
</form> </form>
</div> </div>
</div> </div>
<table> <table>
<thead> <thead>
<tr> <tr>
@ -198,7 +199,7 @@
</c:forEach> </c:forEach>
</tbody> </tbody>
</table> </table>
<h3>#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.title']}</h3> <h3>#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.title']}</h3>
<librecms:assetPicker <librecms:assetPicker
@ -210,15 +211,15 @@
/> />
<c:choose> <c:choose>
<c:when test="#{CmsContactableEditStepModel.postalAddress == null}"> <c:when test="#{CmsContactableEditStepModel.postalAddress == null}">
<div class="text-right"> <!-- <div class="text-right">
<librecms:assetPickerButton <librecms:assetPickerButton
assetPickerId="postaladdress-picker" assetPickerId="postaladdress-picker"
/> />
</div> </div>
<p>#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.none']}</p> <p>#{CmsAssetsStepsDefaultMessagesBundle['contactable.postaladdress.none']}</p>-->
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<div class="text-right"> <!-- <div class="text-right">
<librecms:assetPickerButton <librecms:assetPickerButton
assetPickerId="postaladdress-picker" assetPickerId="postaladdress-picker"
/> />
@ -295,7 +296,7 @@
<dd>#{CmsContactableEditStepModel.postalAddressCountry}) (#{CmsContactableEditStepModel.postalAddress.isoCountryCode})</dd> <dd>#{CmsContactableEditStepModel.postalAddressCountry}) (#{CmsContactableEditStepModel.postalAddress.isoCountryCode})</dd>
</div> </div>
</dl> </dl>-->
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>

View File

@ -10,14 +10,14 @@
<div class="container"> <div class="container">
<h1>#{CmsAssetsStepsDefaultMessagesBundle["person.createform.title"]}</h1> <h1>#{CmsAssetsStepsDefaultMessagesBundle["person.createform.title"]}</h1>
<c:forEach items="#{CmsBookmarkCreateStep.messages.entrySet()}" <c:forEach items="#{CmsPersonCreateStep.messages.entrySet()}"
var="message"> var="message">
<div class="alert alert-#{message.key}" role="alert"> <div class="alert alert-#{message.key}" role="alert">
#{message.value} #{message.value}
</div> </div>
</c:forEach> </c:forEach>
<form action="#{mvc.basePath}/#{CmsPersonCreateStep.contentSectionLabel}/assets/#{CmsPersonCreateStep.folderPath}@create/#{CmsPersonCreateStep.assetType}" <form action="#{mvc.basePath}/#{ContentSectionModel.sectionName}/assets/#{CmsPersonCreateStep.folderPath}@create/#{CmsPersonCreateStep.assetType}"
method="post"> method="post">
<bootstrap:formGroupText <bootstrap:formGroupText
help="#{CmsAssetsStepsDefaultMessagesBundle['createform.name.help']}" help="#{CmsAssetsStepsDefaultMessagesBundle['createform.name.help']}"
@ -26,7 +26,7 @@
name="name" name="name"
pattern="^([a-zA-Z0-9_-]*)$" pattern="^([a-zA-Z0-9_-]*)$"
required="true" required="true"
value="#{CmsBookmarkCreateStep.name}" value="#{CmsPersonCreateStep.name}"
/> />
<bootstrap:formGroupSelect <bootstrap:formGroupSelect
@ -34,9 +34,9 @@
inputId="locale" inputId="locale"
label="#{CmsAssetsStepsDefaultMessagesBundle['createform.initial_locale.label']}" label="#{CmsAssetsStepsDefaultMessagesBundle['createform.initial_locale.label']}"
name="locale" name="locale"
options="#{CmsBookmarkCreateStep.availableLocales}" options="#{CmsPersonCreateStep.availableLocales}"
required="true" required="true"
selectedOptions="#{[CmsBookmarkCreateStep.initialLocale]}" selectedOptions="#{[CmsPersonCreateStep.initialLocale]}"
/> />
<bootstrap:formGroupText <bootstrap:formGroupText
@ -48,7 +48,7 @@
/> />
<a class="btn btn-warning" <a class="btn btn-warning"
href="#{mvc.basePath}/#{CmsBookmarkCreateStep.contentSectionLabel}/assetfolders/#{CmsBookmarkCreateStep.folderPath}"> href="#{mvc.basePath}/#{ContentSectionModel.sectionName}/assetfolders/#{CmPersonCreateStep.folderPath}">
#{CmsAssetsStepsDefaultMessagesBundle['createform.cancel']} #{CmsAssetsStepsDefaultMessagesBundle['createform.cancel']}
</a> </a>
<button class="btn btn-success" <button class="btn btn-success"

View File

@ -85,167 +85,176 @@
</form> </form>
</div> </div>
</div> </div>
<table> <c:choose>
<thead> <c:when test="#{CmsPersonEditStepModel.personNames.isEmpty()}">
<tr> <p>
<th>#{CmsAssetsStepsDefaultMessagesBundle['person.personnames.col.prefix']}</th> #{CmsAssetStepsDefaultStepsMessageBundle['person.personnames.none']}
<th>#{CmsAssetsStepsDefaultMessagesBundle['person.personnames.col.surname']}</th> </p>
<th>#{CmsAssetsStepsDefaultMessagesBundle['person.personnames.col.givenname']}</th> </c:when>
<th>#{CmsAssetsStepsDefaultMessagesBundle['person.personnames.col.suffix']}</th> <c:otherwise>
<th>#{CmsAssetsStepsDefaultMessagesBundle['person.personnames.col.actions']}</th> <table>
</tr> <thead>
</thead> <tr>
<tbody> <th>#{CmsAssetsStepsDefaultMessagesBundle['person.personname.prefix.label']}</th>
<c:forEach items="#{CmsPersonEditStepModel.personNames}" <th>#{CmsAssetsStepsDefaultMessagesBundle['person.personname.surname.label']}</th>
var="personName"> <th>#{CmsAssetsStepsDefaultMessagesBundle['person.personname.givenname.label']}</th>
<tr> <th>#{CmsAssetsStepsDefaultMessagesBundle['person.personname.suffix.label']}</th>
<td>#{personName.prefix}</td> <th>#{CmsAssetsStepsDefaultMessagesBundle['person.personnames.col.actions']}</th>
<td>#{personName.surname}</td> </tr>
<td>#{personName.givenName}</td> </thead>
<td>#{personName.suffix}</td> <tbody>
<td> <c:forEach items="#{CmsPersonEditStepModel.personNames}"
<button class="btn btn-primary" var="personName">
data-toggle="modal" <tr>
data-target="#personname-edit-dialog-#{personName.hashCode()}" <td>#{personName.prefix}</td>
type="button"> <td>#{personName.surname}</td>
<bootstrap:svgIcon icon="pen" /> <td>#{personName.givenName}</td>
<span class="sr-only">#{CmsAssetsStepsDefaultMessagesBundle['person.personname.edit']}</span> <td>#{personName.suffix}</td>
</button> <td>
<div aria-hidden="true" <button class="btn btn-primary"
aria-lablledby="personname-edit-dialog-#{personName.hashCode()}-title" data-toggle="modal"
class="modal fade" data-target="#personname-edit-dialog-#{personName.hashCode()}"
id="personname-edit-dialog-#{personName.hashCode()}" type="button">
tabindex="-1"> <bootstrap:svgIcon icon="pen" />
<div class="modal-dialog"> <span class="sr-only">#{CmsAssetsStepsDefaultMessagesBundle['person.personname.edit']}</span>
<form action="#{mvc.basePath}/#{ContentSectionModel.sectionName}/asset/#{CmsSelectedAssetModel.assetPath}/@person-edit/personnames/@edit" </button>
class="modal-content" <div aria-hidden="true"
method="post"> aria-lablledby="personname-edit-dialog-#{personName.hashCode()}-title"
<div class="modal-header"> class="modal fade"
<h4 id="personname-edit-dialog-#{personName.hashCode()}-title"> id="personname-edit-dialog-#{personName.hashCode()}"
#{CmsAssetsStepsDefaultMessagesBundle['person.personname.edit.dialog.title']} tabindex="-1">
</h4> <div class="modal-dialog">
<button <form action="#{mvc.basePath}/#{ContentSectionModel.sectionName}/asset/#{CmsSelectedAssetModel.assetPath}/@person-edit/personnames/@edit"
aria-label="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.edit.dialog.close']}" class="modal-content"
class="close" method="post">
data-dismiss="modal" <div class="modal-header">
type="button"> <h4 id="personname-edit-dialog-#{personName.hashCode()}-title">
<bootstrap:svgIcon icon="x" /> #{CmsAssetsStepsDefaultMessagesBundle['person.personname.edit.dialog.title']}
</button> </h4>
</div> <button
<div class="modal-body"> aria-label="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.edit.dialog.close']}"
<bootstrap:formGroupText class="close"
help="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.prefix.help']}" data-dismiss="modal"
inputId="prefix" type="button">
label="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.prefix.label']}" <bootstrap:svgIcon icon="x" />
name="prefix" </button>
value="#{personName.prefix}" />
<bootstrap:formGroupText
help="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.surname.help']}"
inputId="surname"
label="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.surname.label']}"
name="surname"
value="#{personName.surname}" />
<bootstrap:formGroupText
help="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.givenname.help']}"
inputId="givenName"
label="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.givenname.label']}"
name="givenName"
value="#{personName.givenName}" />
<bootstrap:formGroupText
help="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.suffix.help']}"
inputId="suffix"
label="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.suffix.label']}"
name="suffix"
value="#{personName.suffix}" />
</div>
<div class="modal-footer">
<button class="btn btn-warning"
data-dismiss="modal"
type="button">
#{CmsAssetsStepsDefaultMessagesBundle['person.personname.edit.dialog.close']}
</button>
<button class="btn btn-success"
type="submit">
#{CmsAssetsStepsDefaultMessagesBundle['person.personname.edit.dialog.submit']}
</button>
</div>
</form>
</div>
</div>
<button class="btn btn-danger"
data-toggle="modal"
data-target="#personname-remove-dialog-#{personName.hashCode()}"
type="button">
<bootstrap:svgIcon icon="x-circle" />
<span class="sr-only">#{CmsAssetsStepsDefaultMessagesBundle['person.personname.remove']}</span>
</button>
<div aria-hidden="true"
aria-lablledby="personname-remove-dialog-#{personName.hashCode()}-title"
class="modal fade"
id="personname-remove-dialog-#{personName.hashCode()}"
tabindex="-1">
<div class="modal-dialog">
<form action="#{mvc.basePath}/#{ContentSectionModel.sectionName}/asset/#{CmsSelectedAssetModel.assetPath}/@person-edit/personnames/@remove"
class="modal-content"
method="post">
<div class="modal-header">
<h4 id="personname-edit-dialog-#{personName.hashCode()}-title">
#{CmsAssetsStepsDefaultMessagesBundle['person.personname.remove.dialog.title']}
</h4>
<button
aria-label="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.remove.dialog.close']}"
class="close"
data-dismiss="modal"
type="button">
<bootstrap:svgIcon icon="x" />
</button>
</div>
<div class="modal-body">
<input name="confirmed"
type="hidden"
value="true"/>
<p>
#{CmsAssetsStepsDefaultMessagesBundle.getMessage('person.personname.remove.dialog.message', [personName.prefix, personName.surname, personName.givenName, personName.suffix])}
</p>
<dl>
<div>
<dt>person.personname.prefix.label</dt>
<dd>#{personName.prefix}</dd>
</div> </div>
<div> <div class="modal-body">
<dt>person.personname.surname.label</dt> <bootstrap:formGroupText
<dd>#{personName.surname}</dd> help="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.prefix.help']}"
inputId="prefix"
label="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.prefix.label']}"
name="prefix"
value="#{personName.prefix}" />
<bootstrap:formGroupText
help="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.surname.help']}"
inputId="surname"
label="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.surname.label']}"
name="surname"
value="#{personName.surname}" />
<bootstrap:formGroupText
help="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.givenname.help']}"
inputId="givenName"
label="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.givenname.label']}"
name="givenName"
value="#{personName.givenName}" />
<bootstrap:formGroupText
help="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.suffix.help']}"
inputId="suffix"
label="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.suffix.label']}"
name="suffix"
value="#{personName.suffix}" />
</div> </div>
<div> <div class="modal-footer">
<dt>person.personname.givename.label</dt> <button class="btn btn-warning"
<dd>#{personName.givenName}</dd> data-dismiss="modal"
type="button">
#{CmsAssetsStepsDefaultMessagesBundle['person.personname.edit.dialog.close']}
</button>
<button class="btn btn-success"
type="submit">
#{CmsAssetsStepsDefaultMessagesBundle['person.personname.edit.dialog.submit']}
</button>
</div> </div>
<div> </form>
<dt>person.personname.suffix.label</dt>
<dd>#{personName.suffix}</dd>
</div>
</dl>
</div> </div>
<div class="modal-footer"> </div>
<button class="btn btn-warning" <button class="btn btn-danger"
data-dismiss="modal" data-toggle="modal"
type="button"> data-target="#personname-remove-dialog-#{personName.hashCode()}"
#{CmsAssetsStepsDefaultMessagesBundle['person.personname.remove.dialog.close']} type="button">
</button> <bootstrap:svgIcon icon="x-circle" />
<button class="btn btn-success" <span class="sr-only">#{CmsAssetsStepsDefaultMessagesBundle['person.personname.remove']}</span>
type="submit"> </button>
#{CmsAssetsStepsDefaultMessagesBundle['person.personname.remove.dialog.submit']} <div aria-hidden="true"
</button> aria-lablledby="personname-remove-dialog-#{personName.hashCode()}-title"
class="modal fade"
id="personname-remove-dialog-#{personName.hashCode()}"
tabindex="-1">
<div class="modal-dialog">
<form action="#{mvc.basePath}/#{ContentSectionModel.sectionName}/asset/#{CmsSelectedAssetModel.assetPath}/@person-edit/personnames/@remove"
class="modal-content"
method="post">
<div class="modal-header">
<h4 id="personname-edit-dialog-#{personName.hashCode()}-title">
#{CmsAssetsStepsDefaultMessagesBundle['person.personname.remove.dialog.title']}
</h4>
<button
aria-label="#{CmsAssetsStepsDefaultMessagesBundle['person.personname.remove.dialog.close']}"
class="close"
data-dismiss="modal"
type="button">
<bootstrap:svgIcon icon="x" />
</button>
</div>
<div class="modal-body">
<input name="confirmed"
type="hidden"
value="true"/>
<p>
#{CmsAssetsStepsDefaultMessagesBundle.getMessage('person.personname.remove.dialog.message', [personName.prefix, personName.surname, personName.givenName, personName.suffix])}
</p>
<dl>
<div>
<dt>#{CmsAssetsStepsDefaultMessagesBundle['person.personname.prefix.label']}</dt>
<dd>#{personName.prefix}</dd>
</div>
<div>
<dt>#{CmsAssetsStepsDefaultMessagesBundle['person.personname.surname.label']}</dt>
<dd>#{personName.surname}</dd>
</div>
<div>
<dt>#{CmsAssetsStepsDefaultMessagesBundle['person.personname.givename.label']}</dt>
<dd>#{personName.givenName}</dd>
</div>
<div>
<dt>#{CmsAssetsStepsDefaultMessagesBundle['person.personname.suffix.label']}</dt>
<dd>#{personName.suffix}</dd>
</div>
</dl>
</div>
<div class="modal-footer">
<button class="btn btn-warning"
data-dismiss="modal"
type="button">
#{CmsAssetsStepsDefaultMessagesBundle['person.personname.remove.dialog.close']}
</button>
<button class="btn btn-success"
type="submit">
#{CmsAssetsStepsDefaultMessagesBundle['person.personname.remove.dialog.submit']}
</button>
</div>
</form>
</div> </div>
</form> </div>
</div> </td>
</div> </tr>
</td> </c:forEach>
</tr> </tbody>
</c:forEach> </table>
</tbody> </c:otherwise>
</table> </c:choose>
<ui:include src="../edit-contactable.xhtml"> <ui:include src="../edit-contactable.xhtml">
<ui:param name="actionBaseUrl" <ui:param name="actionBaseUrl"
@ -255,7 +264,7 @@
<ui:param name="postalAddressAction" <ui:param name="postalAddressAction"
value="#{mvc.basePath}/#{ContentSectionModel.sectionName}/assets/#{CmsSelectedAssetModel.assetPath}/@person-edit/postaladdress" /> value="#{mvc.basePath}/#{ContentSectionModel.sectionName}/assets/#{CmsSelectedAssetModel.assetPath}/@person-edit/postaladdress" />
</ui:include> </ui:include>
</ui:define> </ui:define>
</ui:composition> </ui:composition>

View File

@ -263,3 +263,8 @@ person.personname.remove.dialog.title=Remove Person Name
person.personname.remove.dialog.close=Cancel person.personname.remove.dialog.close=Cancel
person.personname.remove.dialog.message=Are you sure to remove the following person name: {0} {1} {2} {3}? person.personname.remove.dialog.message=Are you sure to remove the following person name: {0} {1} {2} {3}?
person.personname.remove.dialog.submit=Remove name person.personname.remove.dialog.submit=Remove name
person.label=Person
person.description=Contact information of a person
person.createform.title=Create new Person
person.personnames.col.actions=Actions
person.personnames.none=No person names yet.

View File

@ -263,3 +263,8 @@ person.personname.remove.dialog.title=Namen entfernen
person.personname.remove.dialog.close=Abbrechen person.personname.remove.dialog.close=Abbrechen
person.personname.remove.dialog.message=Sind Sie sicher, dass Sie den folgenden Namen entfernen wollen: {0} {1} {2} {3}? person.personname.remove.dialog.message=Sind Sie sicher, dass Sie den folgenden Namen entfernen wollen: {0} {1} {2} {3}?
person.personname.remove.dialog.submit=Namen entfernen person.personname.remove.dialog.submit=Namen entfernen
person.label=Person
person.description=Kontaktinformationen einer Person
person.createform.title=Neue Person anlegen
person.personnames.col.actions=Aktionen
person.personnames.none=Noch keine Personennamen vorhanden.

View File

@ -64,7 +64,6 @@ import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.MatcherAssert.assertThat;
/** /**
* Tests for the {@link AssetRepository}. * Tests for the {@link AssetRepository}.
* *
@ -277,19 +276,25 @@ public class AssetRepositoryIT {
"datasets/org/librecms/contentsection/AssetRepositoryTest/data.xml") "datasets/org/librecms/contentsection/AssetRepositoryTest/data.xml")
public void findAssetByUuidAndType() { public void findAssetByUuidAndType() {
final Optional<Asset> asset = shiro final Optional<? extends Asset> asset = shiro
.getSystemUser() .getSystemUser()
.execute(() -> { .execute(
() -> {
return assetRepo return assetRepo
.findByUuidAndType("4635589f-b87a-46d9-979e-6af14af063e5", .findByUuidAndType(
Image.class); "4635589f-b87a-46d9-979e-6af14af063e5",
Image.class
);
}); });
final Optional<Asset> none = shiro final Optional<? extends Asset> none = shiro
.getSystemUser() .getSystemUser()
.execute(() -> { .execute(
() -> {
return assetRepo return assetRepo
.findByUuidAndType("4635589f-b87a-46d9-979e-6af14af063e5", .findByUuidAndType(
FileAsset.class); "4635589f-b87a-46d9-979e-6af14af063e5",
FileAsset.class
);
}); });
assertThat(asset.isPresent(), is(true)); assertThat(asset.isPresent(), is(true));