/*
* Copyright 2014-2016 CyberVision, 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.kaaproject.kaa.server.admin.client.mvp.view.sdk;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.text.shared.Renderer;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ValueListBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import org.kaaproject.avro.ui.gwt.client.widget.SizedTextBox;
import org.kaaproject.kaa.common.dto.VersionDto;
import org.kaaproject.kaa.common.dto.event.AefMapInfoDto;
import org.kaaproject.kaa.common.dto.user.UserVerifierDto;
import org.kaaproject.kaa.server.admin.client.mvp.view.AddSdkProfileView;
import org.kaaproject.kaa.server.admin.client.mvp.view.base.BaseDetailsViewImpl;
import org.kaaproject.kaa.server.admin.client.mvp.view.widget.KaaAdminSizedTextBox;
import org.kaaproject.kaa.server.admin.client.mvp.view.widget.MultiAefMapListBox;
import org.kaaproject.kaa.server.admin.client.mvp.view.widget.MultiValueListBox;
import org.kaaproject.kaa.server.admin.client.mvp.view.widget.VersionListBox;
import org.kaaproject.kaa.server.admin.client.util.Utils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class AddSdkProfileViewImpl
extends BaseDetailsViewImpl
implements AddSdkProfileView, ValueChangeHandler<VersionDto> {
private static final String REQUIRED = Utils.avroUiStyle.requiredField();
private static final int SDK_NAME_TEXT_SIZE_BOX = 255;
private SizedTextBox name;
private VersionListBox configurationSchemaVersion;
private VersionListBox profileSchemaVersion;
private VersionListBox notificationSchemaVersion;
private VersionListBox logSchemaVersion;
private List<AefMapInfoDto> aefMaps;
private AefMapInfoDtoComparator aefMapComparator = new AefMapInfoDtoComparator();
private MultiAefMapListBox availableAefMaps;
private MultiAefMapListBox selectedAefMaps;
private Button addAefMapButton;
private Button removeAefMapButton;
private ValueListBox<UserVerifierDto> defaultUserVerifier;
public AddSdkProfileViewImpl() {
super(true);
}
@Override
protected void initDetailsTable() {
detailsTable.getColumnFormatter().setWidth(0, "250px");
detailsTable.getColumnFormatter().setWidth(1, "500px");
Widget label = new Label(Utils.constants.name());
label.addStyleName(REQUIRED);
name = new KaaAdminSizedTextBox(SDK_NAME_TEXT_SIZE_BOX);
name.addInputHandler(this);
detailsTable.setWidget(0, 0, label);
detailsTable.setWidget(0, 1, name);
label = new Label(Utils.constants.configurationSchemaVersion());
label.addStyleName(REQUIRED);
configurationSchemaVersion = new VersionListBox();
configurationSchemaVersion.setWidth("80px");
configurationSchemaVersion.addValueChangeHandler(this);
detailsTable.setWidget(1, 0, label);
detailsTable.setWidget(1, 1, configurationSchemaVersion);
label = new Label(Utils.constants.profileSchemaVersion());
label.addStyleName(REQUIRED);
profileSchemaVersion = new VersionListBox();
profileSchemaVersion.setWidth("80px");
profileSchemaVersion.addValueChangeHandler(this);
detailsTable.setWidget(2, 0, label);
detailsTable.setWidget(2, 1, profileSchemaVersion);
label = new Label(Utils.constants.notificationSchemaVersion());
label.addStyleName(REQUIRED);
notificationSchemaVersion = new VersionListBox();
notificationSchemaVersion.setWidth("80px");
notificationSchemaVersion.addValueChangeHandler(this);
detailsTable.setWidget(3, 0, label);
detailsTable.setWidget(3, 1, notificationSchemaVersion);
label = new Label(Utils.constants.logSchemaVersion());
label.addStyleName(REQUIRED);
logSchemaVersion = new VersionListBox();
logSchemaVersion.setWidth("80px");
logSchemaVersion.addValueChangeHandler(this);
detailsTable.setWidget(4, 0, label);
detailsTable.setWidget(4, 1, logSchemaVersion);
FlexTable ecfsTable = new FlexTable();
ecfsTable.setCellSpacing(6);
availableAefMaps = new MultiAefMapListBox();
selectedAefMaps = new MultiAefMapListBox();
addAefMapButton = new Button(Utils.constants.add());
removeAefMapButton = new Button(Utils.constants.remove());
VerticalPanel availableEcfsPanel = new VerticalPanel();
availableEcfsPanel.setSpacing(6);
Label availableLabel = new Label(Utils.constants.available());
availableEcfsPanel.add(availableLabel);
availableEcfsPanel.add(availableAefMaps);
VerticalPanel ecfButtonsPanel = new VerticalPanel();
ecfButtonsPanel.setSpacing(6);
ecfButtonsPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
ecfButtonsPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
ecfButtonsPanel.add(addAefMapButton);
ecfButtonsPanel.add(removeAefMapButton);
VerticalPanel selectedEcfsPanel = new VerticalPanel();
selectedEcfsPanel.setSpacing(6);
Label selectedLabel = new Label(Utils.constants.selected());
selectedEcfsPanel.add(selectedLabel);
selectedEcfsPanel.add(selectedAefMaps);
ecfsTable.setWidget(0, 0, availableEcfsPanel);
ecfsTable.setWidget(0, 1, ecfButtonsPanel);
ecfsTable.setWidget(0, 2, selectedEcfsPanel);
ecfsTable.getFlexCellFormatter().setVerticalAlignment(0, 1, HasVerticalAlignment.ALIGN_MIDDLE);
DisclosurePanel ecfsDisclosure = new DisclosurePanel(Utils.constants.ecfs());
ecfsDisclosure.setAnimationEnabled(true);
ecfsDisclosure.setContent(ecfsTable);
addAefMapButton.addStyleName(Utils.kaaAdminStyle.bAppButtonSmall());
removeAefMapButton.addStyleName(Utils.kaaAdminStyle.bAppButtonSmall());
addAefMapButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
addAefMap();
}
});
removeAefMapButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
removeAefMap();
}
});
availableAefMaps.setSize("250px", "100px");
selectedAefMaps.setSize("250px", "100px");
availableAefMaps.addValueChangeHandler(new ValueChangeHandler<List<AefMapInfoDto>>() {
@Override
public void onValueChange(ValueChangeEvent<List<AefMapInfoDto>> event) {
updateAefMapButtons();
}
});
selectedAefMaps.addValueChangeHandler(new ValueChangeHandler<List<AefMapInfoDto>>() {
@Override
public void onValueChange(ValueChangeEvent<List<AefMapInfoDto>> event) {
updateAefMapButtons();
}
});
detailsTable.setWidget(5, 0, ecfsDisclosure);
detailsTable.getFlexCellFormatter().setColSpan(5, 0, 2);
label = new Label(Utils.constants.defaultUserVerifier());
Renderer<UserVerifierDto> userVerifierRenderer = new Renderer<UserVerifierDto>() {
@Override
public String render(UserVerifierDto object) {
if (object != null) {
return object.getName();
} else {
return "";
}
}
@Override
public void render(UserVerifierDto object, Appendable appendable) throws IOException {
appendable.append(render(object));
}
};
defaultUserVerifier = new ValueListBox<>(userVerifierRenderer);
defaultUserVerifier.addValueChangeHandler(new ValueChangeHandler<UserVerifierDto>() {
@Override
public void onValueChange(ValueChangeEvent<UserVerifierDto> event) {
fireChanged();
}
});
detailsTable.setWidget(6, 0, label);
detailsTable.setWidget(6, 1, defaultUserVerifier);
}
@Override
public void onValueChange(ValueChangeEvent<VersionDto> event) {
fireChanged();
}
@Override
protected String getCreateTitle() {
return Utils.constants.addSdkProfile();
}
@Override
protected String getViewTitle() {
return Utils.constants.sdkProfiles();
}
@Override
protected String getSubTitle() {
return Utils.constants.sdkProfileDetails();
}
@Override
public HasValue<String> getName() {
return name;
}
@Override
public ValueListBox<VersionDto> getConfigurationSchemaVersion() {
return configurationSchemaVersion;
}
@Override
public ValueListBox<VersionDto> getProfileSchemaVersion() {
return profileSchemaVersion;
}
@Override
public ValueListBox<VersionDto> getNotificationSchemaVersion() {
return notificationSchemaVersion;
}
@Override
public ValueListBox<VersionDto> getLogSchemaVersion() {
return logSchemaVersion;
}
@Override
public MultiValueListBox<AefMapInfoDto> getSelectedAefMaps() {
return selectedAefMaps;
}
@Override
public ValueListBox<UserVerifierDto> getDefaultUserVerifier() {
return defaultUserVerifier;
}
@Override
public void setAefMaps(List<AefMapInfoDto> aefMaps) {
this.aefMaps = aefMaps;
Collections.sort(this.aefMaps, aefMapComparator);
availableAefMaps.setAcceptableValues(aefMaps);
}
@Override
protected void resetImpl() {
name.setValue("");
configurationSchemaVersion.reset();
profileSchemaVersion.reset();
notificationSchemaVersion.reset();
logSchemaVersion.reset();
availableAefMaps.reset();
selectedAefMaps.reset();
addAefMapButton.setEnabled(false);
removeAefMapButton.setEnabled(false);
defaultUserVerifier.setValue(null);
defaultUserVerifier.setAcceptableValues(Collections.<UserVerifierDto>emptyList());
}
@Override
protected boolean validate() {
boolean result = configurationSchemaVersion.getValue() != null;
result &= profileSchemaVersion.getValue() != null;
result &= notificationSchemaVersion.getValue() != null;
result &= logSchemaVersion.getValue() != null;
result &= name.getValue().length() > 0;
return result;
}
private void addAefMap() {
List<AefMapInfoDto> selected = availableAefMaps.getValue();
availableAefMaps.setValue(null, true);
Map<String, AefMapInfoDto> idMap = new HashMap<String, AefMapInfoDto>();
for (AefMapInfoDto aefMap : selected) {
AefMapInfoDto previous = idMap.get(aefMap.getEcfId());
if (previous == null || aefMap.getVersion() > previous.getVersion()) {
idMap.put(aefMap.getEcfId(), aefMap);
}
}
List<AefMapInfoDto> totalSelected = new ArrayList<>();
totalSelected.addAll(idMap.values());
totalSelected.addAll(selectedAefMaps.getValues());
updateAefMapLists(totalSelected);
}
private void removeAefMap() {
List<AefMapInfoDto> selected = selectedAefMaps.getValue();
selectedAefMaps.setValue(null, true);
List<AefMapInfoDto> totalSelected = new ArrayList<>();
for (AefMapInfoDto aefMap : selectedAefMaps.getValues()) {
if (!selected.contains(aefMap)) {
totalSelected.add(aefMap);
}
}
updateAefMapLists(totalSelected);
}
private void updateAefMapLists(List<AefMapInfoDto> totalSelected) {
List<AefMapInfoDto> available = new ArrayList<>();
Map<String, AefMapInfoDto> idMap = new HashMap<String, AefMapInfoDto>();
for (AefMapInfoDto aefMap : totalSelected) {
idMap.put(aefMap.getEcfId(), aefMap);
}
for (AefMapInfoDto aefMap : aefMaps) {
if (!idMap.containsKey(aefMap.getEcfId())) {
available.add(aefMap);
}
}
Collections.sort(available, aefMapComparator);
Collections.sort(totalSelected, aefMapComparator);
availableAefMaps.setAcceptableValues(available);
selectedAefMaps.setAcceptableValues(totalSelected);
}
private void updateAefMapButtons() {
boolean availableSelected = availableAefMaps.getValue() != null
&& !availableAefMaps.getValue().isEmpty();
boolean selectedSelected = selectedAefMaps.getValue() != null
&& !selectedAefMaps.getValue().isEmpty();
addAefMapButton.setEnabled(availableSelected);
removeAefMapButton.setEnabled(selectedSelected);
}
@Override
protected void updateSaveButton(boolean enabled, boolean invalid) {
getSaveButtonWidget().setText(Utils.constants.add());
getSaveButtonWidget().setEnabled(enabled);
}
class AefMapInfoDtoComparator implements Comparator<AefMapInfoDto> {
@Override
public int compare(AefMapInfoDto o1, AefMapInfoDto o2) {
int result = o1.getEcfName().compareTo(o2.getEcfName());
if (result == 0) {
result = o1.getVersion() - o2.getVersion();
}
return result;
}
}
}