/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 ro.nextreports.designer.querybuilder;
import java.util.*;
import ro.nextreports.engine.queryexec.QueryParameter;
import ro.nextreports.engine.queryexec.Query;
import ro.nextreports.engine.querybuilder.sql.util.CollectionUtil;
import ro.nextreports.engine.util.ParameterNotFoundException;
import ro.nextreports.engine.util.ParameterUtil;
/**
* @author Decebal Suiu
*/
public class ParameterManager {
private static ParameterManager instance = new ParameterManager();
private LinkedHashMap<String, QueryParameter> parameters;
private ParameterManager() {
parameters = new LinkedHashMap<String, QueryParameter>();
}
public static ParameterManager getInstance() {
return instance;
}
public void addParameter(QueryParameter parameter) {
if (parameter == null) {
throw new IllegalArgumentException("null");
}
String paramName = parameter.getName();
if ((paramName == null) || (paramName.trim().length() == 0)) {
throw new IllegalArgumentException("name");
}
parameters.put(paramName, parameter);
RuntimeParametersPanel.resetParametersValues();
}
public void deleteParameter(QueryParameter parameter) {
if (parameter == null) {
throw new IllegalArgumentException("null");
}
String paramName = parameter.getName();
if ((paramName == null) || (paramName.trim().length() == 0)) {
throw new IllegalArgumentException("name");
}
parameters.remove(paramName);
RuntimeParametersPanel.resetParametersValues();
}
public void modifyParameter(QueryParameter oldParameter, QueryParameter newParameter) {
if (oldParameter == null) {
throw new IllegalArgumentException("null");
}
int position = getPosition(oldParameter.getName());
deleteParameter(oldParameter);
addParameter(newParameter);
List<String> list = getParameterNames();
CollectionUtil.moveItem(list, newParameter.getName(), position);
recreateMap(list);
RuntimeParametersPanel.resetParametersValues();
}
public int getPosition(String parameterName) {
List<String> list = getParameterNames();
int position = -1;
for (int i=0, size=list.size(); i<size; i++) {
if (parameterName.equals(list.get(i))) {
position = i;
break;
}
}
return position;
}
public void moveParameter(String parameterName, boolean up) {
int position = getPosition(parameterName);
List<String> list = getParameterNames();
if (position != -1) {
if (up && (position > 0)) {
CollectionUtil.moveItem(list, parameterName, position-1);
recreateMap(list);
}
if (!up && (position < list.size()-1)) {
CollectionUtil.moveItem(list, parameterName, position+1);
recreateMap(list);
}
}
}
private void recreateMap(List<String> parameterNames) {
LinkedHashMap<String, QueryParameter> newParameters = new LinkedHashMap<String, QueryParameter>();
for (String name : parameterNames) {
newParameters.put(name, parameters.get(name));
}
parameters = newParameters;
}
public void deleteParameter(String paramName) {
parameters.remove(paramName);
RuntimeParametersPanel.resetParametersValues();
}
public boolean containsParameter(String paramName) {
return parameters.containsKey(paramName);
}
public QueryParameter getParameter(String paramName) {
return parameters.get(paramName);
}
public int getParameterCount() {
return parameters.size();
}
public Map<String, QueryParameter> getParametersMap() {
return parameters;
}
public Map<String, QueryParameter> getUsedParametersMap(Query query) {
return ParameterUtil.getUsedParametersMap(query, parameters);
}
public List<String> getParameterNames() {
return new LinkedList<String>(parameters.keySet());
}
public List<String> getUsedParameterNames(String sql) {
return new LinkedList<String>(ParameterUtil.getUsedParametersMap(sql, parameters).keySet());
}
public List<QueryParameter> getParameters() {
return new LinkedList<QueryParameter>(parameters.values());
}
public List<QueryParameter> getClonedParameters() {
LinkedList<QueryParameter> list = new LinkedList<QueryParameter>();
for (QueryParameter qp : parameters.values()) {
list.add(qp);
}
return list;
}
public void setParameters(List<QueryParameter> params) {
parameters.clear();
for (QueryParameter parameter : params) {
addParameter(parameter);
}
RuntimeParametersPanel.resetParametersValues();
}
public void clearParameters() {
parameters.clear();
}
public Map<String, QueryParameter> getChildDependentParameters(QueryParameter p) {
Map<String, QueryParameter> result = new HashMap<String, QueryParameter>();
List<QueryParameter> params = getParameters();
for (QueryParameter param : params) {
if (!param.equals(p)) {
if (param.isDependent()) {
List<String> names = param.getDependentParameterNames();
if (names.contains(p.getName())) {
result.put(param.getName(), param);
}
}
}
}
return result;
}
public Map<String, QueryParameter> getParentDependentParameters(QueryParameter p) {
List<String> names = p.getDependentParameterNames();
Map<String, QueryParameter> result = new HashMap<String, QueryParameter>();
for (String name : names) {
result.put(name, getParameter(name));
}
return result;
}
/**
* Test if all parameters used in sql are defined
* @param sql sql
* @throws ro.nextreports.engine.util.ParameterNotFoundException if a parameter used in the sql is not defined
*/
public void parametersAreDefined(String sql) throws ParameterNotFoundException {
String[] paramNames;
Query query = new Query(sql);
paramNames = query.getParameterNames();
List<QueryParameter> parameters = getParameters();
for (String paramName : paramNames) {
QueryParameter param = null;
for (QueryParameter p : parameters) {
if (paramName.equals(p.getName())) {
param = p;
}
}
if (param == null) {
throw new ParameterNotFoundException(paramName);
}
}
}
/**
* Test if all parameters are for stored procedure call
* @return the name of the first parameter that is not for a stored procedure call, null if all parameters
* are ok
*/
public String parametersAreForStoredProcedure() {
List<QueryParameter> parameters = getParameters();
for (QueryParameter p : parameters) {
if (!p.isProcedureParameter()) {
return p.getName();
}
}
return null;
}
}