package kornell.gui.client.presentation.admin.institution.generic;
import java.util.ArrayList;
import java.util.List;
import com.github.gwtbootstrap.client.ui.Form;
import com.github.gwtbootstrap.client.ui.ListBox;
import com.github.gwtbootstrap.client.ui.constants.AlertType;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Widget;
import kornell.api.client.Callback;
import kornell.api.client.KornellSession;
import kornell.core.entity.ContentRepository;
import kornell.core.entity.EntityFactory;
import kornell.core.entity.Institution;
import kornell.core.entity.RepositoryType;
import kornell.core.to.InstitutionHostNamesTO;
import kornell.core.to.TOFactory;
import kornell.core.util.StringUtils;
import kornell.gui.client.util.forms.FormHelper;
import kornell.gui.client.util.forms.formfield.KornellFormFieldWrapper;
import kornell.gui.client.util.forms.formfield.ListBoxFormField;
import kornell.gui.client.util.view.KornellNotification;
public class GenericInstitutionRepositoryView extends Composite {
interface MyUiBinder extends UiBinder<Widget, GenericInstitutionRepositoryView> {
}
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
public static final TOFactory toFactory = GWT.create(TOFactory.class);
public static final EntityFactory entityFactory = GWT.create(EntityFactory.class);
private FormHelper formHelper = GWT.create(FormHelper.class);
private KornellSession session;
boolean isCurrentUser, showContactDetails, isRegisteredWithCPF;
private boolean isPlatformAdmin, isCreationMode;
private KornellFormFieldWrapper repositoryType;
private KornellFormFieldWrapper accessKeyId, secretAccessKey, bucketName, prefix, region;
private KornellFormFieldWrapper fsPath, fsPrefix;
private List<KornellFormFieldWrapper> s3Fields, fsFields;
@UiField
Form form;
@UiField
FlowPanel s3FieldsPanel, fsFieldsPanel, generalFieldsPanel;
@UiField
Button btnOK;
@UiField
Button btnCancel;
ListBox repositoryTypes;
private Institution institution;
private ContentRepository repo;
public GenericInstitutionRepositoryView(final KornellSession session,
kornell.gui.client.presentation.admin.institution.AdminInstitutionView.Presenter presenter, Institution institution,
ContentRepository repo) {
this.session = session;
this.institution = institution;
this.isPlatformAdmin = session.isPlatformAdmin();
this.isCreationMode = repo == null;
initWidget(uiBinder.createAndBindUi(this));
if (isCreationMode) {
this.repo = entityFactory.newContentRepository().as();
} else {
this.repo = repo;
}
// i18n
btnOK.setText("OK".toUpperCase());
btnCancel.setText("Limpar".toUpperCase());
initData();
}
public void initData() {
this.s3FieldsPanel.setVisible(false);
this.fsFieldsPanel.setVisible(false);
this.fsFields = new ArrayList<KornellFormFieldWrapper>();
this.s3Fields = new ArrayList<KornellFormFieldWrapper>();
this.generalFieldsPanel.clear();
this.s3FieldsPanel.clear();
this.fsFieldsPanel.clear();
repositoryTypes = new ListBox();
repositoryTypes.addItem("Filesystem", RepositoryType.FS.toString());
repositoryTypes.addItem("S3", RepositoryType.S3.toString());
if (repo == null) {
repositoryTypes.setSelectedValue(RepositoryType.S3.toString());
} else {
repositoryTypes.setSelectedValue(repo.getRepositoryType().toString());
}
//Common
repositoryType = new KornellFormFieldWrapper("Repository Type", new ListBoxFormField(repositoryTypes), isPlatformAdmin);
generalFieldsPanel.add(repositoryType);
((ListBox)repositoryType.getFieldWidget()).addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
toggleRepositoryTypeForm(repositoryTypes);
}
});
//S3
accessKeyId = new KornellFormFieldWrapper("Access Key ID", formHelper.createTextBoxFormField(repo.getAccessKeyId()), isPlatformAdmin);
s3FieldsPanel.add(accessKeyId);
s3Fields.add(accessKeyId);
secretAccessKey = new KornellFormFieldWrapper("Secret Access Key", formHelper.createTextBoxFormField(repo.getSecretAccessKey()), isPlatformAdmin);
s3FieldsPanel.add(secretAccessKey);
s3Fields.add(secretAccessKey);
bucketName = new KornellFormFieldWrapper("Bucket Name", formHelper.createTextBoxFormField(repo.getBucketName()), isPlatformAdmin);
s3FieldsPanel.add(bucketName);
s3Fields.add(bucketName);
prefix = new KornellFormFieldWrapper("Prefix", formHelper.createTextBoxFormField(repo.getPrefix()), isPlatformAdmin);
s3FieldsPanel.add(prefix);
s3Fields.add(prefix);
region = new KornellFormFieldWrapper("Region", formHelper.createTextBoxFormField(repo.getRegion()), isPlatformAdmin);
s3FieldsPanel.add(region);
s3Fields.add(region);
s3FieldsPanel.add(formHelper.getImageSeparator());
//FS
fsPath = new KornellFormFieldWrapper("Path", formHelper.createTextBoxFormField(repo.getPath()), isPlatformAdmin);
fsFieldsPanel.add(fsPath);
fsFields.add(fsPath);
fsPrefix = new KornellFormFieldWrapper("Prefix", formHelper.createTextBoxFormField(repo.getPrefix()), isPlatformAdmin);
fsFieldsPanel.add(fsPrefix);
fsFields.add(fsPrefix);
fsFieldsPanel.add(formHelper.getImageSeparator());
toggleRepositoryTypeForm(repositoryTypes);
}
private void toggleRepositoryTypeForm(final ListBox repositoryTypes) {
boolean showS3Form = repositoryTypes.getSelectedValue().equals(RepositoryType.S3.toString());
s3FieldsPanel.setVisible(showS3Form);
fsFieldsPanel.setVisible(!showS3Form);
}
private boolean validateContentRepositoryForm() {
if (repositoryTypes.getSelectedValue().equals(RepositoryType.S3.toString())) {
if (StringUtils.isNone(accessKeyId.getFieldPersistText())) {
accessKeyId.setError("Missing access key ID");
} else {
accessKeyId.setError("");
}
if (StringUtils.isNone(secretAccessKey.getFieldPersistText())) {
secretAccessKey.setError("Missing secret access key");
} else {
secretAccessKey.setError("");
}
if (StringUtils.isNone(bucketName.getFieldPersistText())) {
bucketName.setError("Missing bucket name");
} else {
bucketName.setError("");
}
if (StringUtils.isNone(prefix.getFieldPersistText())) {
prefix.setError("Missing prefix");
} else {
prefix.setError("");
}
if (StringUtils.isNone(region.getFieldPersistText())) {
region.setError("Missing region");
} else {
region.setError("");
}
} else {
if (StringUtils.isNone(fsPrefix.getFieldPersistText())) {
fsPrefix.setError("Missing prefix");
} else {
fsPrefix.setError("");
}
if (StringUtils.isNone(fsPath.getFieldPersistText())) {
fsPath.setError("Missing path");
} else {
fsPath.setError("");
}
}
return !checkErrors();
}
private boolean checkErrors() {
List<KornellFormFieldWrapper> fields;
if (repositoryTypes.getSelectedValue().equals(RepositoryType.S3.toString())) {
fields = s3Fields;
} else {
fields = fsFields;
}
for (KornellFormFieldWrapper field : fields) {
if(!"".equals(field.getError())) {
KornellNotification.show("There are errors with your content repository configuration", AlertType.WARNING);
if(field.getFieldWidget() instanceof FocusWidget) {
((FocusWidget)field.getFieldWidget()).setFocus(true);
}
return true;
}
}
return false;
}
@UiHandler("btnOK")
void doOK(ClickEvent e) {
if(session.isInstitutionAdmin() && validateContentRepositoryForm()){
ContentRepository contentRepository = entityFactory.newContentRepository().as();
contentRepository.setUUID(institution.getAssetsRepositoryUUID());
if (repositoryTypes.getSelectedValue().equals(RepositoryType.S3.toString())) {
contentRepository.setAccessKeyId(accessKeyId.getFieldPersistText());
contentRepository.setSecretAccessKey(secretAccessKey.getFieldPersistText());
contentRepository.setBucketName(bucketName.getFieldPersistText());
contentRepository.setPrefix(prefix.getFieldPersistText());
contentRepository.setRegion(region.getFieldPersistText());
contentRepository.setRepositoryType(RepositoryType.S3);
} else {
contentRepository.setPrefix(fsPrefix.getFieldPersistText());
contentRepository.setPath(fsPath.getFieldPersistText());
contentRepository.setRepositoryType(RepositoryType.FS);
}
InstitutionHostNamesTO institutionHostNamesTO = toFactory.newInstitutionHostNamesTO().as();
List<String> institutionHostNames = new ArrayList<String>();
institutionHostNamesTO.setInstitutionHostNames(institutionHostNames);
session.repository().updateRepository(institution.getAssetsRepositoryUUID(), contentRepository, new Callback<ContentRepository>() {
@Override
public void ok(ContentRepository to) {
KornellNotification.show("Os domínios da instituição foram atualizados com sucesso.", AlertType.SUCCESS);
}
});
}
}
@UiHandler("btnCancel")
void doCancel(ClickEvent e) {
initData();
}
}