/*
* Copyright 2015 Alidays S.p.A.
*
* 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 it.alidays.mapengine.core.map;
import it.alidays.mapengine.util.Utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RetrieveHandler {
public final static String VUID_KEY = "#vuid#";
private final static Pattern VUID_PATTERN = Pattern.compile(VUID_KEY);
public static Integer getVuidCount(String content) {
Integer result = 0;
Matcher matcher = VUID_PATTERN.matcher(content);
while (matcher.find()) {
result++;
}
return result;
}
private final AbstractRetrieve<?> retrieve;
private final Integer vuidCount;
private final String content;
private final List<String> columns;
protected RetrieveHandler(AbstractRetrieve<?> retrieve, String content) {
this.retrieve = retrieve;
this.vuidCount = getVuidCount(content);
this.content = content.replaceAll(VUID_KEY, "?");
this.columns = new ArrayList<>();
}
protected List<Object> execute(Connection connection, UUID vuid) throws SQLException {
List<Object> result = new ArrayList<>();
try (PreparedStatement preparedStatement = connection.prepareStatement(this.content)) {
for (int index = 1; index <= this.vuidCount; index++) {
preparedStatement.setObject(index, vuid);
}
ResultSet resultSet = preparedStatement.executeQuery();
retrieveColumns(resultSet);
while (resultSet.next()) {
Map<String, Object> data = new HashMap<>();
for (String column : columns) {
data.put(Utils.arrangeColumnName(column), resultSet.getObject(column));
}
result.add(this.retrieve.getMap(data));
}
}
return result;
}
private void retrieveColumns(ResultSet resultSet) throws SQLException {
if (this.columns.isEmpty()) {
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
for (int i = 1, n = resultSetMetaData.getColumnCount(); i <= n; i++) {
this.columns.add(resultSetMetaData.getColumnLabel(i));
}
}
}
}