package fr.openwide.core.wicket.more.util.validate.validators; import java.util.Collection; import java.util.List; import org.apache.commons.io.FilenameUtils; import org.apache.wicket.markup.html.form.upload.FileUpload; import org.apache.wicket.util.lang.Args; import org.apache.wicket.validation.IValidatable; import org.apache.wicket.validation.IValidator; import org.apache.wicket.validation.ValidationError; import com.google.common.base.Function; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import fr.openwide.core.commons.util.mime.MediaType; public class FileUploadMediaTypeValidator implements IValidator<List<FileUpload>> { private static final long serialVersionUID = 1507793945782623835L; private final List<MediaType> mediaTypes; private String errorResourceKey = null; public FileUploadMediaTypeValidator(Collection<MediaType> mediaTypes) { this.mediaTypes = ImmutableList.copyOf(Args.notNull(mediaTypes, "mediaTypes")); } @Deprecated public FileUploadMediaTypeValidator(String errorResourceKey, Collection<MediaType> mediaTypes) { this(mediaTypes); this.errorResourceKey = errorResourceKey; } @Override public void validate(IValidatable<List<FileUpload>> validatable) { for (FileUpload fileUpload : validatable.getValue()) { String fileUploadExtension = FilenameUtils.getExtension(fileUpload.getClientFileName()); MediaType fileUploadMediaType = MediaType.fromExtension(fileUploadExtension); if (fileUploadMediaType == null || !mediaTypes.contains(fileUploadMediaType)) { ValidationError error = new ValidationError(); if (errorResourceKey != null) { error.addKey(errorResourceKey); } error.addKey(this); error.setVariable("extensions", Joiner.on(", ").skipNulls().join(Lists.transform(mediaTypes, new Function<MediaType, String>() { @Override public String apply(MediaType input) { return input.extension(); } }))); error.setVariable("clientFileName", fileUpload.getClientFileName()); validatable.error(error); } } } public FileUploadMediaTypeValidator setErrorResourceKey(String errorResourceKey) { this.errorResourceKey = errorResourceKey; return this; } }