/*
* Copyright (C) 2013 Red Hat, Inc. and/or its affiliates.
*
* 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 org.jboss.errai.demo.busstress.client.local;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.jboss.errai.bus.client.ErraiBus;
import org.jboss.errai.bus.client.api.ClientMessageBus;
import org.jboss.errai.bus.client.api.base.MessageBuilder;
import org.jboss.errai.bus.client.api.builder.MessageBuildSendable;
import org.jboss.errai.bus.client.api.messaging.Message;
import org.jboss.errai.bus.client.api.messaging.MessageCallback;
import org.jboss.errai.common.client.api.Caller;
import org.jboss.errai.common.client.api.RemoteCallback;
import org.jboss.errai.demo.busstress.client.shared.RecursiveObject;
import org.jboss.errai.demo.busstress.client.shared.RpcService;
import org.jboss.errai.demo.busstress.client.shared.Stats;
import org.jboss.errai.ioc.client.api.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.IntegerBox;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
@EntryPoint
public class StressTestClient extends Composite {
private static StressTestClientUiBinder uiBinder = GWT.create(StressTestClientUiBinder.class);
@UiField IntegerBox messageInterval;
@UiField Label messageIntervalError;
@UiField IntegerBox messageSize;
@UiField Label messageSizeError;
@UiField IntegerBox messageMultiplier;
@UiField Button startButton;
@UiHandler("startButton")
public void onStartButtonClick(ClickEvent click) {
restart();
}
@UiField
Button stopButton;
@UiHandler("stopButton")
void onStopButtonClick(ClickEvent event) {
stopIfRunning();
}
@UiField
SimplePanel statusPanel;
@UiField
VerticalPanel resultsPanel;
@UiField
Label rpcResultLabel;
@Inject Caller<RpcService> rpcService;
@UiHandler("rpcButton")
void onRpcButtonClick(ClickEvent event) {
final RecursiveObject firstO = new RecursiveObject();
RecursiveObject prevO = firstO;
for (int i = 0; i < 100; i++) {
RecursiveObject o = new RecursiveObject();
o.setaDouble(123.0);
o.setString("strrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr strrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr strrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr strrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr strrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr strrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr strrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr strrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr strrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr strrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr strrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr strrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr strrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr strrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr strrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr strrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr strrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr ");
o.setString1("str1111111111111111111111111111111111111111111111111111111111111111111111111 str1111111111111111111111111111111111111111111111111111111111111111111111111 str1111111111111111111111111111111111111111111111111111111111111111111111111 str1111111111111111111111111111111111111111111111111111111111111111111111111 str1111111111111111111111111111111111111111111111111111111111111111111111111 str1111111111111111111111111111111111111111111111111111111111111111111111111 str1111111111111111111111111111111111111111111111111111111111111111111111111 str1111111111111111111111111111111111111111111111111111111111111111111111111 str1111111111111111111111111111111111111111111111111111111111111111111111111 str1111111111111111111111111111111111111111111111111111111111111111111111111 str1111111111111111111111111111111111111111111111111111111111111111111111111 str1111111111111111111111111111111111111111111111111111111111111111111111111 str1111111111111111111111111111111111111111111111111111111111111111111111111 str1111111111111111111111111111111111111111111111111111111111111111111111111 str1111111111111111111111111111111111111111111111111111111111111111111111111 str1111111111111111111111111111111111111111111111111111111111111111111111111 str1111111111111111111111111111111111111111111111111111111111111111111111111 ");
o.setTime(4321L);
prevO.setNextInChain(o);
prevO = o;
}
final long startTime = System.currentTimeMillis();
rpcService.call(new RemoteCallback<RecursiveObject>() {
@Override
public void callback(RecursiveObject response) {
long elapsed = System.currentTimeMillis() - startTime;
rpcResultLabel.setText("RPC Took " + elapsed + "ms");
}
}).echo(firstO);
}
private ClientMessageBus bus = (ClientMessageBus) ErraiBus.get();
private Timer sendTimer;
/**
* The message payload that gets sent to the server.
*/
private String messageValue;
interface StressTestClientUiBinder extends UiBinder<Widget, StressTestClient> {
}
@PostConstruct
private void init() {
initWidget(uiBinder.createAndBindUi(this));
BusStatusWidget busStatusWidget = new BusStatusWidget();
bus.addLifecycleListener(busStatusWidget);
statusPanel.add(busStatusWidget);
RootPanel.get().add(this);
}
public void restart() {
if (!validateSettings()) {
return;
}
stopIfRunning();
final Stats stats = new Stats();
final StatsPanel statsPanel = new StatsPanel();
resultsPanel.insert(statsPanel, 0);
// create the message payload
Integer messageSizeInt = messageSize.getValue();
StringBuilder sb = new StringBuilder(messageSizeInt);
for (int i = 0; i < messageSizeInt; i++) {
sb.append("!");
}
messageValue = sb.toString();
if (messageMultiplier.getValue() == null || messageMultiplier.getValue() < 1) {
messageMultiplier.setValue(1);
}
final int multipler = messageMultiplier.getValue();
sendTimer = new Timer() {
private boolean hasStarted;
@Override
public void run() {
hasStarted = true;
for (int i = 0; i < multipler; i++) {
MessageBuildSendable sendable = MessageBuilder.createMessage()
.toSubject("StressTestService")
.withValue(messageValue)
.done()
.repliesTo(new MessageCallback() {
@Override
public void callback(Message message) {
stats.registerReceivedMessage(message);
statsPanel.updateStatsLabels(stats);
}
});
sendable.sendNowWith(bus);
stats.registerSentMessage(sendable.getMessage());
}
statsPanel.updateStatsLabels(stats);
}
@Override
public void cancel() {
super.cancel();
if (hasStarted) {
stats.registerTestFinishing();
statsPanel.onRunFinished(stats);
}
}
};
sendTimer.scheduleRepeating(messageInterval.getValue());
stats.registerTestStarting();
statsPanel.onRunStarted(stats);
}
private boolean validateSettings() {
boolean valid = true;
if (messageSize.getValue() == null) {
valid = false;
messageSizeError.setText("Numbers only");
messageSize.addStyleName("error");
}
else {
messageSizeError.setText("");
messageSize.removeStyleName("error");
}
if (messageInterval.getValue() == null) {
valid = false;
messageIntervalError.setText("Numbers only");
messageInterval.addStyleName("error");
}
else {
messageIntervalError.setText("");
messageInterval.removeStyleName("error");
}
return valid;
}
/**
* Stops the timer if it's running. Does nothing otherwise. Safe to call any time.
*/
void stopIfRunning() {
if (sendTimer != null) {
sendTimer.cancel();
sendTimer = null;
}
}
}