/** * Copyright (C) 2015 Valkyrie RCP * * 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.valkyriercp.application.config.support; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.gson.Gson; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.binding.convert.ConversionService; import org.springframework.binding.convert.service.DefaultConversionService; import org.springframework.context.ApplicationContext; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Lazy; import org.springframework.context.support.MessageSourceAccessor; import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.core.io.Resource; import org.springframework.security.access.AccessDecisionVoter; import org.springframework.security.access.vote.AffirmativeBased; import org.springframework.security.access.vote.RoleVoter; import org.valkyriercp.application.*; import org.valkyriercp.application.config.ApplicationConfig; import org.valkyriercp.application.config.ApplicationLifecycleAdvisor; import org.valkyriercp.application.config.ApplicationMode; import org.valkyriercp.application.config.ApplicationObjectConfigurer; import org.valkyriercp.application.exceptionhandling.DelegatingExceptionHandler; import org.valkyriercp.application.exceptionhandling.JXErrorDialogExceptionHandler; import org.valkyriercp.application.exceptionhandling.RegisterableExceptionHandler; import org.valkyriercp.application.exceptionhandling.SimpleExceptionHandlerDelegate; import org.valkyriercp.application.session.ApplicationSession; import org.valkyriercp.application.session.ApplicationSessionInitializer; import org.valkyriercp.application.support.*; import org.valkyriercp.binding.form.BindingErrorMessageProvider; import org.valkyriercp.binding.form.FieldFaceSource; import org.valkyriercp.binding.form.support.DefaultBindingErrorMessageProvider; import org.valkyriercp.binding.form.support.MessageSourceFieldFaceSource; import org.valkyriercp.binding.value.ValueChangeDetector; import org.valkyriercp.binding.value.support.DefaultValueChangeDetector; import org.valkyriercp.command.CommandConfigurer; import org.valkyriercp.command.CommandManager; import org.valkyriercp.command.CommandRegistry; import org.valkyriercp.command.CommandServices; import org.valkyriercp.command.config.DefaultCommandConfig; import org.valkyriercp.command.config.DefaultCommandConfigurer; import org.valkyriercp.command.support.DefaultCommandManager; import org.valkyriercp.command.support.DefaultCommandRegistry; import org.valkyriercp.command.support.DefaultCommandServices; import org.valkyriercp.component.DefaultOverlayService; import org.valkyriercp.component.DefaultTitlePaneConfigurer; import org.valkyriercp.component.OverlayService; import org.valkyriercp.component.TitlePaneConfigurer; import org.valkyriercp.convert.support.CollectionToListModelConverter; import org.valkyriercp.convert.support.ListToListModelConverter; import org.valkyriercp.factory.*; import org.valkyriercp.form.FormModelFactory; import org.valkyriercp.form.binding.BinderSelectionStrategy; import org.valkyriercp.form.binding.BindingFactoryProvider; import org.valkyriercp.form.binding.swing.ScrollPaneBinder; import org.valkyriercp.form.binding.swing.SwingBinderSelectionStrategy; import org.valkyriercp.form.binding.swing.SwingBindingFactoryProvider; import org.valkyriercp.form.builder.*; import org.valkyriercp.image.DefaultIconSource; import org.valkyriercp.image.DefaultImageSource; import org.valkyriercp.image.IconSource; import org.valkyriercp.image.ImageSource; import org.valkyriercp.rules.RulesSource; import org.valkyriercp.rules.reporting.DefaultMessageTranslatorFactory; import org.valkyriercp.rules.reporting.MessageTranslatorFactory; import org.valkyriercp.rules.support.DefaultRulesSource; import org.valkyriercp.security.ApplicationSecurityManager; import org.valkyriercp.security.SecurityAwareConfigurer; import org.valkyriercp.security.SecurityController; import org.valkyriercp.security.SecurityControllerManager; import org.valkyriercp.security.support.AuthorityConfigurableSecurityController; import org.valkyriercp.security.support.DefaultApplicationSecurityManager; import org.valkyriercp.security.support.DefaultSecurityControllerManager; import org.valkyriercp.util.DialogFactory; import org.valkyriercp.util.ValkyrieRepository; import org.valkyriercp.widget.Widget; import org.valkyriercp.widget.WidgetViewDescriptor; import javax.swing.*; import javax.swing.text.JTextComponent; import java.awt.*; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; import java.util.List; @Configuration @Import(org.valkyriercp.application.config.support.DefaultBinderConfig.class) @Lazy public abstract class AbstractApplicationConfig implements ApplicationConfig { @Autowired private ApplicationContext applicationContext; @Autowired private org.valkyriercp.application.config.support.DefaultBinderConfig defaultBinderConfig; @Bean public ValkyrieRepository valkyrieRepository() { return new ValkyrieRepository(); } public ApplicationContext applicationContext() { return applicationContext; } @Bean(destroyMethod = "") // @Bean public Application application() { return new DefaultApplication(); } @Bean public ApplicationPageFactory applicationPageFactory() { return new DefaultApplicationPageFactory(); } @Bean public ApplicationWindowFactory applicationWindowFactory() { return new DefaultApplicationWindowFactory(); } @Bean public ApplicationLifecycleAdvisor applicationLifecycleAdvisor() { DefaultApplicationLifecycleAdvisor advisor = new DefaultApplicationLifecycleAdvisor(); advisor.setCommandConfigClass(getCommandConfigClass()); advisor.setStartingPageDescriptor(new SingleViewPageDescriptor( emptyViewDescriptor())); return advisor; } @Bean public ViewDescriptor emptyViewDescriptor() { return new WidgetViewDescriptor("empty", Widget.EMPTY_WIDGET_PROVIDER); } @Bean public ApplicationDescriptor applicationDescriptor() { DefaultApplicationDescriptor defaultApplicationDescriptor = new DefaultApplicationDescriptor(); applicationObjectConfigurer().configure(defaultApplicationDescriptor, "applicationDescriptor"); return defaultApplicationDescriptor; } @Bean public ImageSource imageSource() { DefaultImageSource imageSource; Properties images = new Properties(); Gson gson = new Gson(); try { for (Resource res : getImageSourceResources().values()) { if(res.getFilename().endsWith("properties")) { images.load(res.getInputStream()); } else if(res.getFilename().endsWith("json")) { images.putAll(gson.fromJson(new InputStreamReader(res.getInputStream()), Map.class)); } } imageSource = new DefaultImageSource(images); } catch (IOException e) { throw new IllegalArgumentException( "Error getting imagesource json file", e); } imageSource.setBrokenImageIndicator(applicationContext().getResource( "classpath:/com/famfamfam/silk/error.png")); return imageSource; } public Map<String, Resource> getImageSourceResources() { Map<String, Resource> resources = new HashMap<String, Resource>(); resources.put( "default", applicationContext().getResource( "classpath:/org/valkyriercp/images/images.properties")); return resources; } @Bean public WindowManager windowManager() { return new WindowManager(); } @Bean public CommandServices commandServices() { return new DefaultCommandServices(); } @Bean public CommandConfigurer commandConfigurer() { return new DefaultCommandConfigurer(); } @Bean public CommandRegistry commandRegistry() { return new DefaultCommandRegistry(); } @Bean public PageComponentPaneFactory pageComponentPaneFactory() { return new SimplePageComponentPaneFactory(); } @Bean public ViewDescriptorRegistry viewDescriptorRegistry() { return new BeanFactoryViewDescriptorRegistry(); } @Bean public IconSource iconSource() { return new DefaultIconSource(); } @Bean public ComponentFactory componentFactory() { return new DefaultComponentFactory(); } @Bean public ButtonFactory buttonFactory() { return new DefaultButtonFactory(); } @Bean public MenuFactory menuFactory() { return new DefaultMenuFactory(); } @Bean public ButtonFactory toolbarButtonFactory() { return new DefaultButtonFactory(); } @Bean public MessageSourceAccessor messageSourceAccessor() { return new MessageSourceAccessor(messageSource()); } @Bean public MessageSource messageSource() { ResourceBundleMessageSource messageSource = createMessageSourceImpl(); messageSource.setBasenames(getResourceBundleLocations().toArray( new String[getResourceBundleLocations().size()])); return messageSource; } protected ResourceBundleMessageSource createMessageSourceImpl() { return new ResourceBundleMessageSource(); } public List<String> getResourceBundleLocations() { ArrayList<String> list = new ArrayList<String>(); list.add("org.valkyriercp.messages.default"); return list; } @Bean public ApplicationObjectConfigurer applicationObjectConfigurer() { return new DefaultApplicationObjectConfigurer(); } @Bean public SecurityControllerManager securityControllerManager() { DefaultSecurityControllerManager defaultSecurityControllerManager = new DefaultSecurityControllerManager(); defaultSecurityControllerManager .setFallbackSecurityController(authorityConfigurableSecurityController()); return defaultSecurityControllerManager; } @Bean public SecurityController authorityConfigurableSecurityController() { AuthorityConfigurableSecurityController authorityConfigurableSecurityController = new AuthorityConfigurableSecurityController(); Map<String, String> idAuthorityMap = Maps.newHashMap(); configureAuthorityMap(idAuthorityMap); authorityConfigurableSecurityController .setIdAuthorityMap(idAuthorityMap); AffirmativeBased accessDecisionManager = new AffirmativeBased(); RoleVoter roleVoter = new RoleVoter(); roleVoter.setRolePrefix(""); accessDecisionManager.setDecisionVoters(Lists .<AccessDecisionVoter> newArrayList(roleVoter)); authorityConfigurableSecurityController .setAccessDecisionManager(accessDecisionManager); return authorityConfigurableSecurityController; } protected void configureAuthorityMap(Map<String, String> idAuthorityMap) { } public Class<?> getCommandConfigClass() { return DefaultCommandConfig.class; } @Bean public RegisterableExceptionHandler registerableExceptionHandler() { JXErrorDialogExceptionHandler errorDialogExceptionHandler = new JXErrorDialogExceptionHandler(); DelegatingExceptionHandler handler = new DelegatingExceptionHandler(); handler.addDelegateToList(new SimpleExceptionHandlerDelegate() .forThrowable(Throwable.class).handledBy( errorDialogExceptionHandler)); return handler; } @Bean public ApplicationSession applicationSession() { return new ApplicationSession(); } @Bean public ApplicationSessionInitializer applicationSessionInitializer() { return new ApplicationSessionInitializer(); } @Bean public MessageResolver messageResolver() { return new MessageResolver(); } @Bean public CommandManager commandManager() { return new DefaultCommandManager(); } @Bean public ValueChangeDetector valueChangeDetector() { return new DefaultValueChangeDetector(); } @Bean public MessageTranslatorFactory messageTranslatorFactory() { return new DefaultMessageTranslatorFactory(); } @Bean public RulesSource rulesSource() { return new DefaultRulesSource(); } @Bean public FieldFaceSource fieldFaceSource() { return new MessageSourceFieldFaceSource(); } @Bean public ConversionService conversionService() { DefaultConversionService conversionService = new DefaultConversionService(); conversionService.addConverter(new ListToListModelConverter()); conversionService.addConverter(new CollectionToListModelConverter()); return conversionService; } @Bean public FormComponentInterceptorFactory formComponentInterceptorFactory() { ChainedInterceptorFactory factory = new ChainedInterceptorFactory(); List<FormComponentInterceptorFactory> factories = Lists.newArrayList(); factories.add(new ColorValidationInterceptorFactory()); factories.add(new OverlayValidationInterceptorFactory()); factories.add(new ShowCaptionInStatusBarInterceptorFactory()); factory.setInterceptorFactories(factories); return factory; } @Bean public BinderSelectionStrategy binderSelectionStrategy() { SwingBinderSelectionStrategy swingBinderSelectionStrategy = new SwingBinderSelectionStrategy(); registerBinders(swingBinderSelectionStrategy); return swingBinderSelectionStrategy; } protected void registerBinders( BinderSelectionStrategy binderSelectionStrategy) { binderSelectionStrategy .registerBinderForControlType(JTextComponent.class, defaultBinderConfig.textComponentBinder()); binderSelectionStrategy.registerBinderForControlType( JFormattedTextField.class, defaultBinderConfig.formattedTextFieldBinder()); binderSelectionStrategy.registerBinderForControlType(JTextArea.class, defaultBinderConfig.textAreaBinder()); binderSelectionStrategy.registerBinderForControlType( JToggleButton.class, defaultBinderConfig.toggleButtonBinder()); binderSelectionStrategy.registerBinderForControlType(JCheckBox.class, defaultBinderConfig.checkBoxBinder()); binderSelectionStrategy.registerBinderForControlType(JComboBox.class, defaultBinderConfig.comboBoxBinder()); binderSelectionStrategy.registerBinderForControlType(JList.class, defaultBinderConfig.listBinder()); binderSelectionStrategy.registerBinderForControlType(JLabel.class, defaultBinderConfig.labelBinder()); binderSelectionStrategy.registerBinderForControlType(JScrollPane.class, new ScrollPaneBinder(binderSelectionStrategy, JTextArea.class)); binderSelectionStrategy.registerBinderForPropertyType(String.class, defaultBinderConfig.textComponentBinder()); binderSelectionStrategy.registerBinderForPropertyType(boolean.class, defaultBinderConfig.checkBoxBinder()); binderSelectionStrategy.registerBinderForPropertyType(Boolean.class, defaultBinderConfig.checkBoxBinder()); binderSelectionStrategy.registerBinderForPropertyType(Enum.class, defaultBinderConfig.enumComboBoxBinder()); binderSelectionStrategy.registerBinderForPropertyType(Boolean.class, defaultBinderConfig.trueFalseNullBinder()); } @Bean public BindingFactoryProvider bindingFactoryProvider() { return new SwingBindingFactoryProvider(); } @Bean public BindingErrorMessageProvider bindingErrorMessageProvider() { return new DefaultBindingErrorMessageProvider(); } @Bean public DialogFactory dialogFactory() { return new DialogFactory(); } @Bean public OverlayService overlayService() { return new DefaultOverlayService(); } @Bean public TableFactory tableFactory() { return new DefaultTableFactory(); } @Bean public ApplicationSecurityManager applicationSecurityManager() { return new DefaultApplicationSecurityManager(false); } @Bean public SecurityAwareConfigurer securityAwareConfigurer() { return new SecurityAwareConfigurer(); } @Bean public FormModelFactory formModelFactory() { return new FormModelFactory(); } @Override @Bean public Color titlePaneBackgroundColor() { return new Color(200, 200, 200); } @Override @Bean public Color titlePanePinstripeColor() { return new Color(1f, 1f, 1f, 0.17f); } @Bean public TitlePaneConfigurer titlePaneConfigurer() { return new DefaultTitlePaneConfigurer(); } @Bean public static ApplicationObjectConfigurerBeanPostProcessor applicationObjectConfigurerBeanPostProcessor() { return new ApplicationObjectConfigurerBeanPostProcessor(); } @Override public ApplicationMode getApplicationMode() { return ApplicationMode.DEVELOPMENT; } }