/*
* Copyright 2017 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kie.workbench.common.forms.editor.backend.indexing.query;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Predicate;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.kie.workbench.common.services.refactoring.backend.server.query.NamedQuery;
import org.kie.workbench.common.services.refactoring.backend.server.query.response.ResponseBuilder;
import org.kie.workbench.common.services.refactoring.backend.server.query.standard.FindResourcesQuery;
import org.kie.workbench.common.services.refactoring.model.index.terms.valueterms.ValueIndexTerm;
import org.kie.workbench.common.services.refactoring.model.index.terms.valueterms.ValueResourceIndexTerm;
import org.kie.workbench.common.services.refactoring.model.query.RefactoringMapPageRow;
import org.kie.workbench.common.services.refactoring.model.query.RefactoringPageRow;
import org.kie.workbench.common.services.refactoring.service.ResourceType;
import org.uberfire.backend.server.util.Paths;
import org.uberfire.backend.vfs.Path;
import org.uberfire.ext.metadata.model.KObject;
import org.uberfire.ext.metadata.model.KProperty;
import org.uberfire.io.IOService;
import org.uberfire.paging.PageResponse;
@ApplicationScoped
public class FindFormDefinitionIdsQuery extends FindResourcesQuery implements NamedQuery {
public static final String NAME = FindFormDefinitionIdsQuery.class.getSimpleName();
@Inject
private FindFormDefinitionIdsResponseBuilder responseBuilder;
@Inject
@Named("ioStrategy")
private IOService ioService;
@Override
public String getName() {
return NAME;
}
@Override
public ResponseBuilder getResponseBuilder() {
responseBuilder.setIOService(ioService);
return responseBuilder;
}
@Override
public void validateTerms(Set<ValueIndexTerm> queryTerms) throws IllegalArgumentException {
this.checkInvalidAndRequiredTerms(queryTerms,
NAME,
new String[]{ValueResourceIndexTerm.class.getSimpleName()},
new Predicate[]{t -> {
if (!(t instanceof ValueResourceIndexTerm)) {
return false;
} else {
return ((ValueResourceIndexTerm) t).getTerm().equals(ResourceType.FORM.toString());
}
}});
this.checkTermsSize(1,
queryTerms);
}
public static class FindFormDefinitionIdsResponseBuilder implements ResponseBuilder {
private IOService ioService;
public FindFormDefinitionIdsResponseBuilder() {
}
public FindFormDefinitionIdsResponseBuilder(IOService ioService) {
this.ioService = ioService;
}
public void setIOService(IOService ioService) {
this.ioService = ioService;
}
@Override
public PageResponse<RefactoringPageRow> buildResponse(final int pageSize,
final int startRow,
final List<KObject> kObjects) {
final int hits = kObjects.size();
final PageResponse<RefactoringPageRow> response = new PageResponse<RefactoringPageRow>();
final List<RefactoringPageRow> result = buildResponse(kObjects);
response.setTotalRowSize(hits);
response.setPageRowList(result);
response.setTotalRowSizeExact(true);
response.setStartRowIndex(startRow);
response.setLastPage((pageSize * startRow + 2) >= hits);
return response;
}
@Override
public List<RefactoringPageRow> buildResponse(final List<KObject> kObjects) {
final List<RefactoringPageRow> result = new ArrayList<RefactoringPageRow>(kObjects.size());
for (final KObject kObject : kObjects) {
String formId = findFormId(kObject.getProperties());
if (formId != null) {
final Path path = Paths.convert(ioService.get(URI.create(kObject.getKey())));
Map<String, Path> map = new HashMap<String, Path>();
map.put(formId,
path);
RefactoringMapPageRow row = new RefactoringMapPageRow();
row.setValue(map);
result.add(row);
}
}
return result;
}
public String findFormId(Iterable<KProperty<?>> properties) {
for (KProperty property : properties) {
if (property.getName().equals(ResourceType.FORM.toString())) {
return (String) property.getValue();
}
}
return null;
}
}
}