Project

General

Profile

Download (10.3 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2017 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.cdm.addon.config;
10

    
11
import java.io.IOException;
12
import java.util.Arrays;
13
import java.util.List;
14
import java.util.Properties;
15

    
16
import javax.servlet.annotation.WebServlet;
17

    
18
import org.apache.log4j.Logger;
19
import org.springframework.beans.BeansException;
20
import org.springframework.beans.factory.annotation.Autowired;
21
import org.springframework.context.ApplicationContext;
22
import org.springframework.context.ApplicationContextAware;
23
import org.springframework.context.annotation.Bean;
24
import org.springframework.context.annotation.ComponentScan;
25
import org.springframework.context.annotation.ComponentScan.Filter;
26
import org.springframework.context.annotation.Configuration;
27
import org.springframework.context.annotation.FilterType;
28
import org.springframework.core.env.Environment;
29
import org.springframework.security.authentication.AuthenticationProvider;
30

    
31
import com.vaadin.spring.annotation.EnableVaadin;
32
import com.vaadin.spring.annotation.SpringUI;
33
import com.vaadin.spring.annotation.UIScope;
34
import com.vaadin.spring.server.SpringVaadinServlet;
35
import com.vaadin.ui.UI;
36

    
37
import eu.etaxonomy.cdm.api.application.AbstractDataInserter;
38
import eu.etaxonomy.cdm.api.application.CdmRepository;
39
import eu.etaxonomy.cdm.api.application.DummyDataInserter;
40
import eu.etaxonomy.cdm.api.service.idminter.RegistrationIdentifierMinter;
41
import eu.etaxonomy.cdm.common.ConfigFileUtil;
42
import eu.etaxonomy.cdm.dataInserter.RegistrationRequiredDataInserter;
43
import eu.etaxonomy.cdm.opt.config.DataSourceConfigurer;
44
import eu.etaxonomy.cdm.vaadin.security.annotation.EnableAnnotationBasedAccessControl;
45
import eu.etaxonomy.cdm.vaadin.ui.ConceptRelationshipUI;
46
import eu.etaxonomy.cdm.vaadin.ui.DistributionStatusUI;
47
import eu.etaxonomy.cdm.vaadin.ui.RegistrationUI;
48
import eu.etaxonomy.cdm.vaadin.ui.StatusEditorUI;
49
import eu.etaxonomy.vaadin.ui.annotation.EnableVaadinSpringNavigation;
50

    
51
/**
52
 *
53
 * @author a.kohlbecker
54
 * @since Feb 8, 2017
55
 *
56
 */
57
@Configuration
58
@ComponentScan(basePackages={
59
        "eu.etaxonomy.vaadin.ui",
60
        "eu.etaxonomy.cdm.vaadin",
61
        "eu.etaxonomy.cdm.service",
62
        "org.springframework.context.event"
63
        },
64
        // exclude UI classes, these are provided via the @Bean annotated methods below
65
        excludeFilters={@Filter(
66
                pattern="eu\\.etaxonomy\\.cdm\\.vaadin\\.ui\\..*",
67
                type=FilterType.REGEX
68
                )
69
            })
70
@EnableVaadin   // this imports VaadinConfiguration
71
@EnableVaadinSpringNavigation // activate the NavigationManagerBean
72
@EnableAnnotationBasedAccessControl // enable annotation based per view access control
73
public class CdmVaadinConfiguration implements ApplicationContextAware  {
74

    
75

    
76
    public static final String CDM_DATA_SOURCE_ID = DataSourceConfigurer.CDM_DATA_SOURCE_ID;
77

    
78
    public static final String CDM_VAADIN_UI_ACTIVATED = "cdm-vaadin.ui.activated";
79
    public static final String CDM_SERVICE_MINTER_REGSTRATION_MINID = "cdm.service.minter.registration.minLocalId";
80
    public static final String CDM_SERVICE_MINTER_REGSTRATION_MAXID = "cdm.service.minter.registration.maxLocalId";
81
    public static final String CDM_SERVICE_MINTER_REGSTRATION_IDFORMAT = "cdm.service.minter.registration.identifierFormatString";
82

    
83
    public static final Logger logger = Logger.getLogger(CdmVaadinConfiguration.class);
84

    
85
    @Autowired
86
    Environment env;
87

    
88
    /*
89
     * NOTE: It is necessary to map the URLs starting with /VAADIN/* since none of the
90
     * @WebServlets is mapped to the root path. It is sufficient to configure one of the
91
     * servlets with this path see BookOfVaadin 5.9.5. Servlet Mapping with URL Patterns
92
     */
93
    @WebServlet(value = {"/app/*", "/VAADIN/*"}, asyncSupported = true)
94
    public static class Servlet extends SpringVaadinServlet {
95

    
96
        private static final long serialVersionUID = -2615042297393028775L;
97

    
98

    
99
        /**
100
         *
101
        @SuppressWarnings("serial")
102
        @Override
103
        protected void servletInitialized() throws ServletException {
104
            getService().addSessionInitListener(new SessionInitListener() {
105

    
106
                @Override
107
                public void sessionInit(SessionInitEvent sessionInitEvent) throws ServiceException {
108
                    VaadinSession session = sessionInitEvent.getSession();
109
                    session.setErrorHandler(new DefaultErrorHandler(){
110

    
111
                        @Override
112
                        public void error(ErrorEvent errorEvent) {
113
                            // ...
114
                        }
115

    
116
                    });
117

    
118
                }});
119

    
120
        }
121
         */
122

    
123
    }
124

    
125
    public CdmVaadinConfiguration() {
126
        logger.debug("CdmVaadinConfiguration enabled");
127
    }
128

    
129
    @Bean
130
    @UIScope
131
    public ConceptRelationshipUI conceptRelationshipUI() {
132
        if(isUIEnabled(ConceptRelationshipUI.class)){
133
            return new ConceptRelationshipUI();
134
        }
135
        return null;
136
    }
137

    
138
    @Bean
139
    @UIScope
140
    public RegistrationUI registrationUI() {
141
        if(isUIEnabled(RegistrationUI.class)){
142
            return new RegistrationUI();
143
        }
144
        return null;
145
    }
146

    
147
    @Bean
148
    public AbstractDataInserter registrationRequiredDataInserter() throws BeansException{
149
        if(isUIEnabled(RegistrationUI.class)){
150
            RegistrationRequiredDataInserter inserter = new RegistrationRequiredDataInserter();
151

    
152
            inserter.setRunAsAuthenticationProvider((AuthenticationProvider) applicationContext.getBean("runAsAuthenticationProvider"));
153
            inserter.setCdmRepository((CdmRepository) applicationContext.getBean("cdmRepository"));
154
            return inserter;
155
        } else {
156
            // the return type implements ApplicationListener and thus must not be null,
157
            // therefore we return a empty dummy implementation.
158
            return new DummyDataInserter();
159
        }
160
    }
161

    
162
    @Bean
163
    public RegistrationIdentifierMinter registrationIdentifierMinter() throws IOException {
164
        RegistrationIdentifierMinter minter = new RegistrationIdentifierMinter();
165
        ensureVaadinAppPropertiesLoaded();
166
        minter.setMinLocalId(appProps.getProperty(CDM_SERVICE_MINTER_REGSTRATION_MINID));
167
        minter.setMaxLocalId(appProps.getProperty(CDM_SERVICE_MINTER_REGSTRATION_MAXID));
168
        minter.setIdentifierFormatString(appProps.getProperty(CDM_SERVICE_MINTER_REGSTRATION_IDFORMAT));
169
        return minter;
170
    }
171

    
172
    @Bean
173
    @UIScope
174
    public DistributionStatusUI distributionStatusUI() {
175
        if(isUIEnabled(DistributionStatusUI.class)){
176
            return new DistributionStatusUI();
177
        }
178
        return null;
179
    }
180

    
181
    @Bean
182
    @UIScope
183
    public StatusEditorUI statusEditorUI() {
184
        if(isUIEnabled(StatusEditorUI.class)){
185
            return new StatusEditorUI();
186
        }
187
        return null;
188
    }
189

    
190

    
191

    
192

    
193
    static final String PROPERTIES_FILE_NAME = "vaadin-apps";
194

    
195
    private Properties appProps = null;
196

    
197
    private ApplicationContext applicationContext;
198

    
199
    private List<String> activeUIpaths;
200

    
201
    //@formatter:off
202
    private static final String APP_FILE_CONTENT=
203
            "########################################################\n"+
204
            "#                                                       \n"+
205
            "# Vaadin application specific configurations            \n"+
206
            "#                                                       \n"+
207
            "########################################################\n"+
208
            "                                                        \n"+
209
            "# Enablement of vaadin uis.                             \n"+
210
            "#                                                       \n"+
211
            "# Multiple uis can be defined as comma separated list.  \n"+
212
            "# Whitespace before and after the comma will be ignored.\n"+
213
            "# Valid values are the path properties of the @SpringUI \n"+
214
            "# annotation which is used for UI classes.              \n"+
215
            "cdm-vaadin.ui.activated=concept,distribution,editstatus \n";
216
    //@formatter:on
217

    
218
    /**
219
     * Checks if the ui class supplied is activated by listing it in the properties by its {@link SpringUI#path()} value.
220
     *
221
     * TODO see https://dev.e-taxonomy.eu/redmine/issues/7139 (consider using spring profiles to enable vaadin UI contexts)
222
     *
223
     * @param type
224
     * @return
225
     */
226
    private boolean isUIEnabled(Class<? extends UI>uiClass) {
227

    
228
        String path = uiClass.getAnnotation(SpringUI.class).path().trim();
229

    
230
        if(activeUIpaths == null){
231
            try {
232

    
233
                String activatedVaadinUIs = env.getProperty(CDM_VAADIN_UI_ACTIVATED);
234
                if(activatedVaadinUIs == null){
235
                    // not in environment? Read it from the config file!
236
                    ensureVaadinAppPropertiesLoaded();
237
                    if(appProps.get(CDM_VAADIN_UI_ACTIVATED) != null){
238
                        activatedVaadinUIs = appProps.get(CDM_VAADIN_UI_ACTIVATED).toString();
239
                    }
240
                }
241

    
242
                if(activatedVaadinUIs != null) {
243
                    String[] uiPaths = activatedVaadinUIs.split("\\s*,\\s*");
244
                    this.activeUIpaths = Arrays.asList(uiPaths);
245
                }
246
            } catch (IOException e) {
247
                logger.error("Error reading the vaadin ui properties file. File corrupted?. Stopping instance ...");
248
                throw new RuntimeException(e);
249
            }
250
        }
251
        if(activeUIpaths.stream().anyMatch(p -> p.trim().equals(path))){
252
            return true;
253
        }
254
        return false;
255

    
256
    }
257

    
258
    /**
259
     * @param currentDataSourceId
260
     * @throws IOException
261
     */
262
    protected void ensureVaadinAppPropertiesLoaded() throws IOException {
263

    
264
        String currentDataSourceId = env.getProperty(CDM_DATA_SOURCE_ID);
265
        if(appProps == null){
266
            appProps = new ConfigFileUtil()
267
                    .setDefaultContent(APP_FILE_CONTENT)
268
                    .getProperties(currentDataSourceId, PROPERTIES_FILE_NAME);
269
        }
270
    }
271

    
272
    /**
273
     * {@inheritDoc}
274
     */
275
    @Override
276
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
277
        this.applicationContext = applicationContext;
278
    }
279

    
280

    
281
}
(1-1/2)