CCM NG/ccm-cms: Some bugfixes for Assets

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4882 8810af33-2d31-482b-a856-94f89814c4df

Former-commit-id: 1c18b66f8d
pull/2/head
jensp 2017-07-20 17:13:46 +00:00
parent 6f715f4fe3
commit 817245af89
10 changed files with 188 additions and 87 deletions

View File

@ -91,7 +91,7 @@ public abstract class AssetForm extends Form implements FormInitListener,
} }
private void initComponents() { private void initComponents() {
showLocalePanel = new BoxPanel(BoxPanel.HORIZONTAL); showLocalePanel = new BoxPanel(BoxPanel.HORIZONTAL);
final Label showLocaleLabel = new Label(new PrintListener() { final Label showLocaleLabel = new Label(new PrintListener() {
@ -165,12 +165,13 @@ public abstract class AssetForm extends Form implements FormInitListener,
showLocaleSubmit = new Submit(new GlobalizedMessage( showLocaleSubmit = new Submit(new GlobalizedMessage(
"cms.ui.asset.show_locale", "cms.ui.asset.show_locale",
CmsConstants.CMS_BUNDLE)) { CmsConstants.CMS_BUNDLE)) {
@Override @Override
public boolean isVisible(final PageState state) { public boolean isVisible(final PageState state) {
return getSelectedAsset(state).isPresent(); return getSelectedAsset(state).isPresent();
} }
};
};
showLocalePanel.add(showLocaleLabel); showLocalePanel.add(showLocaleLabel);
showLocalePanel.add(showLocaleSelect); showLocalePanel.add(showLocaleSelect);
showLocalePanel.add(showLocaleSubmit); showLocalePanel.add(showLocaleSubmit);
@ -260,14 +261,13 @@ public abstract class AssetForm extends Form implements FormInitListener,
return Optional.empty(); return Optional.empty();
} else { } else {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final AssetRepository assetRepo = cdiUtil.findBean( final AssetRepository assetRepo = cdiUtil
AssetRepository.class); .findBean(AssetRepository.class);
final Asset asset = assetRepo final Asset asset = assetRepo
.findById(selectionModel.getSelectedKey(state)) .findById((long) selectionModel.getSelectedKey(state))
.orElseThrow(() -> new IllegalArgumentException(String. .orElseThrow(() -> new IllegalArgumentException(String.
format( format("No asset with ID %d in the database.",
"No asset with ID %d in the database.", selectionModel.getSelectedKey(state))));
selectionModel.getSelectedKey(state))));
return Optional.of(asset); return Optional.of(asset);
} }
} }
@ -312,8 +312,19 @@ public abstract class AssetForm extends Form implements FormInitListener,
} }
} }
protected abstract void initForm(final PageState state, protected void initForm(final PageState state,
final Optional<Asset> selectedAsset); final Optional<Asset> selectedAsset) {
if (selectedAsset.isPresent()) {
title.setValue(state,
selectedAsset
.get()
.getTitle()
.getValue(getSelectedLocale(state)));
showLocale(state);
}
}
@Override @Override
public void process(final FormSectionEvent event) public void process(final FormSectionEvent event)
@ -326,16 +337,17 @@ public abstract class AssetForm extends Form implements FormInitListener,
if (showLocaleSubmit.isSelected(state)) { if (showLocaleSubmit.isSelected(state)) {
final Optional<Asset> selectedAsset = getSelectedAsset(state); final Optional<Asset> selectedAsset = getSelectedAsset(state);
initForm(state, selectedAsset);
if (selectedAsset.isPresent()) { // if (selectedAsset.isPresent()) {
//
title.setValue(state, // title.setValue(state,
selectedAsset // selectedAsset
.get() // .get()
.getTitle() // .getTitle()
.getValue(getSelectedLocale(state))); // .getValue(getSelectedLocale(state)));
showLocale(state); // showLocale(state);
} // }
return; return;
} }

View File

