blob: d729b0e772752c44a878d5e81e964e283984dc88 [file] [log] [blame]
/*
* 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 org.apache.jmeter.protocol.http.config.gui;
import java.awt.Component;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import org.apache.commons.lang3.StringUtils;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.gui.util.HorizontalPanel;
import org.apache.jmeter.gui.util.JSyntaxTextArea;
import org.apache.jmeter.gui.util.JTextScrollPane;
import org.apache.jmeter.protocol.http.config.GraphQLRequestParams;
import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase;
import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBaseSchema;
import org.apache.jmeter.protocol.http.util.GraphQLRequestParamUtils;
import org.apache.jmeter.protocol.http.util.HTTPArgument;
import org.apache.jmeter.protocol.http.util.HTTPConstants;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.gui.JLabeledTextField;
/**
* Extending {@link UrlConfigGui}, GraphQL over HTTP Request configuration GUI, providing more convenient UI elements
* for GraphQL query, variables and operationName.
*/
public class GraphQLUrlConfigGui extends UrlConfigGui {
private static final long serialVersionUID = 1L;
public static final String OPERATION_NAME = "GraphQLHTTPSampler.operationName";
public static final String QUERY = "GraphQLHTTPSampler.query";
public static final String VARIABLES = "GraphQLHTTPSampler.variables";
/**
* Default value settings for GraphQL URL Configuration GUI elements.
*/
private static final UrlConfigDefaults URL_CONFIG_DEFAULTS = new UrlConfigDefaults();
static {
URL_CONFIG_DEFAULTS.setValidMethods(new String[] { HTTPConstants.POST, HTTPConstants.GET });
URL_CONFIG_DEFAULTS.setUseMultipartVisible(false);
}
private JLabeledTextField operationNameText;
private JSyntaxTextArea queryContent;
private JSyntaxTextArea variablesContent;
/**
* Constructor which is setup to show the sampler fields for GraphQL over HTTP request.
*/
public GraphQLUrlConfigGui() {
super(true, false, false);
}
@Override
public void configure(TestElement element) {
super.configure(element);
final String operationName = element.getPropertyAsString(OPERATION_NAME, "");
operationNameText.setText(operationName);
final String query = element.getPropertyAsString(QUERY, "");
queryContent.setText(query);
final String variables = element.getPropertyAsString(VARIABLES, "");
variablesContent.setText(variables);
}
@Override
public void modifyTestElement(TestElement element) {
super.modifyTestElement(element);
final String method = element.getPropertyAsString(HTTPSamplerBase.METHOD);
final GraphQLRequestParams params = new GraphQLRequestParams(operationNameText.getText(),
queryContent.getText(), variablesContent.getText());
element.setProperty(OPERATION_NAME, params.getOperationName());
element.setProperty(QUERY, params.getQuery());
element.setProperty(VARIABLES, params.getVariables());
element.setProperty(HTTPSamplerBase.POST_BODY_RAW, !HTTPConstants.GET.equals(method));
final Arguments args;
if (HTTPConstants.GET.equals(method)) {
args = createHTTPArgumentsTestElement();
if (StringUtils.isNotBlank(params.getOperationName())) {
args.addArgument(createHTTPArgument("operationName", params.getOperationName().trim(), true));
}
args.addArgument(createHTTPArgument("query",
GraphQLRequestParamUtils.queryToGetParamValue(params.getQuery()), true));
if (StringUtils.isNotBlank(params.getVariables())) {
final String variablesParamValue = GraphQLRequestParamUtils
.variablesToGetParamValue(params.getVariables());
if (variablesParamValue != null) {
args.addArgument(createHTTPArgument("variables", variablesParamValue, true));
}
}
} else {
args = new Arguments();
args.addArgument(createHTTPArgument("", GraphQLRequestParamUtils.toPostBodyString(params), false));
}
element.set(HTTPSamplerBaseSchema.INSTANCE.getArguments(), args);
}
@Override
protected UrlConfigDefaults getUrlConfigDefaults() {
return URL_CONFIG_DEFAULTS;
}
/**
* {@inheritDoc}
* <P>
* Overridden to add the extra GraphQL Request Information section including 'operationName' text field.
*/
@Override
protected Component getPathPanel() {
final JPanel panel = (JPanel) super.getPathPanel();
JPanel graphQLReqInfoPane = new HorizontalPanel();
graphQLReqInfoPane
.setBorder(BorderFactory.createTitledBorder(JMeterUtils.getResString("graphql_request_info")));
operationNameText = new JLabeledTextField(JMeterUtils.getResString("graphql_operation_name"), 40);
graphQLReqInfoPane.add(operationNameText);
panel.add(graphQLReqInfoPane);
return panel;
}
/**
* {@inheritDoc}
* <P>
* Overridden to remove the existing tab for parameter arguments and GraphQL variables content pane.
*/
@Override
protected JTabbedPane getParameterPanel() {
final AbstractValidationTabbedPane paramPanel = (AbstractValidationTabbedPane) super.getParameterPanel();
paramPanel.removeAll();
paramPanel.setValidationEnabled(false);
queryContent = JSyntaxTextArea.getInstance(26, 50);
queryContent.setInitialText("");
paramPanel.add(JMeterUtils.getResString("graphql_query"), JTextScrollPane.getInstance(queryContent));
variablesContent = JSyntaxTextArea.getInstance(26, 50);
variablesContent.setLanguage("json");
variablesContent.setInitialText("");
paramPanel.add(JMeterUtils.getResString("graphql_variables"), JTextScrollPane.getInstance(variablesContent));
return paramPanel;
}
private static HTTPArgument createHTTPArgument(final String name, final String value, final boolean alwaysEncoded) {
final HTTPArgument arg = new HTTPArgument(name, value);
arg.setUseEquals(true);
arg.setEnabled(true);
arg.setAlwaysEncoded(alwaysEncoded);
return arg;
}
}