diff --git a/pom.xml b/pom.xml index 271b096252..ecec44db58 100755 --- a/pom.xml +++ b/pom.xml @@ -91,6 +91,22 @@ <artifactId>wicket-guice</artifactId> <version>${wicket.version}</version> </dependency> + <dependency> + <groupId>org.apache.wicket</groupId> + <artifactId>wicket-spring</artifactId> + <version>${wicket.version}</version> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-web</artifactId> + <version>6.1.4</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-orm</artifactId> + <version>6.1.4</version> + </dependency> <!-- Servlet API, needed for compilation. --> <dependency> diff --git a/view/pom.xml b/view/pom.xml index c359d76206..c3d712fecd 100644 --- a/view/pom.xml +++ b/view/pom.xml @@ -46,6 +46,10 @@ <groupId>org.apache.wicket</groupId> <artifactId>wicket-guice</artifactId> </dependency> + <dependency> + <groupId>org.apache.wicket</groupId> + <artifactId>wicket-spring</artifactId> + </dependency> <dependency> <groupId>org.apache.wicket</groupId> <artifactId>wicket-extensions</artifactId> @@ -87,6 +91,15 @@ <version>5.3.2</version> </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-web</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-orm</artifactId> + </dependency> + <!-- Servlet API, needed for compilation. --> <dependency> <groupId>jakarta.servlet</groupId> diff --git a/view/src/main/java/ApplicationBootstrap.java b/view/src/main/java/ApplicationBootstrap.java index d5631e6f1c..b30d3094af 100644 --- a/view/src/main/java/ApplicationBootstrap.java +++ b/view/src/main/java/ApplicationBootstrap.java @@ -1,68 +1,134 @@ -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; -import com.google.inject.Module; -import com.google.inject.name.Names; -import com.google.inject.persist.PersistFilter; -import com.google.inject.servlet.GuiceServletContextListener; -import com.google.inject.servlet.ServletModule; -import org.apache.wicket.guice.GuiceWebApplicationFactory; -import org.apache.wicket.protocol.http.WicketFilter; - +import jakarta.inject.Named; +import jakarta.inject.Provider; +import jakarta.inject.Singleton; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.Persistence; import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletException; +import org.apache.wicket.protocol.http.WicketFilter; +import org.apache.wicket.spring.injection.annot.SpringComponentInjector; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter; +import org.springframework.web.WebApplicationInitializer; +import org.springframework.web.context.ContextLoaderListener; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import se.su.dsv.scipro.SciProApplication; +import se.su.dsv.scipro.gdpr.Reporter; +import se.su.dsv.scipro.profiles.CurrentProfile; +import se.su.dsv.scipro.system.Lifecycle; +import se.su.dsv.scipro.system.ResearchArea; +import se.su.dsv.scipro.system.User; +import se.su.dsv.scipro.system.UserImportService; +import se.su.dsv.scipro.system.UserService; +import se.su.dsv.scipro.system.UserServiceImpl; + +import java.io.IOException; import java.net.CookieHandler; import java.net.CookieManager; -import java.time.Clock; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; -import java.util.ServiceLoader; +import java.nio.file.Path; +import java.util.List; +import java.util.Optional; +import java.util.Set; -public class ApplicationBootstrap extends GuiceServletContextListener { +public class ApplicationBootstrap implements WebApplicationInitializer { @Override - protected Injector getInjector() { + public void onStartup(ServletContext servletContext) + throws ServletException + { // preserve cookies when using Jersey which will use the logged in session cookie from // Daisy API thus drastically speeding up the batch jobs CookieHandler.setDefault(new CookieManager()); - return Guice.createInjector( - new ServletModule() { - @Override - protected void configureServlets() { - final ServletContext servletContext = getServletContext(); - final Enumeration<String> initParameterNames = servletContext.getInitParameterNames(); - while (initParameterNames.hasMoreElements()) { - final String parameterName = initParameterNames.nextElement(); - final String value = servletContext.getInitParameter(parameterName); - bindConstant().annotatedWith(Names.named(parameterName)).to(value); - } - } - }, - new ServletModule() { - @Override - protected void configureServlets() { - filter("/*").through(PersistFilter.class); - } - }, - new AbstractModule() { - @Override - protected void configure() { - bind(Clock.class).toInstance(Clock.systemDefaultZone()); - ServiceLoader<Module> modules = ServiceLoader.load(Module.class); - for (Module module : modules) { - install(module); - } - } - }, - new ServletModule() { - @Override - protected void configureServlets() { - Map<String,String> params = new HashMap<>(); - params.put(WicketFilter.FILTER_MAPPING_PARAM, "/*"); - params.put(WicketFilter.APP_FACT_PARAM, GuiceWebApplicationFactory.class.getName()); - params.put("injectorContextAttribute", Injector.class.getName()); - filter("/*").through(new WicketFilter(), params); - } + AnnotationConfigWebApplicationContext webApplicationContext = new AnnotationConfigWebApplicationContext(); + webApplicationContext.register(SciProApplication.class); + webApplicationContext.register(CurrentProfile.class); + webApplicationContext.register(Config.class); + webApplicationContext.refresh(); + + servletContext.addListener(new ContextLoaderListener(webApplicationContext)); + + SciProApplication sciProApplication = webApplicationContext.getBean(SciProApplication.class); + sciProApplication.getComponentInstantiationListeners() + .add(new SpringComponentInjector(sciProApplication, webApplicationContext)); + + servletContext.addFilter("osiv", OpenEntityManagerInViewFilter.class) + .addMappingForUrlPatterns(null, false, "/*"); + + WicketFilter filter = new WicketFilter(sciProApplication); + filter.setFilterPath(""); + + servletContext.addFilter("wicket-filter", filter) + .addMappingForUrlPatterns(null, true, "/*"); + } + + @Configuration + public static class Config { + @Bean + @Named("profile") + public String test() { + return "DEV"; + } + + @Bean + public Lifecycle dummy() { + return new Lifecycle() { + @Override + public void start() { + } - ); + + @Override + public void stop() { + + } + }; + } + + @Bean + public Reporter reporter() { + return user -> null; + } + + @Bean + @Singleton + public EntityManagerFactory entityManagerFactory() { + System.out.println("Creating EntityManagerFactory"); + return Persistence.createEntityManagerFactory("defaultPersistenceUnit"); + } + + @Bean + public EntityManager entityManager(EntityManagerFactory entityManagerFactory) { + return entityManagerFactory.createEntityManager(); + } + + @Bean + public UserService userService(Provider<EntityManager> entityManagerProvider) { + return new UserServiceImpl(entityManagerProvider); + } + + @Bean + public UserImportService importService() { + return new UserImportService() { + @Override + public Optional<User> importUser(String userName) { + return Optional.empty(); + } + + @Override + public List<ImportableUser> search(String searchTerm) { + return List.of(); + } + + @Override + public void importUser(ImportableUser importableUser) { + } + + @Override + public Set<ResearchArea> importResearchAreasForSupervisor(User supervisor) { + return Set.of(); + } + }; + } } } diff --git a/view/src/main/java/se/su/dsv/scipro/SciProApplication.java b/view/src/main/java/se/su/dsv/scipro/SciProApplication.java index e02ddcfc74..896faee0f4 100755 --- a/view/src/main/java/se/su/dsv/scipro/SciProApplication.java +++ b/view/src/main/java/se/su/dsv/scipro/SciProApplication.java @@ -334,7 +334,7 @@ public class SciProApplication extends LifecycleManagedWebApplication { mountPage("admin/users/import", AdminImportUserPage.class); mountPage("admin/users/roles", AdminRolePage.class); mountPage("admin/users/switch", AdminSwitchUserPage.class); - mountResource("gdpr/report", new GDPRReportResourceReference()); + //mountResource("gdpr/report", new GDPRReportResourceReference()); } private void mountNotificationAndSettingsPages() { diff --git a/view/src/main/webapp/WEB-INF/web.xml b/view/src/main/webapp/WEB-INF/web.xml index bf2a938984..c74f86a197 100755 --- a/view/src/main/webapp/WEB-INF/web.xml +++ b/view/src/main/webapp/WEB-INF/web.xml @@ -5,15 +5,6 @@ <display-name>SciPro</display-name> - <filter> - <filter-name>guiceFilter</filter-name> - <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> - </filter> - <filter-mapping> - <filter-name>guiceFilter</filter-name> - <url-pattern>/*</url-pattern> - </filter-mapping> - <listener> <listener-class>ApplicationBootstrap</listener-class> </listener>