@ -95,7 +95,7 @@ public abstract class BinaryAssetForm extends AssetForm {
panel.add(fileUpload); panel.add(fileUpload);
add(panel); add(panel);
setEncType(CmsConstants.FORM_ENCTYPE_MULTIPART); setEncType(CmsConstants.FORM_ENCTYPE_MULTIPART);
} }
@ -103,6 +103,8 @@ public abstract class BinaryAssetForm extends AssetForm {
protected void initForm(final PageState state, protected void initForm(final PageState state,
final Optional<Asset> selectedAsset) { final Optional<Asset> selectedAsset) {
super.initForm(state, selectedAsset);
if (selectedAsset.isPresent()) { if (selectedAsset.isPresent()) {
if (!(selectedAsset.get() instanceof BinaryAsset)) { if (!(selectedAsset.get() instanceof BinaryAsset)) {
@ -126,7 +128,7 @@ public abstract class BinaryAssetForm extends AssetForm {
mimeType.setText("-"); mimeType.setText("-");
size.setText("-"); size.setText("-");
} else { } else {
fileName.setText(binaryAsset.getFileName()); fileName.setText(binaryAsset.getFileName());
mimeType.setText(binaryAsset.getMimeType().toString()); mimeType.setText(binaryAsset.getMimeType().toString());
size.setText(Long.toString(binaryAsset.getSize())); size.setText(Long.toString(binaryAsset.getSize()));
@ -211,18 +213,20 @@ public abstract class BinaryAssetForm extends AssetForm {
throws FormProcessException { throws FormProcessException {
final File file = fileUpload.getFile(event); final File file = fileUpload.getFile(event);
final Path path = file.toPath(); if (file != null) {
final byte[] data; final Path path = file.toPath();
try { final byte[] data;
data = Files.readAllBytes(path); try {
} catch (IOException ex) { data = Files.readAllBytes(path);
throw new FormProcessException(ex); } catch (IOException ex) {
} throw new FormProcessException(ex);
binaryAsset.setData(data); }
binaryAsset.setFileName(fileUpload.getFileName(event)); binaryAsset.setData(data);
binaryAsset.setSize(data.length); binaryAsset.setFileName(fileUpload.getFileName(event));
binaryAsset.setSize(data.length);
binaryAsset.setMimeType(fileUpload.getMimeType(event)); binaryAsset.setMimeType(fileUpload.getMimeType(event));
}
} }
} }

View File

@ -26,10 +26,10 @@ import com.arsdigita.bebop.form.TextField;
import com.arsdigita.cms.ui.assets.AssetPane; import com.arsdigita.cms.ui.assets.AssetPane;
import com.arsdigita.cms.ui.assets.AssetSearchWidget; import com.arsdigita.cms.ui.assets.AssetSearchWidget;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import org.librecms.assets.BinaryAsset; import org.librecms.assets.BinaryAsset;
import org.librecms.assets.ExternalAudioAsset;
import org.librecms.assets.Image; import org.librecms.assets.Image;
import org.librecms.assets.LegalMetadata; import org.librecms.assets.LegalMetadata;
import org.librecms.contentsection.Asset; import org.librecms.contentsection.Asset;
@ -54,31 +54,35 @@ public class ImageForm extends BinaryAssetForm {
@Override @Override
protected void addWidgets() { protected void addWidgets() {
super.addWidgets();
width = new TextField("width-text"); width = new TextField("width-text");
height = new TextField("height-text"); height = new TextField("height-text");
assetSearchWidget = new AssetSearchWidget("legal-metadata", LegalMetadata.class); assetSearchWidget = new AssetSearchWidget("legal-metadata",
LegalMetadata.class);
add(new Label(new GlobalizedMessage( add(new Label(new GlobalizedMessage(
"cms.ui.assets.image.width.label", "cms.ui.assets.image.width.label",
CmsConstants.CMS_BUNDLE CmsConstants.CMS_BUNDLE
))); )));
add(width); add(width);
add(new Label(new GlobalizedMessage( add(new Label(new GlobalizedMessage(
"cms.ui.assets.image.height.label", "cms.ui.assets.image.height.label",
CmsConstants.CMS_BUNDLE CmsConstants.CMS_BUNDLE
))); )));
add(height); add(height);
add(new Label(new GlobalizedMessage( add(new Label(new GlobalizedMessage(
"cms.ui.assets.image.legal_metadata.label", "cms.ui.assets.image.legal_metadata.label",
CmsConstants.CMS_BUNDLE CmsConstants.CMS_BUNDLE
))); )));
add(assetSearchWidget); add(assetSearchWidget);
} }
@Override @Override
protected void initForm(PageState state, Optional<Asset> selectedAsset) { protected void initForm(final PageState state,
final Optional<Asset> selectedAsset) {
super.initForm(state, selectedAsset); super.initForm(state, selectedAsset);
@ -87,12 +91,14 @@ public class ImageForm extends BinaryAssetForm {
Image image = (Image) selectedAsset.get(); Image image = (Image) selectedAsset.get();
width.setValue(state, width.setValue(state,
Long.toString(image.getWidth())); Long.toString(image.getWidth()));
height.setValue(state, height.setValue(state,
Long.toString(image.getHeight())); Long.toString(image.getHeight()));
final LegalMetadata legalMetadata = image final LegalMetadata legalMetadata = image
.getLegalMetadata(); .getLegalMetadata();
if (legalMetadata != null) { if (legalMetadata == null) {
assetSearchWidget.setValue(state, null);
} else {
assetSearchWidget.setValue(state, legalMetadata.getObjectId()); assetSearchWidget.setValue(state, legalMetadata.getObjectId());
} }
} }
@ -100,7 +106,7 @@ public class ImageForm extends BinaryAssetForm {
@Override @Override
protected Asset createAsset(final FormSectionEvent event) protected Asset createAsset(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final Image image = (Image) super.createAsset(event); final Image image = (Image) super.createAsset(event);
@ -116,7 +122,7 @@ public class ImageForm extends BinaryAssetForm {
@Override @Override
protected void updateAsset(final Asset asset, protected void updateAsset(final Asset asset,
final FormSectionEvent event) final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
super.updateAsset(asset, event); super.updateAsset(asset, event);
@ -137,12 +143,12 @@ public class ImageForm extends BinaryAssetForm {
if (legalMetadataId != null) { if (legalMetadataId != null) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final AssetRepository assetRepo = cdiUtil.findBean( final AssetRepository assetRepo = cdiUtil.findBean(
AssetRepository.class); AssetRepository.class);
final LegalMetadata legalMetadata = (LegalMetadata) assetRepo final LegalMetadata legalMetadata = (LegalMetadata) assetRepo
.findById(legalMetadataId) .findById(legalMetadataId)
.orElseThrow(() -> new IllegalArgumentException(String.format( .orElseThrow(() -> new IllegalArgumentException(String.format(
"No LegalMetadata asset with ID %d in the database.", "No LegalMetadata asset with ID %d in the database.",
legalMetadataId))); legalMetadataId)));
image.setLegalMetadata(legalMetadata); image.setLegalMetadata(legalMetadata);
} }
@ -152,4 +158,5 @@ public class ImageForm extends BinaryAssetForm {
protected BinaryAsset createBinaryAsset(final PageState state) { protected BinaryAsset createBinaryAsset(final PageState state) {
return new Image(); return new Image();
} }
} }

View File

@ -57,6 +57,39 @@ import static org.librecms.CmsConstants.*;
@Inheritance(strategy = InheritanceType.JOINED) @Inheritance(strategy = InheritanceType.JOINED)
@Audited @Audited
@NamedQueries({ @NamedQueries({
@NamedQuery(
name = "Asset.findById",
query = "SELECT DISTINCT a "
+ "FROM Asset a "
+ "LEFT JOIN a.permissions p "
+ "WHERE a.objectId = :assetId "
+ "AND ("
+ " ("
+ " p.grantee IN :roles "
+ " AND p.grantedPrivilege = "
+ " '" + AssetPrivileges.VIEW + "' "
+ " ) "
+ " OR true = :isSystemUser OR true = :isAdmin"
+ ")"
)
,
@NamedQuery(
name = "Asset.findByIdAndType",
query = "SELECT DISTINCT a "
+ "FROM Asset a "
+ "LEFT JOIN a.permissions p "
+ "WHERE a.objectId = :assetId "
+ "AND TYPE(a) = :type "
+ "AND ("
+ " ("
+ " p.grantee IN :roles "
+ " AND p.grantedPrivilege = "
+ " '" + AssetPrivileges.VIEW + "' "
+ " )"
+ " OR true = :isSystemUser OR true = :isAdmin"
+ ")"
)
,
@NamedQuery( @NamedQuery(
name = "Asset.findByUuid", name = "Asset.findByUuid",
query = "SELECT DISTINCT a " query = "SELECT DISTINCT a "
@ -357,6 +390,7 @@ import static org.librecms.CmsConstants.*;
+ " ) " + " ) "
+ " OR true = :isSystemUser OR true = :isAdmin" + " OR true = :isSystemUser OR true = :isAdmin"
+ ")") + ")")
}) })
public class Asset extends CcmObject { public class Asset extends CcmObject {

View File

@ -56,10 +56,10 @@ public class AssetRepository
@Inject @Inject
private Shiro shiro; private Shiro shiro;
@Inject @Inject
private PermissionChecker permissionChecker; private PermissionChecker permissionChecker;
@Inject @Inject
private EntityManager entityManager; private EntityManager entityManager;
@ -101,6 +101,44 @@ public class AssetRepository
} }
} }
@Transactional(Transactional.TxType.REQUIRED)
public Optional<Asset> findById(final long assetId) {
final TypedQuery<Asset> query = getEntityManager()
.createNamedQuery("Asset.findById", Asset.class)
.setParameter("assetId", assetId);
setAuthorizationParameters(query);
try {
return Optional.of(query.getSingleResult());
} catch (NoResultException ex) {
return Optional.empty();
}
}
@Transactional(Transactional.TxType.REQUIRED)
@SuppressWarnings("unchecked")
public <T extends Asset> Optional<T> findById(final long assetId,
final Class<T> type) {
final TypedQuery<Asset> query = getEntityManager()
.createNamedQuery("assetId", Asset.class)
.setParameter("assetId", assetId)
.setParameter("type", type);
setAuthorizationParameters(query);
try {
final Asset result = query.getSingleResult();
if (result.getClass().isAssignableFrom(type)) {
return Optional.of((T) query.getSingleResult());
} else {
return Optional.empty();
}
} catch (NoResultException ex) {
return Optional.empty();
}
}
@AuthorizationRequired @AuthorizationRequired
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
@Override @Override
@ -161,7 +199,7 @@ public class AssetRepository
*/ */
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
public Optional<Asset> findByUuid(final String uuid) { public Optional<Asset> findByUuid(final String uuid) {
final TypedQuery<Asset> query = entityManager final TypedQuery<Asset> query = entityManager
.createNamedQuery("Asset.findByUuid", Asset.class); .createNamedQuery("Asset.findByUuid", Asset.class);
query.setParameter("uuid", uuid); query.setParameter("uuid", uuid);
@ -362,7 +400,7 @@ public class AssetRepository
"Asset.countInFolder", Long.class); "Asset.countInFolder", Long.class);
query.setParameter("folder", folder); query.setParameter("folder", folder);
setAuthorizationParameters(query); setAuthorizationParameters(query);
return query.getSingleResult(); return query.getSingleResult();
} }
@ -513,7 +551,7 @@ public class AssetRepository
} }
private void setAuthorizationParameters(final TypedQuery<?> query) { private void setAuthorizationParameters(final TypedQuery<?> query) {
final Optional<User> user = shiro.getUser(); final Optional<User> user = shiro.getUser();
final List<Role> roles; final List<Role> roles;
if (user.isPresent()) { if (user.isPresent()) {
@ -526,8 +564,7 @@ public class AssetRepository
} else { } else {
roles = Collections.emptyList(); roles = Collections.emptyList();
} }
final boolean isSystemUser = shiro.isSystemUser(); final boolean isSystemUser = shiro.isSystemUser();
final boolean isAdmin = permissionChecker.isPermitted("*"); final boolean isAdmin = permissionChecker.isPermitted("*");
@ -535,5 +572,5 @@ public class AssetRepository
query.setParameter("isSystemUser", isSystemUser); query.setParameter("isSystemUser", isSystemUser);
query.setParameter("isAdmin", isAdmin); query.setParameter("isAdmin", isAdmin);
} }
} }

View File

@ -88,13 +88,13 @@ public class ContentItemRepository
@Inject @Inject
private WorkflowRepository workflowRepo; private WorkflowRepository workflowRepo;
@Inject @Inject
private TaskRepository taskRepo; private TaskRepository taskRepo;
@Inject @Inject
private TaskManager taskManager; private TaskManager taskManager;
@Inject @Inject
private PermissionChecker permissionChecker; private PermissionChecker permissionChecker;
@ -134,8 +134,7 @@ public class ContentItemRepository
public Optional<ContentItem> findById(final long itemId) { public Optional<ContentItem> findById(final long itemId) {
final TypedQuery<ContentItem> query = getEntityManager() final TypedQuery<ContentItem> query = getEntityManager()
.createNamedQuery("ContentItem.findById", .createNamedQuery("ContentItem.findById", ContentItem.class);
ContentItem.class);
query.setParameter("objectId", itemId); query.setParameter("objectId", itemId);
setAuthorizationParameters(query); setAuthorizationParameters(query);
@ -499,10 +498,10 @@ public class ContentItemRepository
removeCategoryFromItem(item, category); removeCategoryFromItem(item, category);
} }
if (draft.getWorkflow() != null) { if (draft.getWorkflow() != null) {
final Workflow workflow = draft.getWorkflow(); final Workflow workflow = draft.getWorkflow();
for(final Task task : workflow.getTasks()) { for (final Task task : workflow.getTasks()) {
taskManager.removeTask(workflow, task); taskManager.removeTask(workflow, task);
} }
workflowRepo.delete(workflow); workflowRepo.delete(workflow);

View File

@ -383,3 +383,5 @@ image_step.label=Images
related_info_step.label=Related information related_info_step.label=Related information
image_step.description=Attach images image_step.description=Attach images
related_info_step_description=Add related information related_info_step_description=Add related information
cms.ui.authoring.file_upload.auto_detect=(Auto-Detect)
cms.ui.upload_new_content=Upload new content

View File

@ -380,3 +380,5 @@ image_step.label=Bilder
related_info_step.label=Weiterf\u00fchrende Informationen related_info_step.label=Weiterf\u00fchrende Informationen
image_step.description=Bilder hinzuf\u00fcgen image_step.description=Bilder hinzuf\u00fcgen
related_info_step_description=Weiterf\u00fchrende Informationen hinzuf\u00fcgen related_info_step_description=Weiterf\u00fchrende Informationen hinzuf\u00fcgen
cms.ui.authoring.file_upload.auto_detect=(Automatisch erkennen)
cms.ui.upload_new_content=Neuen Inhalt hochladen

View File

@ -339,3 +339,5 @@ image_step.label=Images
related_info_step.label=Related information related_info_step.label=Related information
image_step.description=Attach images image_step.description=Attach images
related_info_step_description=Add related information related_info_step_description=Add related information
cms.ui.authoring.file_upload.auto_detect=(Auto-Detect)
cms.ui.upload_new_content=Upload new content

View File

@ -18,34 +18,36 @@
*/ */
package com.arsdigita.bebop.parameters; package com.arsdigita.bebop.parameters;
/** /**
* A class that represents the model for number form parameters. * A class that represents the model for number form parameters.
* *
* @author Randy Graebner (randyg@alum.mit.edu) * @author <a href="randyg@alum.mit.edu">Randy Graebner</a>
* @version $Id$ * @author <a href="jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
public class LongParameter extends NumberParameter { public class LongParameter extends NumberParameter {
public LongParameter(String name) { public LongParameter(final String name) {
super(name); super(name);
} }
@Override @Override
public Object unmarshal(String encoded) { public Object unmarshal(final String encoded) {
try { if (encoded == null || encoded.isEmpty()) {
return new Long(encoded); return null;
} } else {
catch (NumberFormatException e) { try {
throw new IllegalArgumentException(getName() + " should be a " + return new Long(encoded);
"Long Number, but is '" + } catch (NumberFormatException ex) {
encoded + "'"); throw new IllegalArgumentException(String
.format("%s should be a Long Number, but is '%s'",
getName(),
encoded));
}
} }
} }
@Override @Override
public Class getValueClass() { public Class<?> getValueClass() {
return Long.class; return Long.class;
} }