package com.constellio.app.ui.pages.management.plugin; import static com.constellio.app.ui.i18n.i18n.$; import java.util.List; import java.util.Locale; import org.apache.commons.lang3.StringUtils; import com.constellio.app.services.extensions.plugins.PluginActivationFailureCause; import com.constellio.app.services.extensions.plugins.pluginInfo.ConstellioPluginInfo; import com.constellio.app.services.extensions.plugins.pluginInfo.ConstellioPluginStatus; import com.constellio.app.ui.framework.buttons.BaseButton; import com.constellio.app.ui.framework.components.BaseWindow; import com.constellio.app.ui.framework.components.fields.upload.BaseUploadField; import com.constellio.app.ui.framework.components.fields.upload.TempFileUpload; import com.constellio.app.ui.pages.base.BaseViewImpl; import com.vaadin.data.Container; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.data.util.BeanItemContainer; import com.vaadin.data.util.converter.Converter; import com.vaadin.event.ItemClickEvent; import com.vaadin.event.ItemClickEvent.ItemClickListener; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.ui.Button; import com.vaadin.ui.CheckBox; import com.vaadin.ui.Component; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Table; import com.vaadin.ui.Table.ColumnGenerator; import com.vaadin.ui.TextArea; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; import com.vaadin.ui.themes.ValoTheme; public class PluginManagementViewImpl extends BaseViewImpl implements PluginManagementView { PluginManagementPresenter presenter; private BaseUploadField fileUpload; public PluginManagementViewImpl() { super(); this.presenter = new PluginManagementPresenter(this); } @Override protected String getTitle() { return $("PluginManagementView.viewTitle"); } @Override protected Component buildMainComponent(ViewChangeEvent event) { VerticalLayout layout = new VerticalLayout(); layout.setSpacing(true); Label restartMessage = new Label($("PluginManagementView.restartRequired")); restartMessage.addStyleName(ValoTheme.LABEL_COLORED); restartMessage.addStyleName(ValoTheme.LABEL_BOLD); Button restart = new BaseButton($("PluginManagementView.restart")) { @Override protected void buttonClick(ClickEvent event) { presenter.restartRequested(); } }; HorizontalLayout restartPanel = new HorizontalLayout(restartMessage, restart); restartPanel.setSpacing(true); restartPanel.setVisible(presenter.isRestartMessageVisible()); fileUpload = new BaseUploadField(); fileUpload.setMultiValue(true); layout.addComponent(fileUpload); Button uploadButton = new BaseButton($("PluginManagementView.upload")) { @Override protected void buttonClick(ClickEvent event) { if (fileUpload.getValue() != null) { StringBuilder errors = new StringBuilder(); List<TempFileUpload> uploads = (List<TempFileUpload>) fileUpload.getValue(); for (TempFileUpload upload : uploads) { PluginActivationFailureCause cause = presenter.installPlugin(upload.getTempFile()); if (cause != null) { buildErrorMessage(errors, upload, cause); } } String error = errors.toString(); refreshPluginsList(); if (StringUtils.isNotBlank(error)) { showErrorMessage(error); } } } }; layout.addComponents(restartPanel, uploadButton); Table table = createPluginsTable(); layout.addComponent(table); return layout; } private void buildErrorMessage(StringBuilder errors, TempFileUpload upload, PluginActivationFailureCause cause) { errors.append(upload.getFileName()); errors.append(" : "); errors.append(cause.toString()); errors.append("<br/><br/>"); } private Table createPluginsTable() { List<ConstellioPluginInfo> plugins = presenter.getAllPlugins(); Table table = new Table($("PluginManagementView.plugins", plugins.size())); Container beanContainer = new BeanItemContainer<>(ConstellioPluginInfo.class); table.setContainerDataSource(beanContainer); table.addItems(plugins); table.addGeneratedColumn("enable", new ColumnGenerator() { @Override public Component generateCell(final Table source, final Object itemId, final Object columnId) { CheckBox enable = new CheckBox() { @Override public boolean isVisible() { return presenter.isEnableOrDisablePossible((ConstellioPluginInfo) itemId); } }; enable.setValue(presenter.isEnabled((ConstellioPluginInfo) itemId)); enable.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { presenter.enablePlugin((ConstellioPluginInfo) itemId, (Boolean) event.getProperty().getValue()); } }); return enable; } }); table.setPageLength(Math.min(15, plugins.size())); table.setWidth("100%"); //table.setColumnHeader("code", $("PluginManagementView.code")); table.setColumnHeader("title", $("PluginManagementView.title")); table.setColumnHeader("lastInstallDate", $("PluginManagementView.lastInstallDate")); table.setColumnHeader("pluginActivationFailureCause", $("PluginManagementView.pluginActivationFailureCause")); table.setColumnHeader("pluginStatus", $("PluginManagementView.pluginStatus")); //table.setColumnHeader("requiredConstellioVersion", $("PluginManagementView.requiredConstellioVersion")); table.setColumnHeader("version", $("PluginManagementView.version")); table.setColumnHeader("enable", ""); table.setColumnWidth("enable", 40); table.addItemClickListener(new ItemClickListener() { @Override public void itemClick(ItemClickEvent event) { ConstellioPluginInfo constellioPluginInfo = (ConstellioPluginInfo) event.getItemId(); if ("pluginActivationFailureCause".equals(event.getPropertyId()) && constellioPluginInfo.getPluginActivationFailureCause() != null) { Window window = new BaseWindow( $("PluginActivationFailureCause." + constellioPluginInfo.getPluginActivationFailureCause() .getCode())); window.center(); window.setWidth("50%"); VerticalLayout vLayout = new VerticalLayout(); vLayout.setHeightUndefined(); TextArea textArea = new TextArea(); textArea.setSizeFull(); String stackTrace = constellioPluginInfo.getStackTrace() != null ? constellioPluginInfo.getStackTrace() : ""; textArea.setValue(stackTrace); vLayout.addComponent(textArea); window.setContent(vLayout); UI.getCurrent().addWindow(window); } } }); table.setConverter("pluginActivationFailureCause", newConstellioPluginStatusFailureCauseConverter()); table.setConverter("pluginStatus", newConstellioPluginStatusConverter()); table.setVisibleColumns("title", "lastInstallDate", "pluginActivationFailureCause", "pluginStatus", /*"requiredConstellioVersion",*/ "version", "enable"); return table; } //FIXME private void refreshPluginsList() { navigateTo().pluginManagement(); } private Converter<String, ConstellioPluginStatus> newConstellioPluginStatusConverter() { return new Converter<String, ConstellioPluginStatus>() { @Override public ConstellioPluginStatus convertToModel(String value, Class<? extends ConstellioPluginStatus> targetType, Locale locale) throws ConversionException { return null; } @Override public String convertToPresentation(ConstellioPluginStatus value, Class<? extends String> targetType, Locale locale) throws ConversionException { return $("ConstellioPluginStatus." + value.getCode()); } @Override public Class<ConstellioPluginStatus> getModelType() { return ConstellioPluginStatus.class; } @Override public Class<String> getPresentationType() { return String.class; } }; } private Converter<String, PluginActivationFailureCause> newConstellioPluginStatusFailureCauseConverter() { return new Converter<String, PluginActivationFailureCause>() { @Override public PluginActivationFailureCause convertToModel(String value, Class<? extends PluginActivationFailureCause> targetType, Locale locale) throws ConversionException { return null; } @Override public String convertToPresentation(PluginActivationFailureCause value, Class<? extends String> targetType, Locale locale) throws ConversionException { if (value == null) { return ""; } else { return $("PluginManagementView.openError"); } } @Override public Class<PluginActivationFailureCause> getModelType() { return PluginActivationFailureCause.class; } @Override public Class<String> getPresentationType() { return String.class; } }; } }