school/cs240/record-indexer/src/server/handlers/SearchHandler.java

86 lines
3.0 KiB
Java

package server.handlers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import server.db.*;
import server.handlers.common.BaseHanlder;
import shared.communication.common.Tuple;
import shared.communication.params.Search_Param;
import shared.communication.params.ValidateUser_Param;
import shared.communication.responses.Search_Res;
import shared.communication.responses.ValidateUser_Res;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class SearchHandler extends BaseHanlder {
private List<Tuple> search(int fieldId, Set<String> words) {
FieldAccessor fieldAccessor = FieldAccessor.find(fieldId);
if(fieldAccessor == null) return new ArrayList<Tuple>();
List<ValueAccessor> valueAccessorList = fieldAccessor.getColumnValues();
List<ValueAccessor> matchingValueAccessorsList = new ArrayList<ValueAccessor>();
for(ValueAccessor valueAccessor : valueAccessorList) {
for(String word : words) {
word = word.toLowerCase();
if(word.equals(valueAccessor.getValue().toLowerCase())) {
matchingValueAccessorsList.add(valueAccessor);
}
}
}
List<Tuple> tupleList = new ArrayList<Tuple>();
for(ValueAccessor valueAccessor : matchingValueAccessorsList) {
RecordAccessor recordAccessor = valueAccessor.getRecord();
ImageAccessor imageAccessor = recordAccessor.getImage();
Tuple tuple = new Tuple();
tuple.setBatchId(imageAccessor.getId());
tuple.setImageUrl(imageAccessor.getFile());
tuple.setRecordNumber(recordAccessor.getPosition());
tuple.setFieldId(fieldId);
tupleList.add(tuple);
}
return tupleList;
}
private HttpHandler handler = new HttpHandler() {
@Override
public void handle(HttpExchange exchange) throws IOException {
InputStream inputStream = exchange.getRequestBody();
String request = inputStreamToString(inputStream);
Search_Param searchParam = Search_Param.serialize(request);
UserAccessor userAccessor = UserAccessor.find(searchParam.getUsername());
if(userAccessor == null) {
writeBadAuthenticationResponse(exchange);
return;
} else if(userAccessor.login(searchParam.getPassword())) {
List<Tuple> foundTupleList = new ArrayList<Tuple>();
for(int id : searchParam.getFieldsIds()) {
foundTupleList.addAll(search(id, searchParam.getSearchParams()));
}
Search_Res searchRes = new Search_Res(foundTupleList);
writeSuccessResponse(exchange, searchRes.toXML());
return;
}
writeBadAuthenticationResponse(exchange);
}
};
public HttpHandler getHandler() {
return handler;
}
}