/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 de.unioninvestment.eai.portal.portlet.crud.domain.model;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import de.unioninvestment.eai.portal.portlet.crud.config.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import de.unioninvestment.crud2go.spi.security.CryptorFactory;
import de.unioninvestment.eai.portal.portlet.crud.config.resource.Config;
import de.unioninvestment.eai.portal.portlet.crud.domain.database.ConnectionPool;
import de.unioninvestment.eai.portal.portlet.crud.domain.database.ConnectionPoolFactory;
import de.unioninvestment.eai.portal.portlet.crud.domain.form.ResetFormAction;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.DataContainer.FilterPolicy;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.authentication.Realm;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.user.CurrentUser;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.user.UserFactory;
import de.unioninvestment.eai.portal.portlet.crud.domain.support.QueryOptionListRepository;
import de.unioninvestment.eai.portal.support.vaadin.database.DatabaseDialect;
import de.unioninvestment.eai.portal.support.vaadin.mvp.EventBus;
import de.unioninvestment.eai.portal.support.vaadin.validation.FieldValidatorFactory;
/**
* Spring-Factory-Klasse für Model-Komponenten.
*
* @author carsten.mjartan
*
*/
@Component
public class ModelFactory {
@Autowired
private ConnectionPoolFactory connectionPoolFactory;
@Autowired
private UserFactory userFactory;
@Autowired
private ResetFormAction resetFormAction;
@Autowired
private FieldValidatorFactory fieldValidatorFactory;
@Value("${portlet.crud.table.select.default-width}")
private int defaultSelectWidth;
@Value("${portlet.crud.table.directEdit}")
private boolean directEdit;
@Autowired
@Qualifier("prefetchExecutor")
private ExecutorService prefetchExecutor;
@Autowired
private CryptorFactory cryptorFactory;
@Autowired
private QueryOptionListRepository queryOptionListRepository;
@Value("${portlet.crud.optionListCache.cacheDefault}")
private boolean useOptionListCacheByDefault;
@Value("${portlet.crud.databaseBackend.dialect}")
private DatabaseDialect dialect;
/**
* Konstruktor.
*/
public ModelFactory() {
// for Spring
}
/**
* Konstruktor mit Parameter.
*
* @param connectionPoolFactory
* ConnectionPoolFactory
* @param prefetchExecutor
* responsible for prefetching option lists
* @param resetFormAction
* ResetFormAction
* @param fieldValidatorFactory
* FieldValidatorFactory
* @param defaultSelectWidth
* Breite der Selectboxen
* @param userFactory
*/
public ModelFactory(ConnectionPoolFactory connectionPoolFactory,
UserFactory userFactory, ExecutorService prefetchExecutor,
ResetFormAction resetFormAction,
FieldValidatorFactory fieldValidatorFactory,
int defaultSelectWidth, boolean separateEditMode) {
this.connectionPoolFactory = connectionPoolFactory;
this.userFactory = userFactory;
this.prefetchExecutor = prefetchExecutor;
this.resetFormAction = resetFormAction;
this.fieldValidatorFactory = fieldValidatorFactory;
this.defaultSelectWidth = defaultSelectWidth;
this.directEdit = separateEditMode;
}
/**
* Gibt einen Model-Builder zurück.
*
* @param eventBus
* der Event-Bus
* @param config
* Portletkonfiguration
* @return Model-Builder
*/
public ModelBuilder getBuilder(EventBus eventBus, Config config, ModelPreferences prefs) {
return new ModelBuilder(eventBus, this, userFactory, resetFormAction,
fieldValidatorFactory, defaultSelectWidth, config, prefs, directEdit);
}
public Realm getAuthenticationRealm(AuthenticationRealmConfig config) {
return new Realm(config, cryptorFactory);
}
/**
* Gibt den Datenbankcontainer zurück.
*
* @param eventBus
* der Event-Bus
* @param config
* die Tabellenkonfiguration
* @param deleteable
* ob delete-Statements erlaubt sind
* @param updateable
* ob update-Statements erlaubt sind
* @param insertable
* ob insert-Statements erlaubt sind
* @param currentUser
* Aktueller Benutzer
* @param formatPattern
* Formatierungen nach Spaltennamen.
* @param orderBys
* Default-Sortierung
* @param filterPolicy
* Art des Filterhandlings
* @param sizeValidTimeout
* Cachttimeout für die Anzahl aller selektierten Einträge
* @param pagelength
* Anzahl der Einträge pro Seite
* @param exportPagelength
* Anzahl der Einträge pro Seite beim Export
* @return eine neue Instanz des {@link DatabaseTableContainer}
*/
public DatabaseTableContainer getDatabaseTableContainer(EventBus eventBus,
DatabaseTableConfig config, boolean insertable,
boolean updateable, boolean deleteable, CurrentUser currentUser,
Map<String, String> formatPattern, List<ContainerOrder> orderBys,
FilterPolicy filterPolicy, int pagelength, int exportPagelength,
int sizeValidTimeout) {
ConnectionPool pool = connectionPoolFactory.getPool(config.getDatasource());
return new DatabaseTableContainer(eventBus, config,
pool, insertable, updateable, deleteable, currentUser,
formatPattern, orderBys, filterPolicy, pagelength,
exportPagelength, sizeValidTimeout, dialect);
}
/**
*
* @param eventBus
* der Event-Bus
* @param config
* die Container-Konfiguration
* @param query
* die SQL-Select Abfrage
* @param insertable
* ob insert-Statements erlaubt sind
* @param updateable
* ob update-Statements erlaubt sind
* @param deleteable
* ob delete-Statements erlaubt sind
* @param primaryKeys
* eine Liste mit den Primärschlüssel der Abfrage
* @param currentUsername
* Aktueller Benutzer
* @param displayPattern
* Formatierungen nach Spaltennamen.
* @param orderBys
* Default-Sortierung
* @param filterPolicy
* Art des Filterhandlings
* @param pagelength
* Anzahl der Einträge pro Seite
* @param exportPagelength
* Anzahl der Einträge pro Seite beim Export
* @param sizeValidTimeout
* Cachttimeout für die Anzahl aller selektierten Einträge
* @param orderByPrimaryKeys
* sortiere immer auch nach Primärschlüsseln @return DatabaseQueryContainer
*/
public DatabaseQueryContainer getDatabaseQueryContainer(EventBus eventBus,
DatabaseQueryConfig config, String query, boolean insertable,
boolean updateable, boolean deleteable, List<String> primaryKeys,
String currentUsername, Map<String, String> displayPattern,
List<ContainerOrder> orderBys, FilterPolicy filterPolicy,
int pagelength, int exportPagelength, Integer sizeValidTimeout,
boolean orderByPrimaryKeys) {
ConnectionPool pool = connectionPoolFactory.getPool(config.getDatasource());
return new DatabaseQueryContainer(eventBus, config, query,
insertable, updateable, deleteable, primaryKeys, pool,
currentUsername, displayPattern, orderBys, filterPolicy,
pagelength, exportPagelength, sizeValidTimeout,
orderByPrimaryKeys);
}
/**
* @param formatPattern
* Formatierungen nach Spaltennamen.
* @param defaultOrder
* Default-Sortierung
* @param filterPolicy
* Art des Filterhandlings
* @return den Container
*/
public GenericDataContainer getGenericDataContainer(EventBus eventBus,
Map<String, String> formatPattern,
List<ContainerOrder> defaultOrder, FilterPolicy filterPolicy) {
return new GenericDataContainer(eventBus, formatPattern, defaultOrder,
filterPolicy);
}
/**
* @param formatPattern
* Formatierungen nach Spaltennamen.
* @param defaultOrder
* Default-Sortierung
* @param filterPolicy
* Art des Filterhandlings
* @return den Container
*/
public JMXContainer getJmxContainer(EventBus eventBus,
Map<String, String> formatPattern,
List<ContainerOrder> defaultOrder, FilterPolicy filterPolicy) {
return new JMXContainer(eventBus, formatPattern, defaultOrder,
filterPolicy);
}
/**
* @param formatPattern
* Formatierungen nach Spaltennamen.
* @param defaultOrder
* Default-Sortierung
* @param filterPolicy
* Art des Filterhandlings
* @return den Container
*/
public ReSTContainer getReSTContainer(EventBus eventBus,
Map<String, String> formatPattern,
List<ContainerOrder> defaultOrder, FilterPolicy filterPolicy) {
return new ReSTContainer(eventBus, formatPattern, defaultOrder,
filterPolicy);
}
public QueryOptionList getQueryOptionList(EventBus eventBus,
SelectConfig config, String datasource) {
return new QueryOptionList(config, eventBus, queryOptionListRepository,
datasource, prefetchExecutor, useOptionListCacheByDefault);
}
public CompoundSearch getCompoundSearch(CompoundSearchConfig config) {
return new CompoundSearch(config);
}
//TODO: yevtsh - remove after test code refactoring
public void setQueryOptionListRepository(
QueryOptionListRepository queryOptionListRepository) {
this.queryOptionListRepository = queryOptionListRepository;
}
//TODO: remove later
}