use of org.jboss.hal.resources.Resources in project console by hal.
the class ServerActions method copyServer.
// ------------------------------------------------------ server operations
public void copyServer(Server server, Callback callback) {
Operation operation = new Operation.Builder(ResourceAddress.root(), READ_CHILDREN_NAMES_OPERATION).param(CHILD_TYPE, HOST).build();
dispatcher.execute(operation, result -> {
List<String> hosts = new ArrayList<>();
result.asList().forEach(m -> hosts.add(m.asString()));
// get the first host only to retrieve the r-r-d for server-config
// as /host=*/server-config=*:read-operation-description(name=add) does not work
AddressTemplate template = AddressTemplate.of("/host=" + hosts.get(0) + "/server-config=*");
metadataProcessor.lookup(template, progress.get(), new SuccessfulMetadataCallback(eventBus, resources) {
@Override
public void onMetadata(Metadata metadata) {
String id = Ids.build(SERVER_GROUP, statementContext.selectedServerGroup(), SERVER, FORM);
SingleSelectBoxItem hostFormItem = new SingleSelectBoxItem(HOST, Names.HOST, hosts, false);
hostFormItem.setRequired(true);
NameItem nameItem = new NameItem();
ModelNodeForm<ModelNode> form = new ModelNodeForm.Builder<>(id, metadata).fromRequestProperties().unboundFormItem(nameItem, 0).unboundFormItem(hostFormItem, 1, resources.messages().addServerHostHelp()).exclude(AUTO_START, SOCKET_BINDING_DEFAULT_INTERFACE, SOCKET_BINDING_GROUP, UPDATE_AUTO_START_WITH_SERVER_STATUS).build();
AddResourceDialog dialog = new AddResourceDialog(resources.messages().copyServerTitle(), form, (resource, payload) -> {
// read server-config recursively to retrieve nested resources
ModelNode serverConfigModel = new ModelNode();
serverConfigModel.get(HOST).set(server.getHost());
serverConfigModel.get(SERVER_CONFIG).set(server.getName());
ResourceAddress serverAddress = new ResourceAddress(serverConfigModel);
Operation opReadServer = new Operation.Builder(serverAddress, READ_RESOURCE_OPERATION).param(RECURSIVE, true).build();
dispatcher.execute(opReadServer, new Consumer<ModelNode>() {
@Override
public void accept(ModelNode newServerModel) {
String newServerName = nameItem.getValue();
// set the chosen group in the model
newServerModel.get(GROUP).set(payload.get(GROUP).asString());
if (payload.hasDefined(SOCKET_BINDING_PORT_OFFSET)) {
newServerModel.get(SOCKET_BINDING_PORT_OFFSET).set(payload.get(SOCKET_BINDING_PORT_OFFSET).asLong());
}
newServerModel.get(NAME).set(newServerName);
ModelNode newServerModelAddress = new ModelNode();
newServerModelAddress.get(HOST).set(hostFormItem.getValue());
newServerModelAddress.get(SERVER_CONFIG).set(newServerName);
Operation opAddServer = new Operation.Builder(new ResourceAddress(newServerModelAddress), ADD).payload(newServerModel).build();
Composite comp = new Composite();
comp.add(opAddServer);
// create operation for each nested resource of the source server
createOperation(comp, JVM, newServerModel, newServerModelAddress);
createOperation(comp, INTERFACE, newServerModel, newServerModelAddress);
createOperation(comp, PATH, newServerModel, newServerModelAddress);
createOperation(comp, SYSTEM_PROPERTY, newServerModel, newServerModelAddress);
createOperation(comp, SSL, newServerModel, newServerModelAddress);
dispatcher.execute(comp, (CompositeResult result) -> {
MessageEvent.fire(eventBus, Message.success(resources.messages().addResourceSuccess(Names.SERVER, newServerName)));
callback.execute();
}, (operation1, failure) -> {
MessageEvent.fire(eventBus, Message.error(resources.messages().addResourceError(newServerName, failure)));
callback.execute();
}, (operation1, exception) -> {
MessageEvent.fire(eventBus, Message.error(resources.messages().addResourceError(newServerName, exception.getMessage())));
callback.execute();
});
}
private void createOperation(Composite composite, String resource, ModelNode model, ModelNode baseAddress) {
if (model.hasDefined(resource)) {
List<Property> props = model.get(resource).asPropertyList();
props.forEach(p -> {
String propname = p.getName();
ModelNode _address = baseAddress.clone();
_address.get(resource).set(propname);
Operation operation = new Operation.Builder(new ResourceAddress(_address), ADD).payload(p.getValue()).build();
composite.add(operation);
});
}
}
});
});
dialog.show();
}
});
});
}
use of org.jboss.hal.resources.Resources in project console by hal.
the class ContentColumn method undeploy.
private void undeploy(Content content) {
if (!content.getServerGroupDeployments().isEmpty()) {
Set<String> serverGroupsWithContent = content.getServerGroupDeployments().stream().map(ServerGroupDeployment::getServerGroup).collect(toSet());
new DeployContentDialog1(content, serverGroupsWithContent, resources, (cnt, serverGroups) -> {
List<Operation> operations = serverGroups.stream().map(serverGroup -> {
ResourceAddress resourceAddress = new ResourceAddress().add(SERVER_GROUP, serverGroup).add(DEPLOYMENT, content.getName());
return new Operation.Builder(resourceAddress, REMOVE).build();
}).collect(toList());
dispatcher.execute(new Composite(operations), (CompositeResult cr) -> {
refresh(RESTORE_SELECTION);
MessageEvent.fire(eventBus, Message.success(resources.messages().contentUndeployed(content.getName())));
});
}).show();
} else {
MessageEvent.fire(eventBus, Message.warning(resources.messages().undeployedContent(content.getName())));
}
}
use of org.jboss.hal.resources.Resources in project console by hal.
the class ResetServerDialog method reset.
void reset(String messagingServer) {
LabelBuilder labelBuilder = new LabelBuilder();
String l1 = labelBuilder.label(RESET_ALL_MESSAGE_COUNTERS);
Property p1 = metadata.getDescription().findOperation(RESET_ALL_MESSAGE_COUNTERS);
if (p1 != null && p1.getValue().hasDefined(DESCRIPTION)) {
l1 = p1.getValue().get(DESCRIPTION).asString();
l1 = Strings.sanitize(l1);
}
String l2 = labelBuilder.label(RESET_ALL_MESSAGE_COUNTER_HISTORIES);
Property p2 = metadata.getDescription().findOperation(RESET_ALL_MESSAGE_COUNTER_HISTORIES);
if (p2 != null && p2.getValue().hasDefined(DESCRIPTION)) {
l2 = p2.getValue().get(DESCRIPTION).asString();
l2 = Strings.sanitize(l2);
}
Form<ModelNode> form = new ModelNodeForm.Builder<>(Ids.RESET_MESSAGE_COUNTERS, Metadata.empty()).unboundFormItem(new SwitchItem(RESET_ALL_MESSAGE_COUNTERS, l1)).unboundFormItem(new SwitchItem(RESET_ALL_MESSAGE_COUNTER_HISTORIES, l2)).onSave((f, changedValues) -> column.resetServer(messagingServer, !f.getFormItem(RESET_ALL_MESSAGE_COUNTERS).isEmpty(), !f.getFormItem(RESET_ALL_MESSAGE_COUNTER_HISTORIES).isEmpty())).build();
form.addFormValidation(new RequireAtLeastOneAttributeValidation<>(asList(RESET_ALL_MESSAGE_COUNTERS, RESET_ALL_MESSAGE_COUNTER_HISTORIES), resources));
// Make the long labels more readable
stream(form.element().querySelectorAll("." + halFormLabel + ", ." + halFormInput)).filter(htmlElements()).map(asHtmlElement()).forEach(element -> element.style.width = WidthUnionType.of("50%"));
Dialog dialog = new Dialog.Builder(resources.constants().reset()).add(form.element()).primary(resources.constants().reset(), form::save).size(Size.MEDIUM).closeIcon(true).closeOnEsc(true).cancel().build();
dialog.registerAttachable(form);
form.edit(new ModelNode());
dialog.show();
}
use of org.jboss.hal.resources.Resources in project console by hal.
the class JmsQueuePresenter method reload.
@Override
protected void reload() {
if (showAll()) {
readAll();
} else {
ResourceAddress address = queueAddress();
Task<FlowContext> count = context -> {
Operation operation = new Operation.Builder(address, COUNT_MESSAGES).build();
return dispatcher.execute(operation).doOnSuccess(result -> context.set(MESSAGES_COUNT, result.asLong())).toCompletable();
};
Task<FlowContext> list = context -> {
long messages = context.get(MESSAGES_COUNT);
if (messages > MESSAGES_THRESHOLD) {
context.set(MESSAGES, emptyList());
return Completable.complete();
} else {
Operation operation = new Operation.Builder(address, LIST_MESSAGES).build();
return dispatcher.execute(operation).doOnSuccess(result -> context.set(MESSAGES, result.asList().stream().map(JmsMessage::new).collect(toList()))).toCompletable();
}
};
series(new FlowContext(progress.get()), count, list).subscribe(new SuccessfulOutcome<FlowContext>(getEventBus(), resources) {
@Override
public void onSuccess(FlowContext context) {
long count = context.get(MESSAGES_COUNT);
List<JmsMessage> messages = context.get(MESSAGES);
if (count > MESSAGES_THRESHOLD) {
logger.debug("More than {} messages in queue {}. Skip :list-messages operation.", MESSAGES_THRESHOLD, queueAddress());
getView().showMany(count);
} else {
getView().showAll(messages);
}
}
});
}
}
use of org.jboss.hal.resources.Resources in project console by hal.
the class EnableSSLWizard method show.
public void show() {
Constants constants = resources.constants();
AddressTemplate template = undertowHttps ? UNDERTOW_HTTPS_LISTENER_TEMPLATE : HTTP_INTERFACE_TEMPLATE;
Wizard.Builder<EnableSSLContext, EnableSSLState> wb = new Wizard.Builder<>(constants.enableSSLManagementTitle(), new EnableSSLContext());
wb.addStep(EnableSSLState.DEFINE_STRATEGY, new DefineStrategyStep(resources, environment.isStandalone(), undertowHttps)).addStep(EnableSSLState.CONFIGURATION, new ConfigurationStep(existingResources, resources, environment, undertowHttps, template)).addStep(EnableSSLState.REVIEW, new ReviewStep(dispatcher, statementContext, resources, environment, undertowHttps, template)).onBack((context, currentState) -> {
EnableSSLState previous = null;
switch(currentState) {
case DEFINE_STRATEGY:
break;
case CONFIGURATION:
previous = EnableSSLState.DEFINE_STRATEGY;
break;
case REVIEW:
previous = EnableSSLState.CONFIGURATION;
break;
default:
break;
}
return previous;
}).onNext((context, currentState) -> {
EnableSSLState next = null;
switch(currentState) {
case DEFINE_STRATEGY:
next = EnableSSLState.CONFIGURATION;
break;
case CONFIGURATION:
next = EnableSSLState.REVIEW;
break;
case REVIEW:
break;
default:
break;
}
return next;
}).stayOpenAfterFinish().onFinish((wizard, context) -> {
ModelNode model = context.model;
ModelNode credRef = new ModelNode();
credRef.get(CLEAR_TEXT).set(asString(model, AbstractConfiguration.KEY_STORE_PASSWORD));
// use Flow tasks to run DMR operations as there are resources that must exists before next
// operations are called, as in the example of a generate-key-pair and import-certificate
// the key-store must exists. For this case, the Composite doesn't work.
List<Task<FlowContext>> tasks = new ArrayList<>();
// key-store is only created when user chooses to create all resources or create a key-store based on
// an existing JKS file
boolean createKeyStore = !context.strategy.equals(EnableSSLContext.Strategy.KEYSTORE_RESOURCE_EXISTS);
String keyStoreName = createKeyStore ? asString(model, AbstractConfiguration.KEY_STORE_NAME) : asString(model, KEY_STORE);
if (createKeyStore) {
if (context.strategy.equals(EnableSSLContext.Strategy.KEYSTORE_CREATE)) {
ResourceAddress ksAddress = keyStoreTemplate().resolve(statementContext, keyStoreName);
tasks.add(flowContext -> {
Operation.Builder builder = new Operation.Builder(ksAddress, ADD).param(PATH, asString(model, KEY_STORE_PATH)).param(CREDENTIAL_REFERENCE, credRef).param(TYPE, asString(model, AbstractConfiguration.KEY_STORE_TYPE));
if (model.hasDefined(AbstractConfiguration.KEY_STORE_RELATIVE_TO)) {
builder.param(RELATIVE_TO, asString(model, AbstractConfiguration.KEY_STORE_RELATIVE_TO));
}
Operation keyStoreOp = builder.build();
return dispatcher.execute(keyStoreOp).doOnError(exception -> wizard.showError(constants.failed(), resources.messages().addKeyStoreError(keyStoreName), exception.getMessage(), false)).toCompletable();
});
tasks.add(flowContext -> {
Composite composite = new Composite();
// the generate-key=pair can only be called on an existing key-store
String dn = "CN=" + asString(model, AbstractConfiguration.PRIVATE_KEY_DN_CN) + ", OU=" + asString(model, AbstractConfiguration.PRIVATE_KEY_DN_OU) + ", O=" + asString(model, AbstractConfiguration.PRIVATE_KEY_DN_O) + ", L=" + asString(model, AbstractConfiguration.PRIVATE_KEY_DN_L) + ", ST=" + asString(model, AbstractConfiguration.PRIVATE_KEY_DN_ST) + ", C=" + asString(model, AbstractConfiguration.PRIVATE_KEY_DN_C);
Operation genKeyOp = new Operation.Builder(ksAddress, GENERATE_KEY_PAIR).param(ALIAS, asString(model, AbstractConfiguration.PRIVATE_KEY_ALIAS)).param(DISTINGUISHED_NAME, dn).param(VALIDITY, asString(model, AbstractConfiguration.PRIVATE_KEY_VALIDITY)).param(ModelDescriptionConstants.ALGORITHM, asString(model, AbstractConfiguration.PRIVATE_KEY_ALGORITHM)).build();
composite.add(genKeyOp);
Operation storeOp = new Operation.Builder(ksAddress, STORE).build();
composite.add(storeOp);
return dispatcher.execute(composite).toCompletable();
});
} else if (context.strategy.equals(EnableSSLContext.Strategy.KEYSTORE_FILE_EXISTS)) {
tasks.add(flowContext -> {
ResourceAddress ksAddress = keyStoreTemplate().resolve(statementContext, keyStoreName);
Operation.Builder builder = new Operation.Builder(ksAddress, ADD).param(PATH, asString(model, KEY_STORE_PATH)).param(CREDENTIAL_REFERENCE, credRef).param(TYPE, asString(model, AbstractConfiguration.KEY_STORE_TYPE)).param(REQUIRED, true);
if (model.hasDefined(AbstractConfiguration.KEY_STORE_RELATIVE_TO)) {
builder.param(RELATIVE_TO, asString(model, AbstractConfiguration.KEY_STORE_RELATIVE_TO));
}
Operation keyStoreOp = builder.build();
return dispatcher.execute(keyStoreOp).doOnError(exception -> wizard.showError(constants.failed(), resources.messages().addKeyStoreError(keyStoreName), exception.getMessage(), false)).toCompletable();
});
} else if (context.strategy.equals(EnableSSLContext.Strategy.KEYSTORE_OBTAIN_LETSENCRYPT)) {
ResourceAddress ksAddress = keyStoreTemplate().resolve(statementContext, keyStoreName);
tasks.add(flowContext -> {
Operation.Builder builder = new Operation.Builder(ksAddress, ADD).param(PATH, asString(model, KEY_STORE_PATH)).param(CREDENTIAL_REFERENCE, credRef).param(TYPE, asString(model, AbstractConfiguration.KEY_STORE_TYPE));
if (model.hasDefined(AbstractConfiguration.KEY_STORE_RELATIVE_TO)) {
builder.param(RELATIVE_TO, asString(model, AbstractConfiguration.KEY_STORE_RELATIVE_TO));
}
Operation keyStoreOp = builder.build();
return dispatcher.execute(keyStoreOp).doOnError(exception -> wizard.showError(constants.failed(), resources.messages().addKeyStoreError(keyStoreName), exception.getMessage(), false)).toCompletable();
});
String caaName = asString(model, CAA_NAME);
ResourceAddress caaAddress = certificateAuthorityAccountTemplate().resolve(statementContext, caaName);
tasks.add(flowContext -> {
Operation caaOp = new Operation.Builder(caaAddress, ADD).param(KEY_STORE, keyStoreName).param(ALIAS, asString(model, CAA_ALIAS)).build();
return dispatcher.execute(caaOp).doOnError(exception -> wizard.showError(constants.failed(), resources.messages().addResourceError(caaName, exception.getMessage()), false)).toCompletable();
});
tasks.add(flowContext -> {
Composite composite = new Composite();
String obtainAlias = asString(model, PRIVATE_KEY_ALIAS);
Operation obtainOp = new Operation.Builder(ksAddress, OBTAIN_CERTIFICATE).param(ALIAS, obtainAlias).param(CERTIFICATE_AUTHORITY_ACCOUNT, caaName).param("domain-names", model.get(CAA_DOMAIN_NAMES)).param("agree-to-terms-of-service", true).param("staging", asString(model, CAA_STAGING)).build();
composite.add(obtainOp);
Operation storeOp = new Operation.Builder(ksAddress, STORE).build();
composite.add(storeOp);
return dispatcher.execute(composite).doOnError(ex -> wizard.showError(constants.failed(), resources.messages().obtainCertificateError(obtainAlias, keyStoreName, ex.getMessage()), false)).toCompletable();
});
}
}
String trustManagerName = model.hasDefined(TRUST_MANAGER) ? asString(model, TRUST_MANAGER) : null;
if (context.mutualAuthentication) {
ModelNode tsCredRef = new ModelNode();
tsCredRef.get(CLEAR_TEXT).set(asString(model, AbstractConfiguration.TRUST_STORE_PASSWORD));
String trustStoreName = asString(model, AbstractConfiguration.TRUST_STORE_NAME);
ResourceAddress tsAddress = keyStoreTemplate().resolve(statementContext, trustStoreName);
tasks.add(flowContext -> {
Operation.Builder builder = new Operation.Builder(tsAddress, ADD).param(PATH, asString(model, AbstractConfiguration.TRUST_STORE_PATH)).param(CREDENTIAL_REFERENCE, tsCredRef).param(TYPE, asString(model, AbstractConfiguration.TRUST_STORE_TYPE));
if (model.hasDefined(AbstractConfiguration.TRUST_STORE_RELATIVE_TO)) {
builder.param(RELATIVE_TO, asString(model, AbstractConfiguration.TRUST_STORE_RELATIVE_TO));
}
Operation trustStoreOp = builder.build();
return dispatcher.execute(trustStoreOp).toCompletable();
});
tasks.add(flowContext -> {
Composite composite = new Composite();
Operation importCertOp = new Operation.Builder(tsAddress, IMPORT_CERTIFICATE).param(ALIAS, asString(model, AbstractConfiguration.CLIENT_CERTIFICATE_ALIAS)).param(PATH, asString(model, AbstractConfiguration.CLIENT_CERTIFICATE_PATH)).param(CREDENTIAL_REFERENCE, tsCredRef).param(VALIDATE, model.get(AbstractConfiguration.CLIENT_CERTIFICATE_VALIDATE).asBoolean(false)).param(TRUST_CACERTS, model.get(AbstractConfiguration.CLIENT_CERTIFICATE_TRUST).asBoolean(false)).build();
composite.add(importCertOp);
Operation storeOp = new Operation.Builder(tsAddress, STORE).build();
composite.add(storeOp);
ResourceAddress etmAddress = trustManagerTemplate().resolve(statementContext, trustManagerName);
Operation trustManagerOp = new Operation.Builder(etmAddress, ADD).param(KEY_STORE, trustStoreName).param(ModelDescriptionConstants.ALGORITHM, KEY_MANAGER_ALGORITHM).build();
composite.add(trustManagerOp);
return dispatcher.execute(composite).toCompletable();
});
}
Composite composite = new Composite();
String keyManager = asString(model, KEY_MANAGER);
ResourceAddress ekmAddress = keyManagerTemplate().resolve(statementContext, keyManager);
Operation keyManagerOp = new Operation.Builder(ekmAddress, ADD).param(KEY_STORE, keyStoreName).param(ModelDescriptionConstants.ALGORITHM, KEY_MANAGER_ALGORITHM).param(CREDENTIAL_REFERENCE, credRef).build();
composite.add(keyManagerOp);
ModelNode protocols = new ModelNode();
protocols.add(KEY_MANAGER_TLSV1_2);
String serverSslContext = asString(model, SERVER_SSL_CONTEXT);
ResourceAddress sslCtxAddress = sslContextTemplate().resolve(statementContext, serverSslContext);
Operation.Builder sslCtxBuilder = new Operation.Builder(sslCtxAddress, ADD).param(KEY_MANAGER, keyManager).param(PROTOCOLS, protocols);
if (context.mutualAuthentication) {
sslCtxBuilder.param(TRUST_MANAGER, trustManagerName);
sslCtxBuilder.param(WANT_CLIENT_AUTH, true);
}
Operation sslCtxOp = sslCtxBuilder.build();
composite.add(sslCtxOp);
if (undertowHttps) {
ResourceAddress httpsAddress = UNDERTOW_HTTPS_LISTENER_TEMPLATE.resolve(statementContext, undertowServer, httpsListener);
Operation writeSslCtxOp = new Operation.Builder(httpsAddress, WRITE_ATTRIBUTE_OPERATION).param(NAME, SSL_CONTEXT).param(VALUE, serverSslContext).build();
composite.add(writeSslCtxOp);
// undefine the "alternatives" attributes
composite.add(undefineAttribute(httpsAddress, SECURITY_REALM));
composite.add(undefineAttribute(httpsAddress, "verify-client"));
composite.add(undefineAttribute(httpsAddress, "enabled-cipher-suites"));
composite.add(undefineAttribute(httpsAddress, "enabled-protocols"));
composite.add(undefineAttribute(httpsAddress, "ssl-session-cache-size"));
composite.add(undefineAttribute(httpsAddress, "ssl-session-timeout"));
} else {
ResourceAddress httpInterfaceAddress = HTTP_INTERFACE_TEMPLATE.resolve(statementContext);
Operation writeSslCtxOp = new Operation.Builder(httpInterfaceAddress, WRITE_ATTRIBUTE_OPERATION).param(NAME, SSL_CONTEXT).param(VALUE, serverSslContext).build();
composite.add(writeSslCtxOp);
if (environment.isStandalone()) {
Operation writeSecureSocketBinding = new Operation.Builder(httpInterfaceAddress, WRITE_ATTRIBUTE_OPERATION).param(NAME, SECURE_SOCKET_BINDING).param(VALUE, asString(model, SECURE_SOCKET_BINDING)).build();
composite.add(writeSecureSocketBinding);
} else {
Operation writeSecurePortOp = new Operation.Builder(httpInterfaceAddress, WRITE_ATTRIBUTE_OPERATION).param(NAME, SECURE_PORT).param(VALUE, asString(model, SECURE_PORT)).build();
composite.add(writeSecurePortOp);
}
}
tasks.add(flowContext -> dispatcher.execute(composite).toCompletable());
series(new FlowContext(progress.get()), tasks).subscribe(new SuccessfulOutcome<FlowContext>(eventBus, resources) {
@Override
public void onSuccess(FlowContext flowContext) {
if (undertowHttps) {
wizard.showSuccess(resources.constants().success(), resources.messages().enableSSLResultsSuccessUndertow(httpsListener, serverSslContext), context1 -> presenter.reloadView(), true);
} else {
// constructs the http management console url
String serverName = environment.isStandalone() ? Names.STANDALONE_SERVER : Names.DOMAIN_CONTROLLER;
String label = resources.constants().reload() + " " + serverName;
SafeHtml description;
StringBuilder location = new StringBuilder("https://" + window.location.getHostname() + ":");
if (environment.isStandalone()) {
location.append(context.securePort);
description = resources.messages().enableSSLResultsSuccessStandalone(location.toString());
} else {
location.append(asString(model, SECURE_PORT));
description = resources.messages().enableSSLResultsSuccessDomain(location.toString());
}
// extracts the url search path, so the url shows the view the user is located
String urlSuffix = window.location.getHref();
urlSuffix = urlSuffix.substring(urlSuffix.indexOf("//") + 2);
urlSuffix = urlSuffix.substring(urlSuffix.indexOf("/"));
location.append(urlSuffix);
wizard.showSuccess(resources.constants().success(), description, label, // reloads the server/host if user clicks on the success action
context1 -> presenter.reloadServer(host, location.toString()), // reload only the view and displays a success message
context2 -> {
presenter.reloadView();
MessageEvent.fire(eventBus, Message.success(resources.messages().enableSSLSuccess()));
}, true);
}
}
@Override
public void onError(FlowContext context, Throwable exception) {
wizard.showError(resources.constants().failed(), resources.messages().enableSSLResultsError(), exception.getMessage(), false);
}
});
});
Wizard<EnableSSLContext, EnableSSLState> wizard = wb.build();
wizard.show();
}
Aggregations