/*
* Copyright 2014 JBoss Inc
*
* 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.overlord.dtgov.ui.client.local.pages;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import org.jboss.errai.ui.nav.client.local.Page;
import org.jboss.errai.ui.nav.client.local.PageState;
import org.jboss.errai.ui.nav.client.local.TransitionAnchor;
import org.jboss.errai.ui.shared.api.annotations.DataField;
import org.jboss.errai.ui.shared.api.annotations.EventHandler;
import org.jboss.errai.ui.shared.api.annotations.Templated;
import org.overlord.commons.gwt.client.local.widgets.HtmlSnippet;
import org.overlord.commons.gwt.client.local.widgets.UnorderedListPanel;
import org.overlord.dtgov.ui.client.local.ClientMessages;
import org.overlord.dtgov.ui.client.local.beans.UiConfiguration;
import org.overlord.dtgov.ui.client.local.pages.targets.ClassifiersTable;
import org.overlord.dtgov.ui.client.local.pages.targets.TargetTypeListBox;
import org.overlord.dtgov.ui.client.local.pages.targets.panel.AbstractTargetPanel;
import org.overlord.dtgov.ui.client.local.pages.targets.panel.CliTargetPanel;
import org.overlord.dtgov.ui.client.local.pages.targets.panel.CopyTargetPanel;
import org.overlord.dtgov.ui.client.local.pages.targets.panel.CustomTargetPanel;
import org.overlord.dtgov.ui.client.local.pages.targets.panel.FabricTargetPanel;
import org.overlord.dtgov.ui.client.local.pages.targets.panel.MavenTargetPanel;
import org.overlord.dtgov.ui.client.local.pages.targets.panel.RhqTargetPanel;
import org.overlord.dtgov.ui.client.local.services.ConfigurationService;
import org.overlord.dtgov.ui.client.local.services.NotificationService;
import org.overlord.dtgov.ui.client.local.services.TargetsRpcService;
import org.overlord.dtgov.ui.client.local.services.rpc.IRpcServiceInvocationHandler;
import org.overlord.dtgov.ui.client.local.util.DOMUtil;
import org.overlord.dtgov.ui.client.shared.beans.NotificationBean;
import org.overlord.dtgov.ui.client.shared.beans.TargetBean;
import org.overlord.dtgov.ui.client.shared.beans.TargetType;
import org.overlord.dtgov.ui.client.shared.beans.ValidationError;
import org.overlord.dtgov.ui.client.shared.exceptions.DtgovFormValidationException;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
/**
* Manage Target initial page. Used to edit/create targets.
*
* @author David Virgil Naranjo
*/
@Templated("/org/overlord/dtgov/ui/client/local/site/target.html#page")
@Page(path = "target")
@Dependent
public class TargetPage extends AbstractPage {
// Breadcrumbs
/** The _back to dashboard. */
@Inject
@DataField("back-to-dashboard")
private TransitionAnchor<DashboardPage> _backToDashboard;
// Breadcrumbs
/** The _back to queries. */
@Inject
@DataField("back-to-targets")
private TransitionAnchor<TargetsPage> _backToTargets;
/** The _config service. */
@Inject
private ConfigurationService _configService;
/** The _description box. */
@Inject
@DataField("form-target-description-input")
private TextArea _descriptionBox;
/** The _form validation error div. */
@Inject
@DataField("form-validation-div")
private HtmlSnippet _formValidationErrorDiv;
/** The _i18n. */
@Inject
private ClientMessages _i18n;
/** The _notification service. */
@Inject
private NotificationService _notificationService;
/** The _page content. */
private Element _pageContent;
/** The _query name box. */
@Inject
@DataField("form-target-name-input")
private TextBox _targetNameBox;
/** The _reset button. */
@Inject
@DataField("btn-reset")
private Button _resetButton;
/** The _submit button. */
@Inject
@DataField("btn-save")
private Button _submitButton;
/** The _uuid. */
@PageState("uuid")
private String _uuid;
/** The _validation_errors. */
@Inject
@DataField("form-validation-errors")
private UnorderedListPanel _validation_errors;
/** The _workflow query loading. */
@Inject
@DataField("target-loading-spinner")
private HtmlSnippet _targetLoading;
/** The _workflow query service. */
@Inject
private TargetsRpcService _targetService;
/** The _workflow. */
@Inject
@DataField("form-target-type-input")
private TargetTypeListBox _targetType;
@Inject
Instance<MavenTargetPanel> _addMavenForm;
@Inject
Instance<CliTargetPanel> _addCliForm;
@Inject
Instance<RhqTargetPanel> _addRhqForm;
@Inject
Instance<CopyTargetPanel> _addCopyForm;
@Inject
Instance<FabricTargetPanel> _addFabricForm;
@Inject
Instance<CustomTargetPanel> _addCustomForm;
private AbstractTargetPanel _targetPanel;
@Inject
@DataField("classifiers-table")
private ClassifiersTable _classifiersTable;
@Inject
@DataField("target-panel")
private FlowPanel _panel;
/** The _add property. */
@Inject
@DataField("btn-add-classifier")
private Button _addClassifier;
/**
* Creates the target bean.
*
* @return the target bean
*/
private TargetBean createTargetBean() {
TargetBean target = null;
if (_targetType != null && _targetType.getValue() != null && !_targetType.getValue().equals("")) { //$NON-NLS-1$
target = _targetPanel.getTargetBean();
} else {
target = new TargetBean();
}
if (target != null) {
target.setUuid(this._uuid);
target.setName(this._targetNameBox.getValue());
target.setDescription(this._descriptionBox.getValue());
target.setClassifiers(_classifiersTable.getValue());
}
return target;
}
/**
* Inits the page.
*/
private void init() {
if (_uuid != null && !_uuid.isEmpty()) {
_pageContent.addClassName("hide"); //$NON-NLS-1$
_targetLoading.getElement().removeClassName("hide"); //$NON-NLS-1$
_targetService.get(_uuid, new IRpcServiceInvocationHandler<TargetBean>() {
@Override
public void onError(Throwable error) {
_notificationService.sendErrorNotification(_i18n.format("target.error-loading"), error); //$NON-NLS-1$
_targetLoading.getElement().addClassName("hide"); //$NON-NLS-1$
}
@Override
public void onReturn(TargetBean data) {
updateContent(data);
_targetLoading.getElement().addClassName("hide"); //$NON-NLS-1$
}
});
}
}
/* (non-Javadoc)
* @see org.overlord.dtgov.ui.client.local.pages.AbstractPage#onPageShowing()
*/
@Override
protected void onPageShowing() {
if (_uuid != null && !_uuid.isEmpty()) {
init();
}
}
/**
* Method execuded on post construct. Initialize the components.
*/
@PostConstruct
protected void onPostConstruct() {
_formValidationErrorDiv.getElement().addClassName("hide"); //$NON-NLS-1$
_pageContent = DOMUtil.findElementById(getElement(), "target-content-wrapper"); //$NON-NLS-1$
this._targetType.clear();
UiConfiguration uiConfig = _configService.getUiConfig();
Map<String, String> typesMap = uiConfig.getTargetKeyTypes();
for (String key : typesMap.keySet()) {
_targetType.addItem(key, typesMap.get(key));
}
this._targetType.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
refreshTargetForm(null);
}
});
_descriptionBox.setVisibleLines(3);
}
/**
* Refresh target form using a target bean as income.
*
* @param data
* the data
*/
private void refreshTargetForm(TargetBean data) {
String value = _targetType.getValue();
if (value != null && !value.equals("")) { //$NON-NLS-1$
TargetType type = TargetType.value(value);
_panel.clear();
if (type != null) {
switch (type) {
case MAVEN:
_targetPanel = this._addMavenForm.get();
break;
case RHQ:
_targetPanel = this._addRhqForm.get();
break;
case CLI:
_targetPanel = this._addCliForm.get();
break;
case COPY:
_targetPanel = this._addCopyForm.get();
break;
case FABRIC:
_targetPanel = this._addFabricForm.get();
break;
case CUSTOM:
_targetPanel = this._addCustomForm.get();
break;
}
if (_targetPanel != null) {
_panel.add(_targetPanel);
if (data != null) {
_targetPanel.initialize(data);
}
}
}
}
}
/**
* Update the content of the page using a target bean as param.
*
* @param data
* the data
*/
protected void updateContent(TargetBean data) {
_pageContent.removeClassName("hide"); //$NON-NLS-1$
_targetNameBox.setValue(data.getName());
_descriptionBox.setValue(data.getDescription());
_targetType.setValue(data.getType().getValue());
/*
* for (int i = 0; i < _targetType.getItemCount(); i++) { if
* (_targetType.getValue(i) != null &&
* _targetType.getValue(i).equals(data.getType().getValue())) {
* _targetType.setSelectedIndex(i); break; } }
*/
_classifiersTable.setValue(data.getClassifiers());
refreshTargetForm(data);
if (_uuid == null || _uuid.equals("")) { //$NON-NLS-1$
_resetButton.setVisible(false);
}
}
/**
* On submit click.
*
* @param event
* the event
*/
@EventHandler("btn-save")
public void onSubmitClick(ClickEvent event) {
final NotificationBean notification = _notificationService.startProgressNotification(_i18n.format("target-submit.save"), //$NON-NLS-1$
_i18n.format("target-submit.save-msg")); //$NON-NLS-1$
final TargetBean target = this.createTargetBean();
_validation_errors.clear();
_targetService.save(target, new IRpcServiceInvocationHandler<String>() {
@Override
public void onError(Throwable error) {
if (error instanceof DtgovFormValidationException) {
List<ValidationError> errors = ((DtgovFormValidationException) error).getErrors();
for (ValidationError err : errors) {
_validation_errors.add(new InlineLabel(_i18n.format(err.getErrorLabel())));
}
_formValidationErrorDiv.getElement().removeClassName("hide"); //$NON-NLS-1$
_notificationService.removeNotification(notification.getUuid());
Window.scrollTo(0, 0);
} else {
_notificationService.completeProgressNotification(notification.getUuid(), _i18n.format("target-submit.error-saving"), //$NON-NLS-1$
error);
}
}
@Override
public void onReturn(String data) {
_uuid = data;
_formValidationErrorDiv.getElement().addClassName("hide"); //$NON-NLS-1$
_notificationService.completeProgressNotification(notification.getUuid(), _i18n.format("target-submit.successfully-saved"), //$NON-NLS-1$
_i18n.format("target-submit.successfully-saved-message", target.getName())); //$NON-NLS-1$
}
});
}
/**
* On reset.
*
* @param event
* the event
*/
@EventHandler("btn-reset")
public void reset(ClickEvent event) {
_formValidationErrorDiv.getElement().addClassName("hide"); //$NON-NLS-1$
if (_uuid != null && !_uuid.isEmpty()) {
init();
} else {
_descriptionBox.setText(""); //$NON-NLS-1$
_targetNameBox.setText(""); //$NON-NLS-1$
_targetType.setSelectedIndex(0);
_panel.clear();
_classifiersTable.clear();
}
}
/**
* Ond add property.
*
* @param event
* the event
*/
@EventHandler("btn-add-classifier")
public void ondAddClassifier(ClickEvent event) {
_classifiersTable.addNewRow();
}
/**
* Gets the back to dashboard.
*
* @return the back to dashboard
*/
public TransitionAnchor<DashboardPage> getBackToDashboard() {
return _backToDashboard;
}
/**
* Sets the back to dashboard.
*
* @param backToDashboard
* the new back to dashboard
*/
public void setBackToDashboard(TransitionAnchor<DashboardPage> backToDashboard) {
this._backToDashboard = backToDashboard;
}
/**
* Gets the back to targets.
*
* @return the back to targets
*/
public TransitionAnchor<TargetsPage> getBackToTargets() {
return _backToTargets;
}
/**
* Sets the back to targets.
*
* @param backToTargets
* the new back to targets
*/
public void setBackToTargets(TransitionAnchor<TargetsPage> backToTargets) {
this._backToTargets = backToTargets;
}
/**
* Gets the config service.
*
* @return the config service
*/
public ConfigurationService getConfigService() {
return _configService;
}
/**
* Sets the config service.
*
* @param configService
* the new config service
*/
public void setConfigService(ConfigurationService configService) {
this._configService = configService;
}
/**
* Gets the description box.
*
* @return the description box
*/
public TextArea getDescriptionBox() {
return _descriptionBox;
}
/**
* Sets the description box.
*
* @param descriptionBox
* the new description box
*/
public void setDescriptionBox(TextArea descriptionBox) {
this._descriptionBox = descriptionBox;
}
/**
* Gets the form validation error div.
*
* @return the form validation error div
*/
public HtmlSnippet getFormValidationErrorDiv() {
return _formValidationErrorDiv;
}
/**
* Sets the form validation error div.
*
* @param formValidationErrorDiv
* the new form validation error div
*/
public void setFormValidationErrorDiv(HtmlSnippet formValidationErrorDiv) {
this._formValidationErrorDiv = formValidationErrorDiv;
}
/**
* Gets the i18n.
*
* @return the i18n
*/
public ClientMessages getI18n() {
return _i18n;
}
/**
* Sets the i18n.
*
* @param i18n
* the new i18n
*/
public void setI18n(ClientMessages i18n) {
this._i18n = i18n;
}
/**
* Gets the notification service.
*
* @return the notification service
*/
public NotificationService getNotificationService() {
return _notificationService;
}
/**
* Sets the notification service.
*
* @param notificationService
* the new notification service
*/
public void setNotificationService(NotificationService notificationService) {
this._notificationService = notificationService;
}
/**
* Gets the page content.
*
* @return the page content
*/
public Element getPageContent() {
return _pageContent;
}
/**
* Sets the page content.
*
* @param pageContent
* the new page content
*/
public void setPageContent(Element pageContent) {
this._pageContent = pageContent;
}
/**
* Gets the target name box.
*
* @return the target name box
*/
public TextBox getTargetNameBox() {
return _targetNameBox;
}
/**
* Sets the target name box.
*
* @param targetNameBox
* the new target name box
*/
public void setTargetNameBox(TextBox targetNameBox) {
this._targetNameBox = targetNameBox;
}
/**
* Gets the reset button.
*
* @return the reset button
*/
public Button getResetButton() {
return _resetButton;
}
/**
* Sets the reset button.
*
* @param resetButton
* the new reset button
*/
public void setResetButton(Button resetButton) {
this._resetButton = resetButton;
}
/**
* Gets the submit button.
*
* @return the submit button
*/
public Button getSubmitButton() {
return _submitButton;
}
/**
* Sets the submit button.
*
* @param submitButton
* the new submit button
*/
public void setSubmitButton(Button submitButton) {
this._submitButton = submitButton;
}
/**
* Gets the uuid.
*
* @return the uuid
*/
public String getUuid() {
return _uuid;
}
/**
* Sets the uuid.
*
* @param uuid
* the new uuid
*/
public void setUuid(String uuid) {
this._uuid = uuid;
}
/**
* Gets the validation_errors.
*
* @return the validation_errors
*/
public UnorderedListPanel getValidation_errors() {
return _validation_errors;
}
/**
* Sets the validation_errors.
*
* @param validation_errors
* the new validation_errors
*/
public void setValidation_errors(UnorderedListPanel validation_errors) {
this._validation_errors = validation_errors;
}
/**
* Gets the target loading.
*
* @return the target loading
*/
public HtmlSnippet getTargetLoading() {
return _targetLoading;
}
/**
* Sets the target loading.
*
* @param targetLoading
* the new target loading
*/
public void setTargetLoading(HtmlSnippet targetLoading) {
this._targetLoading = targetLoading;
}
/**
* Gets the target service.
*
* @return the target service
*/
public TargetsRpcService getTargetService() {
return _targetService;
}
/**
* Sets the target service.
*
* @param targetService
* the new target service
*/
public void setTargetService(TargetsRpcService targetService) {
this._targetService = targetService;
}
/**
* Gets the target type.
*
* @return the target type
*/
public TargetTypeListBox getTargetType() {
return _targetType;
}
/**
* Sets the target type.
*
* @param targetType
* the new target type
*/
public void setTargetType(TargetTypeListBox targetType) {
this._targetType = targetType;
}
/**
* Gets the adds the maven form.
*
* @return the adds the maven form
*/
public Instance<MavenTargetPanel> getAddMavenForm() {
return _addMavenForm;
}
/**
* Sets the adds the maven form.
*
* @param addMavenForm
* the new adds the maven form
*/
public void setAddMavenForm(Instance<MavenTargetPanel> addMavenForm) {
this._addMavenForm = addMavenForm;
}
/**
* Gets the adds the cli form.
*
* @return the adds the cli form
*/
public Instance<CliTargetPanel> getAddCliForm() {
return _addCliForm;
}
/**
* Sets the adds the cli form.
*
* @param addCliForm
* the new adds the cli form
*/
public void setAddCliForm(Instance<CliTargetPanel> addCliForm) {
this._addCliForm = addCliForm;
}
/**
* Gets the adds the rhq form.
*
* @return the adds the rhq form
*/
public Instance<RhqTargetPanel> getAddRhqForm() {
return _addRhqForm;
}
/**
* Sets the adds the rhq form.
*
* @param addRhqForm
* the new adds the rhq form
*/
public void setAddRhqForm(Instance<RhqTargetPanel> addRhqForm) {
this._addRhqForm = addRhqForm;
}
/**
* Gets the adds the copy form.
*
* @return the adds the copy form
*/
public Instance<CopyTargetPanel> getAddCopyForm() {
return _addCopyForm;
}
/**
* Sets the adds the copy form.
*
* @param addCopyForm
* the new adds the copy form
*/
public void setAddCopyForm(Instance<CopyTargetPanel> addCopyForm) {
this._addCopyForm = addCopyForm;
}
/**
* Gets the target panel.
*
* @return the target panel
*/
public AbstractTargetPanel getTargetPanel() {
return _targetPanel;
}
/**
* Sets the target panel.
*
* @param targetPanel
* the new target panel
*/
public void setTargetPanel(AbstractTargetPanel targetPanel) {
this._targetPanel = targetPanel;
}
/**
* Gets the classifiers table.
*
* @return the classifiers table
*/
public ClassifiersTable getClassifiersTable() {
return _classifiersTable;
}
/**
* Sets the classifiers table.
*
* @param classifiersTable
* the new classifiers table
*/
public void setClassifiersTable(ClassifiersTable classifiersTable) {
this._classifiersTable = classifiersTable;
}
/**
* Gets the panel.
*
* @return the panel
*/
public FlowPanel getPanel() {
return _panel;
}
/**
* Sets the panel.
*
* @param panel
* the new panel
*/
public void setPanel(FlowPanel panel) {
this._panel = panel;
}
/**
* Gets the adds the classifier.
*
* @return the adds the classifier
*/
public Button getAddClassifier() {
return _addClassifier;
}
/**
* Sets the adds the classifier.
*
* @param addClassifier
* the new adds the classifier
*/
public void setAddClassifier(Button addClassifier) {
this._addClassifier = addClassifier;
}
}