/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.module.extension.internal.runtime.resolver;
import static java.lang.String.format;
import static org.mule.runtime.extension.api.dsql.DsqlParser.isDsqlQuery;
import org.mule.runtime.api.exception.MuleException;
import org.mule.runtime.extension.api.dsql.DsqlParser;
import org.mule.runtime.extension.api.dsql.DsqlQuery;
import org.mule.runtime.extension.api.dsql.QueryTranslator;
/**
* {@link ValueResolver} implementation which translates {@link DsqlQuery}s to queries in the Native Query Language.
* <p>
* If the query provided is not a {@link DsqlQuery} then is considered a Native Query and returned as it is.
*
* @since 4.0
*/
public final class NativeQueryParameterValueResolver implements ValueResolver<String> {
private static final DsqlParser dsqlParser = DsqlParser.getInstance();
private final static String ERROR = "Error creating QueryTranslator [%s], query translators must have a default constructor";
private final String query;
private final Class<? extends QueryTranslator> translatorClass;
public NativeQueryParameterValueResolver(String query, Class<? extends QueryTranslator> translator) {
this.query = query;
this.translatorClass = translator;
}
/**
* {@inheritDoc}
*/
@Override
public String resolve(ValueResolvingContext context) throws MuleException {
if (!isDsqlQuery(query)) {
return query;
}
DsqlQuery dsqlQuery = dsqlParser.parse(query);
// creates new instances to avoid state related problems of the translator implementation.
QueryTranslator queryTranslator = instantiateTranslator(translatorClass);
return dsqlQuery.translate(queryTranslator);
}
/**
* @return {@code false}
*/
@Override
public boolean isDynamic() {
return false;
}
private QueryTranslator instantiateTranslator(Class<? extends QueryTranslator> translator) {
try {
return translator.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new IllegalArgumentException(format(ERROR, translator.getSimpleName()));
}
}
}