in app/src/main/java/org/apache/roller/weblogger/business/jpa/JPAMediaFileManagerImpl.java [534:642]
public List<MediaFile> searchMediaFiles(Weblog weblog,
MediaFileFilter filter) throws WebloggerException {
List<Object> params = new ArrayList<>();
int size = 0;
String queryString = "SELECT m FROM MediaFile m WHERE ";
StringBuilder whereClause = new StringBuilder();
StringBuilder orderBy = new StringBuilder();
params.add(size++, weblog);
whereClause.append("m.directory.weblog = ?").append(size);
if (!StringUtils.isEmpty(filter.getName())) {
String nameFilter = filter.getName();
nameFilter = nameFilter.trim();
if (!nameFilter.endsWith("%")) {
nameFilter = nameFilter + "%";
}
params.add(size++, nameFilter);
whereClause.append(" AND m.name like ?").append(size);
}
if (filter.getSize() > 0) {
params.add(size++, filter.getSize());
whereClause.append(" AND m.length ");
switch (filter.getSizeFilterType()) {
case GT:
whereClause.append(">");
break;
case GTE:
whereClause.append(">=");
break;
case EQ:
whereClause.append("=");
break;
case LT:
whereClause.append("<");
break;
case LTE:
whereClause.append("<=");
break;
default:
whereClause.append("=");
break;
}
whereClause.append(" ?").append(size);
}
if (filter.getTags() != null && filter.getTags().size() > 1) {
whereClause
.append(" AND EXISTS (SELECT t FROM MediaFileTag t WHERE t.mediaFile = m and t.name IN (");
for (String tag : filter.getTags()) {
params.add(size++, tag);
whereClause.append("?").append(size).append(",");
}
whereClause.deleteCharAt(whereClause.lastIndexOf(","));
whereClause.append("))");
} else if (filter.getTags() != null && filter.getTags().size() == 1) {
params.add(size++, filter.getTags().get(0));
whereClause
.append(" AND EXISTS (SELECT t FROM MediaFileTag t WHERE t.mediaFile = m and t.name = ?")
.append(size).append(")");
}
if (filter.getType() != null) {
if (filter.getType() == MediaFileType.OTHERS) {
for (MediaFileType type : MediaFileType.values()) {
if (type != MediaFileType.OTHERS) {
params.add(size++, type.getContentTypePrefix() + "%");
whereClause.append(" AND m.contentType not like ?")
.append(size);
}
}
} else {
params.add(size++, filter.getType().getContentTypePrefix()
+ "%");
whereClause.append(" AND m.contentType like ?").append(size);
}
}
if (filter.getOrder() != null) {
switch (filter.getOrder()) {
case NAME:
orderBy.append(" order by m.name");
break;
case DATE_UPLOADED:
orderBy.append(" order by m.dateUploaded");
break;
case TYPE:
orderBy.append(" order by m.contentType");
break;
default:
}
} else {
orderBy.append(" order by m.name");
}
TypedQuery<MediaFile> query = strategy.getDynamicQuery(queryString
+ whereClause.toString() + orderBy.toString(), MediaFile.class);
for (int i = 0; i < params.size(); i++) {
query.setParameter(i + 1, params.get(i));
}
if (filter.getStartIndex() >= 0) {
query.setFirstResult(filter.getStartIndex());
query.setMaxResults(filter.getLength());
}
return query.getResultList();
}