Enable creating an API using Spring Web #5

Merged
niat8586 merged 39 commits from spring into develop 2024-11-06 11:23:29 +01:00
5 changed files with 153 additions and 67 deletions
Showing only changes of commit f8d65d4821 - Show all commits

16
pom.xml
View File

@ -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>

View File

@ -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>

View File

@ -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() {
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
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);
public void start() {
}
}
},
new ServletModule() {
@Override
protected void configureServlets() {
filter("/*").through(PersistFilter.class);
public void stop() {
}
},
new AbstractModule() {
};
}
@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
protected void configure() {
bind(Clock.class).toInstance(Clock.systemDefaultZone());
ServiceLoader<Module> modules = ServiceLoader.load(Module.class);
for (Module module : modules) {
install(module);
public Optional<User> importUser(String userName) {
return Optional.empty();
}
}
},
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);
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();
}
};
}
);
}
}

View File

@ -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() {

View File

@ -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>