/*
* Copyright 2015 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.kie.workbench.common.screens.datamodeller.client.widgets.advanceddomain.annotationwizard;
import javax.enterprise.context.Dependent;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import com.google.gwt.user.client.ui.Widget;
import org.jboss.errai.common.client.api.Caller;
import org.jboss.errai.common.client.api.RemoteCallback;
import org.kie.workbench.common.screens.datamodeller.client.resources.i18n.Constants;
import org.kie.workbench.common.screens.datamodeller.client.widgets.advanceddomain.valuepaireditor.ValuePairEditor;
import org.kie.workbench.common.screens.datamodeller.client.widgets.advanceddomain.valuepaireditor.ValuePairEditorProvider;
import org.kie.workbench.common.screens.datamodeller.client.widgets.advanceddomain.valuepaireditor.generic.GenericValuePairEditor;
import org.kie.workbench.common.screens.datamodeller.service.DataModelerService;
import org.kie.workbench.common.services.datamodeller.core.AnnotationDefinition;
import org.kie.workbench.common.services.datamodeller.core.AnnotationValuePairDefinition;
import org.kie.workbench.common.services.datamodeller.core.ElementType;
import org.kie.workbench.common.services.datamodeller.driver.model.AnnotationParseRequest;
import org.kie.workbench.common.services.datamodeller.driver.model.AnnotationParseResponse;
import org.kie.workbench.common.services.shared.project.KieProject;
import org.uberfire.ext.widgets.core.client.wizards.WizardPageStatusChangeEvent;
@Dependent
public class ValuePairEditorPage
extends CreateAnnotationWizardPage
implements ValuePairEditorPageView.Presenter {
private ValuePairEditorPageView view;
private ValuePairEditorProvider valuePairEditorProvider;
private AnnotationValuePairDefinition valuePairDefinition;
private Object currentValue = null;
@Inject
public ValuePairEditorPage( ValuePairEditorPageView view,
ValuePairEditorProvider valuePairEditorProvider,
Caller<DataModelerService> modelerService,
Event<WizardPageStatusChangeEvent> wizardPageStatusChangeEvent ) {
super( modelerService, wizardPageStatusChangeEvent );
this.valuePairEditorProvider = valuePairEditorProvider;
this.view = view;
view.init( this );
setTitle( "" );
}
@Override
public Widget asWidget() {
return view.asWidget();
}
public void init( AnnotationDefinition annotationDefinition,
AnnotationValuePairDefinition valuePairDefinition, ElementType target, KieProject project ) {
this.annotationDefinition = annotationDefinition;
setValuePairDefinition( valuePairDefinition );
this.target = target;
this.project = project;
setStatus( isRequired() ? PageStatus.NOT_VALIDATED : PageStatus.VALIDATED );
}
public String getStringValue() {
return view.getStringValue();
}
public AnnotationValuePairDefinition getValuePairDefinition() {
return valuePairDefinition;
}
public Object getCurrentValue() {
return currentValue;
}
@Override
public void onValidate() {
modelerService.call( getOnValidateValidateSuccessCallback(), new CreateAnnotationWizard.CreateAnnotationWizardErrorCallback() )
.resolveParseRequest( new AnnotationParseRequest( annotationDefinition.getClassName(), target,
valuePairDefinition.getName(), getStringValue() ), project );
}
@Override
public void onValueChange() {
PageStatus nextStatus = PageStatus.NOT_VALIDATED;
currentValue = view.getValuePairEditor().getValue();
if ( view.getValuePairEditor() instanceof GenericValuePairEditor ) {
//for the generic editor we should use the validate button
//available options
//1) the value pair is required
// 1.1) then we need a value != null
// 1.2 that the value is validated.
//2) the value pair is not required
// 2.1) if a value != null has been entered, then it should be validated
// 2.2) if a value == null has been entered, then NO validation is needed
if ( isRequired() ) {
if ( isEmpty( currentValue ) ) {
setHelpMessage( Constants.INSTANCE.advanced_domain_wizard_value_pair_editor_page_message_enter_required_value_and_validate() );
} else {
setHelpMessage( Constants.INSTANCE.advanced_domain_wizard_value_pair_editor_page_message_value_not_validated() );
}
nextStatus = PageStatus.NOT_VALIDATED;
} else {
if ( isEmpty( currentValue ) ) {
setHelpMessage( Constants.INSTANCE.advanced_domain_wizard_value_pair_editor_page_message_enter_optional_value_and_validate() );
nextStatus = PageStatus.VALIDATED;
} else {
setHelpMessage( Constants.INSTANCE.advanced_domain_wizard_value_pair_editor_page_message_value_not_validated() );
nextStatus = PageStatus.NOT_VALIDATED;
}
}
} else if ( view.getValuePairEditor().isValid() &&
( ( isRequired() && view.getValuePairEditor().getValue() != null) || !isRequired() ) ) {
nextStatus = PageStatus.VALIDATED;
}
setStatus( nextStatus );
}
private void setValuePairDefinition( AnnotationValuePairDefinition valuePairDefinition ) {
this.valuePairDefinition = valuePairDefinition;
String required = isRequired() ? "* " : "";
setTitle( " -> " + required + valuePairDefinition.getName() );
initValuePairEditor( valuePairDefinition );
if ( view.getValuePairEditor() instanceof GenericValuePairEditor ) {
if ( isRequired() ) {
setHelpMessage( Constants.INSTANCE.advanced_domain_wizard_value_pair_editor_page_message_enter_required_value_and_validate() );
} else {
setHelpMessage( Constants.INSTANCE.advanced_domain_wizard_value_pair_editor_page_message_enter_optional_value_and_validate() );
}
}
}
private void initValuePairEditor( AnnotationValuePairDefinition valuePairDefinition ) {
ValuePairEditor valuePairEditor = valuePairEditorProvider.getValuePairEditor( valuePairDefinition );
view.setValuePairEditor( valuePairEditor );
}
private RemoteCallback<AnnotationParseResponse> getOnValidateValidateSuccessCallback( ) {
return new RemoteCallback<AnnotationParseResponse>() {
@Override
public void callback( AnnotationParseResponse annotationParseResponse ) {
PageStatus newStatus;
if ( !annotationParseResponse.hasErrors() && annotationParseResponse.getAnnotation() != null ) {
currentValue = annotationParseResponse.getAnnotation().getValue( valuePairDefinition.getName() );
newStatus = PageStatus.VALIDATED;
setHelpMessage( Constants.INSTANCE.advanced_domain_wizard_value_pair_editor_page_message_value_validated() );
} else {
currentValue = null;
newStatus = PageStatus.NOT_VALIDATED;
String errorMessage = Constants.INSTANCE.advanced_domain_wizard_value_pair_editor_page_message_value_not_validated();
errorMessage += "\n" + buildErrorList( annotationParseResponse.getErrors() );
setHelpMessage( errorMessage );
}
setStatus( newStatus );
}
};
}
private void clearHelpMessage() {
view.clearHelpMessage();
}
private void setHelpMessage( String helpMessage ) {
view.setHelpMessage( helpMessage );
}
private boolean isRequired() {
return valuePairDefinition != null && valuePairDefinition.getDefaultValue() == null;
}
private boolean isEmpty( Object value ) {
return value == null || "".equals( value.toString().trim() );
}
}