/*
* 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.activity;
import static org.kaaproject.kaa.common.dto.ctl.CTLSchemaScopeDto.APPLICATION;
import static org.kaaproject.kaa.common.dto.ctl.CTLSchemaScopeDto.TENANT;
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.event.shared.EventBus;
import com.google.gwt.user.client.rpc.AsyncCallback;
import org.kaaproject.avro.ui.gwt.client.util.BusyAsyncCallback;
import org.kaaproject.avro.ui.gwt.client.widget.ActionsButton.ActionMenuItemListener;
import org.kaaproject.avro.ui.gwt.client.widget.dialog.ConfirmDialog;
import org.kaaproject.avro.ui.shared.RecordField;
import org.kaaproject.kaa.common.dto.ctl.CTLSchemaExportMethod;
import org.kaaproject.kaa.common.dto.ctl.CTLSchemaScopeDto;
import org.kaaproject.kaa.common.dto.ctl.CtlSchemaMetaInfoDto;
import org.kaaproject.kaa.server.admin.client.KaaAdmin;
import org.kaaproject.kaa.server.admin.client.mvp.ClientFactory;
import org.kaaproject.kaa.server.admin.client.mvp.place.ConfigurationSchemasPlace;
import org.kaaproject.kaa.server.admin.client.mvp.place.CtlSchemaPlace;
import org.kaaproject.kaa.server.admin.client.mvp.place.CtlSchemaPlace.SchemaType;
import org.kaaproject.kaa.server.admin.client.mvp.place.EventClassPlace;
import org.kaaproject.kaa.server.admin.client.mvp.place.LogSchemasPlace;
import org.kaaproject.kaa.server.admin.client.mvp.place.NotificationSchemasPlace;
import org.kaaproject.kaa.server.admin.client.mvp.place.ProfileSchemasPlace;
import org.kaaproject.kaa.server.admin.client.mvp.place.ServerProfileSchemasPlace;
import org.kaaproject.kaa.server.admin.client.mvp.view.CtlSchemaView;
import org.kaaproject.kaa.server.admin.client.mvp.view.widget.RecordPanel.FormDataLoader;
import org.kaaproject.kaa.server.admin.client.servlet.ServletHelper;
import org.kaaproject.kaa.server.admin.client.util.ErrorMessageCustomizer;
import org.kaaproject.kaa.server.admin.client.util.SchemaErrorMessageCustomizer;
import org.kaaproject.kaa.server.admin.client.util.Utils;
import org.kaaproject.kaa.server.admin.shared.schema.ConfigurationSchemaViewDto;
import org.kaaproject.kaa.server.admin.shared.schema.ConverterType;
import org.kaaproject.kaa.server.admin.shared.schema.CtlSchemaFormDto;
import org.kaaproject.kaa.server.admin.shared.schema.EventClassViewDto;
import org.kaaproject.kaa.server.admin.shared.schema.LogSchemaViewDto;
import org.kaaproject.kaa.server.admin.shared.schema.NotificationSchemaViewDto;
import org.kaaproject.kaa.server.admin.shared.schema.ProfileSchemaViewDto;
import org.kaaproject.kaa.server.admin.shared.schema.ServerProfileSchemaViewDto;
import java.util.Collections;
import java.util.List;
public class CtlSchemaActivity extends
AbstractDetailsActivity<CtlSchemaFormDto, CtlSchemaView, CtlSchemaPlace>
implements ErrorMessageCustomizer, FormDataLoader {
protected static final ErrorMessageCustomizer schemaErrorMessageCustomizer
= new SchemaErrorMessageCustomizer();
protected Integer version = null;
private String ctlSchemaId;
private String eventClassName;
public CtlSchemaActivity(CtlSchemaPlace place, ClientFactory clientFactory) {
super(place, clientFactory);
version = place.getVersion();
}
@Override
protected CtlSchemaFormDto newEntity() {
return null;
}
protected void bindDetailsView(boolean fireChanged) {
if (!create) {
List<Integer> schemaVersions = entity.getMetaInfo().getVersions();
Collections.sort(schemaVersions);
if (version == null && !schemaVersions.isEmpty()) {
version = schemaVersions.get(schemaVersions.size() - 1);
}
if (version != null) {
detailsView.getVersion().setValue(version);
}
detailsView.getVersion().setAcceptableValues(schemaVersions);
detailsView.setTitle(entity.getMetaInfo().getFqn());
registrations.add(detailsView.getExportActionsButton().addMenuItem(
Utils.constants.shallow(),
new ActionMenuItemListener() {
@Override
public void onMenuItemSelected() {
exportSchema(CTLSchemaExportMethod.SHALLOW);
}
}));
if (entity.hasDependencies()) {
registrations.add(detailsView.getExportActionsButton().addMenuItem(
Utils.constants.deep(),
new ActionMenuItemListener() {
@Override
public void onMenuItemSelected() {
exportSchema(CTLSchemaExportMethod.DEEP);
}
}));
registrations.add(detailsView.getExportActionsButton().addMenuItem(
Utils.constants.flat(),
new ActionMenuItemListener() {
@Override
public void onMenuItemSelected() {
exportSchema(CTLSchemaExportMethod.FLAT);
}
}));
}
registrations.add(detailsView.getExportActionsButton().addMenuItem(
Utils.constants.javaLibrary(),
new ActionMenuItemListener() {
@Override
public void onMenuItemSelected() {
exportSchema(CTLSchemaExportMethod.LIBRARY);
}
}));
}
detailsView.getScope().setText(Utils.getCtlScopeTitleString(entity.getMetaInfo().getScope()));
detailsView.getCreatedUsername().setValue(entity.getCreatedUsername());
detailsView
.getCreatedDateTime()
.setValue(Utils.millisecondsToDateTimeString(entity.getCreatedTime()));
detailsView.getSchemaForm().setValue(entity.getSchema(), fireChanged);
}
protected void exportSchema(CTLSchemaExportMethod method) {
AsyncCallback<String> schemaExportCallback = new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
Utils.handleException(caught, detailsView);
}
@Override
public void onSuccess(String key) {
ServletHelper.exportCtlSchema(key);
}
};
KaaAdmin.getDataSource().prepareCtlSchemaExport(entity.getId(), method, schemaExportCallback);
}
@Override
protected void onSave() {
entity.setSchema(detailsView.getSchemaForm().getValue());
}
@Override
public String customizeErrorMessage(Throwable caught) {
String errorMessage = schemaErrorMessageCustomizer.customizeErrorMessage(caught);
if (errorMessage == null) {
errorMessage = caught.getLocalizedMessage();
}
return errorMessage;
}
@Override
protected CtlSchemaView getView(boolean create) {
if (create) {
return clientFactory.getCreateCtlSchemaView();
} else {
if (place.isEditable()) {
if (place.getScope() == APPLICATION) {
return clientFactory.getEditApplicationCtlSchemaView();
} else {
return clientFactory.getEditCtlSchemaView();
}
} else {
return clientFactory.getViewCtlSchemaView();
}
}
}
@Override
protected void getEntity(String id,
AsyncCallback<CtlSchemaFormDto> callback) {
if (version == null) {
KaaAdmin.getDataSource().getLatestCtlSchemaForm(id, callback);
} else {
KaaAdmin.getDataSource().getCtlSchemaFormByMetaInfoIdAndVer(id, version, callback);
}
}
@Override
protected void editEntity(final CtlSchemaFormDto entity,
final AsyncCallback<CtlSchemaFormDto> callback) {
if (place.getScope().getLevel() > CTLSchemaScopeDto.SYSTEM.getLevel()) {
KaaAdmin.getDataSource().checkFqnExists(entity, new BusyAsyncCallback<Boolean>() {
@Override
public void onFailureImpl(Throwable caught) {
Utils.handleException(caught, detailsView);
}
@Override
public void onSuccessImpl(Boolean result) {
if (!result) {
editSchema(entity, callback);
} else {
ConfirmDialog.ConfirmListener listener = new ConfirmDialog.ConfirmListener() {
@Override
public void onNo() {
}
@Override
public void onYes() {
editSchema(entity, callback);
}
};
ConfirmDialog dialog = new ConfirmDialog(listener,
Utils.messages.commonTypeFqnAlreadyExistTitle(),
Utils.messages.commonTypeFqnAlreadyExistsQuestion()
);
dialog.center();
dialog.show();
}
}
});
} else {
editSchema(entity, callback);
}
}
@Override
protected String getEntityId(CtlSchemaPlace place) {
return place.isCreate() ? null : place.getMetaInfoId();
}
@Override
protected void bind(final EventBus eventBus) {
if (create) {
detailsView.getSchemaForm().setFormDataLoader(this);
} else {
registrations.add(detailsView.getVersion().addValueChangeHandler(
new ValueChangeHandler<Integer>() {
@Override
public void onValueChange(ValueChangeEvent<Integer> event) {
detailsView.getVersion().setValue(version);
if (place.getScope() == TENANT) {
goTo(new CtlSchemaPlace(
place.getMetaInfoId(), event.getValue(), place.getScope(),
place.getEcfId(), place.getEcfVersionId(), place.getEcfVersion(),
place.isEditable(), false)
);
} else {
goTo(new CtlSchemaPlace(place.getMetaInfoId(), event.getValue(), place.getScope(),
place.getApplicationId(), place.isEditable(), false));
}
}
}));
registrations.add(detailsView.getCreateNewSchemaVersionButton().addClickHandler(
new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Integer version = detailsView.getVersion().getValue();
CtlSchemaPlace newPlace = null;
if (place.getScope() == TENANT) {
newPlace = new CtlSchemaPlace(place.getMetaInfoId(), version, place.getScope(),
place.getEcfId(), place.getEcfVersionId(), place.getEcfVersion(), true, true);
} else {
newPlace = new CtlSchemaPlace(
place.getMetaInfoId(), version, place.getScope(),
place.getApplicationId(), true, true);
}
newPlace.setPreviousPlace(place);
goTo(newPlace);
}
}));
registrations.add(detailsView.getUpdateSchemaScopeButton().addClickHandler(
new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
CtlSchemaMetaInfoDto metaInfo = entity.getMetaInfo();
KaaAdmin.getDataSource().promoteScopeToTenant(metaInfo.getApplicationId(),
metaInfo.getFqn(),
new BusyAsyncCallback<CtlSchemaMetaInfoDto>() {
@Override
public void onFailureImpl(Throwable caught) {
Utils.handleException(caught, detailsView);
}
@Override
public void onSuccessImpl(CtlSchemaMetaInfoDto result) {
CtlSchemaPlace place = null;
if (CtlSchemaActivity.this.place.getScope() == APPLICATION) {
place = new CtlSchemaPlace(result.getId(), version, result.getScope(),
CtlSchemaActivity.this.place.getApplicationId(),
result.getScope() == APPLICATION, false);
} else if (CtlSchemaActivity.this.place.getScope() == TENANT) {
place = new CtlSchemaPlace(result.getId(), version, result.getScope(),
CtlSchemaActivity.this.place.getEcfId(),
CtlSchemaActivity.this.place.getEcfVersionId(),
CtlSchemaActivity.this.place.getEcfVersion(),
result.getScope() == TENANT, false);
}
goTo(place);
}
});
}
}));
registrations.add(detailsView.getDeleteSchemaVersionButton().addClickHandler(
new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
final Integer version = detailsView.getVersion().getValue();
final String fqn = entity.getMetaInfo().getFqn();
ConfirmDialog.ConfirmListener listener = new ConfirmDialog.ConfirmListener() {
@Override
public void onNo() {
}
@Override
public void onYes() {
KaaAdmin.getDataSource().deleteCtlSchemaByFqnVersionTenantIdAndApplicationId(
fqn, version, entity.getMetaInfo().getTenantId(),
place.getApplicationId(), new BusyAsyncCallback<Void>() {
@Override
public void onSuccessImpl(Void result) {
List<Integer> versions = entity.getMetaInfo().getVersions();
versions.remove(version);
if (versions.isEmpty()) {
goTo(place.getPreviousPlace());
} else {
if (place.getScope() == APPLICATION) {
goTo(new CtlSchemaPlace(place.getMetaInfoId(),
versions.get(versions.size() - 1), place.getScope(),
place.getApplicationId(), true, false));
} else if (place.getScope() == TENANT) {
goTo(new CtlSchemaPlace(place.getMetaInfoId(),
versions.get(versions.size() - 1), place.getScope(),
place.getEcfId(), place.getEcfVersionId(),
place.getEcfVersion(), true, false));
}
}
}
@Override
public void onFailureImpl(Throwable caught) {
Utils.handleException(caught, detailsView);
}
});
}
};
ConfirmDialog dialog = new ConfirmDialog(listener,
Utils.messages.deleteCommonTypeVersionTitle(),
Utils.messages.deleteCommonTypeVersionQuestion(fqn, version.toString()));
dialog.center();
dialog.show();
}
})
);
}
super.bind(eventBus);
}
@Override
protected void onEntityRetrieved() {
if (create) {
ConverterType converterType;
if (place.getSchemaType() == SchemaType.CONFIGURATION) {
converterType = ConverterType.CONFIGURATION_FORM_AVRO_CONVERTER;
} else {
converterType = ConverterType.FORM_AVRO_CONVERTER;
}
KaaAdmin.getDataSource().createNewCtlSchemaFormInstance(place.getMetaInfoId(),
place.getVersion(), place.getApplicationId(), converterType,
new BusyAsyncCallback<CtlSchemaFormDto>() {
@Override
public void onSuccessImpl(CtlSchemaFormDto result) {
entity = result;
if (place.getSchemaType() != null) {
entity.getSchema().setDisplayNameFieldOptional(false);
}
bindDetailsView(true);
}
@Override
public void onFailureImpl(Throwable caught) {
Utils.handleException(caught, detailsView);
}
});
} else {
if (entity == null) {
goTo(place.getPreviousPlace());
} else {
bindDetailsView(false);
}
}
}
@Override
protected void doSave(final EventBus eventBus) {
onSave();
editEntity(entity,
new BusyAsyncCallback<CtlSchemaFormDto>() {
public void onSuccessImpl(CtlSchemaFormDto result) {
if (!create) {
if (place.getScope() == APPLICATION) {
goTo(new CtlSchemaPlace(place.getMetaInfoId(),
place.getVersion(), place.getScope(), place.getApplicationId(), true, false));
} else if (place.getScope() == TENANT) {
goTo(new CtlSchemaPlace(place.getMetaInfoId(), place.getVersion(),
place.getScope(), place.getEcfId(),
place.getEcfVersionId(), place.getEcfVersion(), true, false));
}
} else if (place.getSchemaType() != null) {
if (place.getSchemaType() == SchemaType.ENDPOINT_PROFILE) {
goTo(new ProfileSchemasPlace(place.getApplicationId()));
} else if (place.getSchemaType() == SchemaType.CONFIGURATION) {
goTo(new ConfigurationSchemasPlace(place.getApplicationId()));
} else if (place.getSchemaType() == SchemaType.SERVER_PROFILE) {
goTo(new ServerProfileSchemasPlace(place.getApplicationId()));
} else if (place.getSchemaType() == SchemaType.NOTIFICATION) {
goTo(new NotificationSchemasPlace(place.getApplicationId()));
} else if (place.getSchemaType() == SchemaType.LOG_SCHEMA) {
goTo(new LogSchemasPlace(place.getApplicationId()));
} else if (place.getSchemaType() == SchemaType.EVENT_CLASS
&& place.getPreviousPlace() != null) {
EventClassPlace eventClassPlace = new EventClassPlace(place.getEcfId(),
place.getEcfVersionId(), place.getEcfVersion(), "");
eventClassPlace.setCtlSchemaId(ctlSchemaId);
eventClassPlace.setNameEc(eventClassName);
goTo(eventClassPlace);
}
} else if (place.getPreviousPlace() != null) {
goTo(place.getPreviousPlace());
}
}
public void onFailureImpl(Throwable caught) {
Utils.handleException(caught, detailsView);
}
});
}
@Override
public void loadFormData(String fileItemName,
final AsyncCallback<RecordField> callback) {
KaaAdmin.getDataSource().generateCtlSchemaForm(fileItemName, place.getApplicationId(),
new AsyncCallback<RecordField>() {
@Override
public void onSuccess(RecordField result) {
if (place.getSchemaType() != null) {
result.setDisplayNameFieldOptional(false);
}
callback.onSuccess(result);
}
@Override
public void onFailure(Throwable caught) {
callback.onFailure(caught);
}
});
}
protected void editSchema(CtlSchemaFormDto entity,
final AsyncCallback<CtlSchemaFormDto> callback) {
if (create && place.getSchemaType() != null) {
if (place.getSchemaType() == SchemaType.ENDPOINT_PROFILE) {
KaaAdmin.getDataSource().createProfileSchemaFormCtlSchema(entity,
new BusyAsyncCallback<ProfileSchemaViewDto>() {
@Override
public void onFailureImpl(Throwable caught) {
callback.onFailure(caught);
}
@Override
public void onSuccessImpl(ProfileSchemaViewDto result) {
callback.onSuccess(null);
}
});
} else if (place.getSchemaType() == SchemaType.CONFIGURATION) {
KaaAdmin.getDataSource().createConfigurationSchemaFormCtlSchema(entity,
new BusyAsyncCallback<ConfigurationSchemaViewDto>() {
@Override
public void onFailureImpl(Throwable caught) {
callback.onFailure(caught);
}
@Override
public void onSuccessImpl(ConfigurationSchemaViewDto result) {
callback.onSuccess(null);
}
});
} else if (place.getSchemaType() == SchemaType.SERVER_PROFILE) {
KaaAdmin.getDataSource().createServerProfileSchemaFormCtlSchema(entity,
new BusyAsyncCallback<ServerProfileSchemaViewDto>() {
@Override
public void onFailureImpl(Throwable caught) {
callback.onFailure(caught);
}
@Override
public void onSuccessImpl(ServerProfileSchemaViewDto result) {
callback.onSuccess(null);
}
});
} else if (place.getSchemaType() == SchemaType.NOTIFICATION) {
KaaAdmin.getDataSource().createNotificationSchemaFormCtlSchema(entity,
new BusyAsyncCallback<NotificationSchemaViewDto>() {
@Override
public void onFailureImpl(Throwable caught) {
callback.onFailure(caught);
}
@Override
public void onSuccessImpl(NotificationSchemaViewDto notificationSchemaViewDto) {
callback.onSuccess(null);
}
});
} else if (place.getSchemaType() == SchemaType.LOG_SCHEMA) {
KaaAdmin.getDataSource().createLogSchemaFormCtlSchema(entity,
new BusyAsyncCallback<LogSchemaViewDto>() {
@Override
public void onFailureImpl(Throwable caught) {
callback.onFailure(caught);
}
@Override
public void onSuccessImpl(LogSchemaViewDto logSchemaViewDto) {
callback.onSuccess(null);
}
});
} else if (place.getSchemaType() == SchemaType.EVENT_CLASS) {
KaaAdmin.getDataSource().createEventClassFormCtlSchema(entity,
new BusyAsyncCallback<EventClassViewDto>() {
@Override
public void onFailureImpl(Throwable caught) {
callback.onFailure(caught);
}
@Override
public void onSuccessImpl(EventClassViewDto eventClassViewDto) {
ctlSchemaId = eventClassViewDto.getSchema().getCtlSchemaId();
eventClassName = eventClassViewDto.getSchema().getName();
callback.onSuccess(null);
}
});
}
} else {
KaaAdmin.getDataSource().editCtlSchemaForm(entity, ConverterType.FORM_AVRO_CONVERTER,
callback);
}
}
}