diff --git a/src/main/java/org/nrg/xapi/rest/event/EventHandlerApi.java b/src/main/java/org/nrg/xapi/rest/event/EventHandlerApi.java index 112eac6d6ca87b23654a7cbb923e347908751dbc..a83585802358eebeec89d4a7121751e45487f222 100644 --- a/src/main/java/org/nrg/xapi/rest/event/EventHandlerApi.java +++ b/src/main/java/org/nrg/xapi/rest/event/EventHandlerApi.java @@ -1,8 +1,12 @@ package org.nrg.xapi.rest.event; -import io.swagger.annotations.*; +import com.google.common.collect.Lists; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; import javassist.Modifier; - +import org.nrg.framework.annotations.XapiRestController; import org.nrg.framework.utilities.Reflection; import org.nrg.xapi.model.event.EventClassInfo; import org.nrg.xdat.XDAT; @@ -27,10 +31,12 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.web.bind.annotation.*; - -import com.google.common.collect.Lists; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.annotation.PostConstruct; import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.Method; @@ -39,40 +45,46 @@ import java.util.Collections; import java.util.List; import java.util.Map; -import javax.annotation.PostConstruct; - /** * The Class EventHandlerApi. */ @Api(description = "The XNAT Event Handler API") -@RestController +@XapiRestController public class EventHandlerApi { - - /** The Constant _log. */ + + /** + * The Constant _log. + */ private static final Logger _log = LoggerFactory.getLogger(EventHandlerApi.class); - - /** The event ids service. */ - @Autowired - private HibernateAutomationEventIdsService eventIdsService; - - /** The filters service. */ - @Autowired - private HibernateAutomationFiltersService filtersService; - - /** The event packages. */ - @SuppressWarnings("MismatchedQueryAndUpdateOfCollection") - @Autowired + + /** + * The event ids service. + */ + @Autowired + private HibernateAutomationEventIdsService eventIdsService; + + /** + * The filters service. + */ + @Autowired + private HibernateAutomationFiltersService filtersService; + + /** + * The event packages. + */ + @SuppressWarnings("MismatchedQueryAndUpdateOfCollection") + @Autowired private EventPackages eventPackages; - + /** * Inits the this. */ @PostConstruct private void initThis() { - getEventIdsService(); - getFiltersService(); + getEventIdsService(); + getFiltersService(); } - + /** * Automation event classes get. * @@ -85,12 +97,12 @@ public class EventHandlerApi { @ResponseBody public ResponseEntity<List<EventClassInfo>> automationEventClassesGet(@PathVariable("project_id") String project_id) { final HttpStatus status = isPermitted(project_id); - if (status != null) { - return new ResponseEntity<>(status); - } + if (status != null) { + return new ResponseEntity<>(status); + } return new ResponseEntity<>(getEventInfoList(project_id), HttpStatus.OK); } - + /** * Automation event classes get. * @@ -102,151 +114,151 @@ public class EventHandlerApi { @ResponseBody public ResponseEntity<List<EventClassInfo>> automationEventClassesGet() { final HttpStatus status = isPermitted(null); - if (status != null) { - return new ResponseEntity<>(status); - } + if (status != null) { + return new ResponseEntity<>(status); + } return new ResponseEntity<>(getEventInfoList(null), HttpStatus.OK); } - /** - * Gets the event info list. - * - * @param project_id the project_id - * @return the event info list - */ - private List<EventClassInfo> getEventInfoList(String project_id) { - final List<EventClassInfo> eventInfoList = Lists.newArrayList(); - final List<AutomationEventIds> eventIdsList = getEventIdsService().getEventIds(project_id, false); - final List<AutomationFilters> filtersList = getFiltersService().getAutomationFilters(project_id, false); - for (final String className : getEventClassList(eventIdsList)) { - final EventClassInfo eci = new EventClassInfo(className); - final List<String> eventIds = eci.getEventIds(); - final Map<String, List<String>> filterableFields = eci.getFilterableFieldsMap(); - if (eci.getIncludeEventIdsFromDatabase()) { - for (final AutomationEventIds autoIds : eventIdsList) { - if (autoIds.getSrcEventClass().equals(className)) { - for (String eId : autoIds.getEventIds()) { - if (!eventIds.contains(eId)) { - eventIds.add(eId); - } - } - } - } - } - Collections.sort(eventIds); - try { - for (final Method method : Arrays.asList(Class.forName(className).getMethods())) { - if (method.isAnnotationPresent(Filterable.class) && method.getName().substring(0,3).equalsIgnoreCase("get")) { - final char c[] = method.getName().substring(3).toCharArray(); - c[0] = Character.toLowerCase(c[0]); - final String column = new String(c); - final Annotation anno = AnnotationUtils.findAnnotation(method, Filterable.class); - - final Object annoInitialValuesObj = AnnotationUtils.getValue(anno, "initialValues"); - final String[] annoInitialValues = (annoInitialValuesObj != null && annoInitialValuesObj instanceof String[]) ? (String[])annoInitialValuesObj : new String[] {}; - - final Object annoIncludeValuesFromDatabase = AnnotationUtils.getValue(anno, "includeValuesFromDatabase"); - boolean includeValuesFromDatabase = !(annoIncludeValuesFromDatabase != null && annoIncludeValuesFromDatabase instanceof Boolean) || (boolean) annoIncludeValuesFromDatabase; - if (!filterableFields.containsKey(column)) { - final List<String> newValueList = Lists.newArrayList(); - filterableFields.put(column,newValueList); - } - final List<String> valueList = filterableFields.get(column); - valueList.addAll(Arrays.asList(annoInitialValues)); - if (includeValuesFromDatabase) { - for (final AutomationFilters autoFilters : filtersList) { - if (autoFilters.getField().equals(column)) { - valueList.addAll(autoFilters.getValues()); - break; - } - } - } - Collections.sort(valueList); - } - } - } catch (SecurityException | ClassNotFoundException e) { - for (final AutomationFilters autoFilters : filtersList) { - if (!filterableFields.containsKey(autoFilters.getField())) { - final List<String> valueList = Lists.newArrayList(autoFilters.getValues()); - Collections.sort(valueList); - filterableFields.put(autoFilters.getField(), valueList); - } else { - for (String value : autoFilters.getValues()) { - final List<String> values = filterableFields.get(autoFilters.getField()); - if (!values.contains(value)) { - values.add(value); - } - Collections.sort(values); - } - } - } - } - eventInfoList.add(eci); - } - return eventInfoList; - } + /** + * Gets the event info list. + * + * @param project_id the project_id + * @return the event info list + */ + private List<EventClassInfo> getEventInfoList(String project_id) { + final List<EventClassInfo> eventInfoList = Lists.newArrayList(); + final List<AutomationEventIds> eventIdsList = getEventIdsService().getEventIds(project_id, false); + final List<AutomationFilters> filtersList = getFiltersService().getAutomationFilters(project_id, false); + for (final String className : getEventClassList(eventIdsList)) { + final EventClassInfo eci = new EventClassInfo(className); + final List<String> eventIds = eci.getEventIds(); + final Map<String, List<String>> filterableFields = eci.getFilterableFieldsMap(); + if (eci.getIncludeEventIdsFromDatabase()) { + for (final AutomationEventIds autoIds : eventIdsList) { + if (autoIds.getSrcEventClass().equals(className)) { + for (String eId : autoIds.getEventIds()) { + if (!eventIds.contains(eId)) { + eventIds.add(eId); + } + } + } + } + } + Collections.sort(eventIds); + try { + for (final Method method : Arrays.asList(Class.forName(className).getMethods())) { + if (method.isAnnotationPresent(Filterable.class) && method.getName().substring(0, 3).equalsIgnoreCase("get")) { + final char c[] = method.getName().substring(3).toCharArray(); + c[0] = Character.toLowerCase(c[0]); + final String column = new String(c); + final Annotation anno = AnnotationUtils.findAnnotation(method, Filterable.class); + + final Object annoInitialValuesObj = AnnotationUtils.getValue(anno, "initialValues"); + final String[] annoInitialValues = (annoInitialValuesObj != null && annoInitialValuesObj instanceof String[]) ? (String[]) annoInitialValuesObj : new String[] {}; - /** - * Gets the event class list. - * - * @param eventIdsList the event ids list - * @return the event class list - */ - private List<String> getEventClassList(List<AutomationEventIds> eventIdsList) { - final List<String> classList = Lists.newArrayList(); - // ClassList should be pulled from available event classes rather than from events - if (eventPackages != null) { - for (final String pkg : eventPackages) { - try { - for (final Class<?> clazz : Reflection.getClassesForPackage(pkg)) { - if (AutomationEventImplementerI.class.isAssignableFrom(clazz) && !clazz.isInterface() && - !Modifier.isAbstract(clazz.getModifiers())) { - if (!classList.contains(clazz.getName())) { - classList.add(clazz.getName()); - } - } - } - } catch (ClassNotFoundException | IOException e) { - // Do nothing. - } - } - } - // I think for now we'll not pull from the database if we've found event classes. If the database - // contains any thing different, it should only be event classes that are no longer available. - if (classList.size()<1) { - for (final AutomationEventIds auto : eventIdsList) { - if (!classList.contains(auto.getSrcEventClass())) { - classList.add(auto.getSrcEventClass()); - } - } - } + final Object annoIncludeValuesFromDatabase = AnnotationUtils.getValue(anno, "includeValuesFromDatabase"); + boolean includeValuesFromDatabase = !(annoIncludeValuesFromDatabase != null && annoIncludeValuesFromDatabase instanceof Boolean) || (boolean) annoIncludeValuesFromDatabase; + if (!filterableFields.containsKey(column)) { + final List<String> newValueList = Lists.newArrayList(); + filterableFields.put(column, newValueList); + } + final List<String> valueList = filterableFields.get(column); + valueList.addAll(Arrays.asList(annoInitialValues)); + if (includeValuesFromDatabase) { + for (final AutomationFilters autoFilters : filtersList) { + if (autoFilters.getField().equals(column)) { + valueList.addAll(autoFilters.getValues()); + break; + } + } + } + Collections.sort(valueList); + } + } + } catch (SecurityException | ClassNotFoundException e) { + for (final AutomationFilters autoFilters : filtersList) { + if (!filterableFields.containsKey(autoFilters.getField())) { + final List<String> valueList = Lists.newArrayList(autoFilters.getValues()); + Collections.sort(valueList); + filterableFields.put(autoFilters.getField(), valueList); + } else { + for (String value : autoFilters.getValues()) { + final List<String> values = filterableFields.get(autoFilters.getField()); + if (!values.contains(value)) { + values.add(value); + } + Collections.sort(values); + } + } + } + } + eventInfoList.add(eci); + } + return eventInfoList; + } + + /** + * Gets the event class list. + * + * @param eventIdsList the event ids list + * @return the event class list + */ + private List<String> getEventClassList(List<AutomationEventIds> eventIdsList) { + final List<String> classList = Lists.newArrayList(); + // ClassList should be pulled from available event classes rather than from events + if (eventPackages != null) { + for (final String pkg : eventPackages) { + try { + for (final Class<?> clazz : Reflection.getClassesForPackage(pkg)) { + if (AutomationEventImplementerI.class.isAssignableFrom(clazz) && !clazz.isInterface() && + !Modifier.isAbstract(clazz.getModifiers())) { + if (!classList.contains(clazz.getName())) { + classList.add(clazz.getName()); + } + } + } + } catch (ClassNotFoundException | IOException e) { + // Do nothing. + } + } + } + // I think for now we'll not pull from the database if we've found event classes. If the database + // contains any thing different, it should only be event classes that are no longer available. + if (classList.size() < 1) { + for (final AutomationEventIds auto : eventIdsList) { + if (!classList.contains(auto.getSrcEventClass())) { + classList.add(auto.getSrcEventClass()); + } + } + } return classList; - } - - /** - * Gets the event ids service. - * - * @return the event ids service - */ - private HibernateAutomationEventIdsService getEventIdsService() { - if (eventIdsService == null) { - eventIdsService = XDAT.getContextService().getBean(HibernateAutomationEventIdsService.class); - } - return eventIdsService; - } - - /** - * Gets the filters service. - * - * @return the filters service - */ - private HibernateAutomationFiltersService getFiltersService() { - if (filtersService == null) { - filtersService = XDAT.getContextService().getBean(HibernateAutomationFiltersService.class); - } - return filtersService; - } - + } + + /** + * Gets the event ids service. + * + * @return the event ids service + */ + private HibernateAutomationEventIdsService getEventIdsService() { + if (eventIdsService == null) { + eventIdsService = XDAT.getContextService().getBean(HibernateAutomationEventIdsService.class); + } + return eventIdsService; + } + + /** + * Gets the filters service. + * + * @return the filters service + */ + private HibernateAutomationFiltersService getFiltersService() { + if (filtersService == null) { + filtersService = XDAT.getContextService().getBean(HibernateAutomationFiltersService.class); + } + return filtersService; + } + /** * Gets the session user. * @@ -259,7 +271,7 @@ public class EventHandlerApi { } return null; } - + /** * Checks if is permitted. * @@ -269,20 +281,19 @@ public class EventHandlerApi { private HttpStatus isPermitted(String projectId) { final UserI sessionUser = getSessionUser(); if ((sessionUser instanceof XDATUser)) { - if (projectId != null) { - final XnatProjectdata project = AutoXnatProjectdata.getXnatProjectdatasById(projectId, sessionUser, false); - try { - return Permissions.canEdit(sessionUser, project) ? null : HttpStatus.FORBIDDEN; - } catch (Exception e) { - _log.error("Error checking read status for project",e); - return HttpStatus.INTERNAL_SERVER_ERROR; - } - } else { - return (Roles.isSiteAdmin(sessionUser)) ? null : HttpStatus.FORBIDDEN; - } + if (projectId != null) { + final XnatProjectdata project = AutoXnatProjectdata.getXnatProjectdatasById(projectId, sessionUser, false); + try { + return Permissions.canEdit(sessionUser, project) ? null : HttpStatus.FORBIDDEN; + } catch (Exception e) { + _log.error("Error checking read status for project", e); + return HttpStatus.INTERNAL_SERVER_ERROR; + } + } else { + return (Roles.isSiteAdmin(sessionUser)) ? null : HttpStatus.FORBIDDEN; + } } - _log.error("Error checking read status for project"); - return HttpStatus.INTERNAL_SERVER_ERROR; + _log.error("Error checking read status for project"); + return HttpStatus.INTERNAL_SERVER_ERROR; } - } diff --git a/src/main/java/org/nrg/xapi/rest/settings/SiteConfigApi.java b/src/main/java/org/nrg/xapi/rest/settings/SiteConfigApi.java index e1c2fa71e2c71defc29ddd250daa6f5ce680356a..6c3ca05a8742c8588c6e7d9eb69496c13b95a192 100644 --- a/src/main/java/org/nrg/xapi/rest/settings/SiteConfigApi.java +++ b/src/main/java/org/nrg/xapi/rest/settings/SiteConfigApi.java @@ -22,7 +22,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -@Api(description = "XNAT Site Configuration Management API") +@Api(description = "Site Configuration Management API") @XapiRestController @RequestMapping(value = "/siteConfig") public class SiteConfigApi extends AbstractXnatRestApi { diff --git a/src/main/java/org/nrg/xapi/rest/users/UsersApi.java b/src/main/java/org/nrg/xapi/rest/users/UsersApi.java index 5dec06a54ac399fd3ffed9684c53c53b23f2acdc..68728939142e621dd9ea0610e53986921f03f694 100644 --- a/src/main/java/org/nrg/xapi/rest/users/UsersApi.java +++ b/src/main/java/org/nrg/xapi/rest/users/UsersApi.java @@ -26,7 +26,7 @@ import org.springframework.web.bind.annotation.*; import java.util.*; -@Api(description = "The XNAT POC User Management API") +@Api(description = "User Management API") @XapiRestController @RequestMapping(value = "/users") public class UsersApi extends AbstractXnatRestApi { @@ -44,26 +44,25 @@ public class UsersApi extends AbstractXnatRestApi { @ApiResponses({@ApiResponse(code = 200, message = "An array of user profiles"), @ApiResponse(code = 500, message = "Unexpected error")}) @RequestMapping(value = {"/profiles"}, produces = {MediaType.APPLICATION_JSON_VALUE}, method = RequestMethod.GET) @ResponseBody - public ResponseEntity<List<Map<String,String>>> usersProfilesGet() { - List<UserI> users = Users.getUsers(); - List<Map<String,String>> userMaps = new ArrayList<Map<String,String>>(); - for(UserI user : users){ - try{ - Map<String,String> userMap = new HashMap<String,String>(); - userMap.put("firstname",user.getFirstname()); - userMap.put("lastname",user.getLastname()); - userMap.put("username",user.getUsername()); - userMap.put("email",user.getEmail()); - userMap.put("id",String.valueOf(user.getID())); - userMap.put("enabled",String.valueOf(user.isEnabled())); - userMap.put("verified",String.valueOf(user.isVerified())); + public ResponseEntity<List<Map<String, String>>> usersProfilesGet() { + List<UserI> users = Users.getUsers(); + List<Map<String, String>> userMaps = new ArrayList<>(); + for (UserI user : users) { + try { + Map<String, String> userMap = new HashMap<>(); + userMap.put("firstname", user.getFirstname()); + userMap.put("lastname", user.getLastname()); + userMap.put("username", user.getUsername()); + userMap.put("email", user.getEmail()); + userMap.put("id", String.valueOf(user.getID())); + userMap.put("enabled", String.valueOf(user.isEnabled())); + userMap.put("verified", String.valueOf(user.isVerified())); userMaps.add(userMap); - } - catch(Exception e){ + } catch (Exception e) { _log.error("", e); } } - return new ResponseEntity<List<Map<String,String>>>(userMaps, HttpStatus.OK); + return new ResponseEntity<>(userMaps, HttpStatus.OK); } @ApiOperation(value = "Gets the user with the specified user ID.", notes = "Returns the serialized user object with the specified user ID.", response = User.class) @@ -94,13 +93,10 @@ public class UsersApi extends AbstractXnatRestApi { if (status != null) { return new ResponseEntity<>(status); } - UserI user = null; + UserI user; try { user = Users.getUser(username); } catch (Exception e) { - user = null; - } - if (user == null) { //Create new User user = Users.createUser(); user.setLogin(username); @@ -114,9 +110,9 @@ public class UsersApi extends AbstractXnatRestApi { if ((StringUtils.isNotBlank(model.getEmail())) && (!StringUtils.equals(model.getEmail(), user.getEmail()))) { user.setEmail(model.getEmail()); } - if (model.isEnabled()!=user.isEnabled()) { + if (model.isEnabled() != user.isEnabled()) { user.setEnabled(model.isEnabled()); - if(!model.isEnabled()){ + if (!model.isEnabled()) { //When a user is disabled, deactivate all their AliasTokens try { XDAT.getContextService().getBean(AliasTokenService.class).deactivateAllTokensForUser(user.getLogin()); @@ -125,7 +121,7 @@ public class UsersApi extends AbstractXnatRestApi { } } } - if (model.isVerified()!=user.isVerified()) { + if (model.isVerified() != user.isVerified()) { user.setVerified(model.isVerified()); } @@ -253,7 +249,7 @@ public class UsersApi extends AbstractXnatRestApi { if (user == null) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } - Collection<String> roles = Roles.getRoles(user); + Collection<String> roles = Roles.getRoles(user); return new ResponseEntity<>(roles, HttpStatus.OK); } catch (UserInitException e) { _log.error("An error occurred initializing the user " + id, e); @@ -277,10 +273,10 @@ public class UsersApi extends AbstractXnatRestApi { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } try { - Roles.addRole(getSessionUser(),user,role); + Roles.addRole(getSessionUser(), user, role); return new ResponseEntity<>(HttpStatus.OK); } catch (Exception e) { - _log.error("Error occurred adding role "+role+" to user " + user.getLogin()+"."); + _log.error("Error occurred adding role " + role + " to user " + user.getLogin() + "."); } return new ResponseEntity<>(false, HttpStatus.INTERNAL_SERVER_ERROR); } catch (UserInitException e) { @@ -306,10 +302,10 @@ public class UsersApi extends AbstractXnatRestApi { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } try { - Roles.deleteRole(getSessionUser(),user,role); + Roles.deleteRole(getSessionUser(), user, role); return new ResponseEntity<>(HttpStatus.OK); } catch (Exception e) { - _log.error("Error occurred removing role "+role+" from user " + user.getLogin()+"."); + _log.error("Error occurred removing role " + role + " from user " + user.getLogin() + "."); } return new ResponseEntity<>(false, HttpStatus.INTERNAL_SERVER_ERROR); } catch (UserInitException e) { @@ -357,10 +353,10 @@ public class UsersApi extends AbstractXnatRestApi { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } try { - Groups.addUserToGroup(group, user, getSessionUser(),null); + Groups.addUserToGroup(group, user, getSessionUser(), null); return new ResponseEntity<>(HttpStatus.OK); } catch (Exception e) { - _log.error("Error occurred adding user " + user.getLogin()+ " to group "+group+"."); + _log.error("Error occurred adding user " + user.getLogin() + " to group " + group + "."); } return new ResponseEntity<>(false, HttpStatus.INTERNAL_SERVER_ERROR); } catch (UserInitException e) { @@ -389,7 +385,7 @@ public class UsersApi extends AbstractXnatRestApi { Groups.removeUserFromGroup(user, group, null); return new ResponseEntity<>(HttpStatus.OK); } catch (Exception e) { - _log.error("Error occurred removing user "+user.getLogin()+" from group " + group+"."); + _log.error("Error occurred removing user " + user.getLogin() + " from group " + group + "."); } return new ResponseEntity<>(false, HttpStatus.INTERNAL_SERVER_ERROR); } catch (UserInitException e) { diff --git a/src/main/java/org/nrg/xnat/configuration/WebConfig.java b/src/main/java/org/nrg/xnat/configuration/WebConfig.java index bf51d79008c082c52f1cc775269666d324232665..b6bcb890a39819f8492dade1c4dc5573154bde16 100644 --- a/src/main/java/org/nrg/xnat/configuration/WebConfig.java +++ b/src/main/java/org/nrg/xnat/configuration/WebConfig.java @@ -1,9 +1,5 @@ package org.nrg.xnat.configuration; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module; import org.nrg.framework.annotations.XapiRestController; import org.nrg.xnat.spawner.configuration.SpawnerConfig; import org.slf4j.Logger; @@ -14,7 +10,6 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.support.ResourceBundleMessageSource; -import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.multipart.support.StandardServletMultipartResolver; import org.springframework.web.servlet.ViewResolver; @@ -36,16 +31,6 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2; @Import(SpawnerConfig.class) @ComponentScan({"org.nrg.xapi.rest", "org.nrg.xnat.spawner.controllers"}) public class WebConfig extends WebMvcConfigurerAdapter { - @Bean - public Jackson2ObjectMapperBuilder objectMapperBuilder() { - return new Jackson2ObjectMapperBuilder() - .serializationInclusion(JsonInclude.Include.NON_NULL) - .failOnEmptyBeans(false) - .featuresToEnable(JsonParser.Feature.ALLOW_SINGLE_QUOTES, JsonParser.Feature.ALLOW_YAML_COMMENTS) - .featuresToDisable(SerializationFeature.FAIL_ON_EMPTY_BEANS, SerializationFeature.WRITE_NULL_MAP_VALUES) - .modules(new Hibernate4Module()); - } - @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("**/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); diff --git a/src/main/java/org/nrg/xnat/initialization/RootConfig.java b/src/main/java/org/nrg/xnat/initialization/RootConfig.java index c29194b18cc66e240773edbe058154159cb84b36..5f3a9fffdb9f9dc297503c2b4c79ca4e2b6ccede 100644 --- a/src/main/java/org/nrg/xnat/initialization/RootConfig.java +++ b/src/main/java/org/nrg/xnat/initialization/RootConfig.java @@ -13,13 +13,13 @@ import org.nrg.framework.datacache.SerializerRegistry; import org.nrg.framework.exceptions.NrgServiceException; import org.nrg.framework.services.ContextService; import org.nrg.framework.services.SerializerService; +import org.nrg.framework.services.YamlObjectMapper; +import org.nrg.prefs.beans.PreferenceBeanMixIn; import org.nrg.xdat.preferences.InitializerSiteConfiguration; import org.nrg.xdat.preferences.SiteConfigPreferences; import org.nrg.xnat.helpers.prearchive.PrearcConfig; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.ImportResource; +import org.springframework.context.annotation.*; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.http.converter.xml.MarshallingHttpMessageConverter; import org.springframework.oxm.jaxb.Jaxb2Marshaller; @@ -58,35 +58,34 @@ public class RootConfig { @Bean public PrettyPrinter prettyPrinter() { - final DefaultIndenter indenter = new DefaultIndenter(" ", DefaultIndenter.SYS_LF); return new DefaultPrettyPrinter() {{ + final DefaultIndenter indenter = new DefaultIndenter(" ", DefaultIndenter.SYS_LF); indentObjectsWith(indenter); indentArraysWith(indenter); }}; } @Bean - public ObjectMapper jsonObjectMapper() { - final PrettyPrinter printer = prettyPrinter(); - final ObjectMapper mapper = new ObjectMapper().setDefaultPrettyPrinter(printer); - mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); - mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false); - mapper.configure(JsonParser.Feature.ALLOW_YAML_COMMENTS, true); - mapper.registerModule(new Hibernate4Module()); - return mapper; + public Jackson2ObjectMapperBuilder objectMapperBuilder() { + return new Jackson2ObjectMapperBuilder() + .serializationInclusion(JsonInclude.Include.NON_NULL) + .failOnEmptyBeans(false) + .mixIns(mixIns()) + .featuresToEnable(JsonParser.Feature.ALLOW_SINGLE_QUOTES, JsonParser.Feature.ALLOW_YAML_COMMENTS) + .featuresToDisable(SerializationFeature.FAIL_ON_EMPTY_BEANS, SerializationFeature.WRITE_NULL_MAP_VALUES) + .modulesToInstall(new Hibernate4Module()); } @Bean - public ObjectMapper yamlObjectMapper() { - final PrettyPrinter printer = prettyPrinter(); - final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()).setDefaultPrettyPrinter(printer); - mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); - mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false); - mapper.configure(JsonParser.Feature.ALLOW_YAML_COMMENTS, true); - mapper.registerModule(new Hibernate4Module()); - return mapper; + public Map<Class<?>, Class<?>> mixIns() { + final Map<Class<?>, Class<?>> mixIns = new HashMap<>(); + mixIns.put(SiteConfigPreferences.class, PreferenceBeanMixIn.class); + return mixIns; + } + + @Bean + public YamlObjectMapper yamlObjectMapper() { + return new YamlObjectMapper(); } @Bean diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties new file mode 100644 index 0000000000000000000000000000000000000000..283396ac8ab7ea4724c69f619a146729a3cd3068 --- /dev/null +++ b/src/main/resources/log4j.properties @@ -0,0 +1,391 @@ + +# +# D:/Development/XNAT/1.6/xnat_builder_1_6dev/plugin-resources/originals/log4j.properties +# XNAT http://www.xnat.org +# Copyright (c) 2014, Washington University School of Medicine +# All Rights Reserved +# +# Released under the Simplified BSD. +# +# Last modified 2/7/14 12:19 PM +# + +log4j.rootLogger=ERROR, app + +# +# Turbine goes into Turbine Log +# +log4j.category.org.apache.turbine=ERROR, turbine +log4j.additivity.org.apache.turbine=false + +# +# Velocity Logfile +# +log4j.category.velocity=ERROR, velocity +log4j.additivity.velocity=false + +# +# Scheduler Category +# +log4j.category.scheduler=ERROR, scheduler +log4j.additivity.scheduler=false + +# +# Avalon Logfile +# +log4j.category.avalon=ERROR, avalon +log4j.additivity.avalon=false + +# +# Axis Logfile +# +log4j.category.org.apache.axis=ERROR, axis +log4j.additivity.org.apache.axis=false + +# +# Application debugging +# +log4j.category.org.xnat.xnatfs=ERROR, xnatfs +log4j.additivity.org.xnat.xnatfs=false + +# +# Application debugging +# +log4j.category.org.apache.turbine.app.xnat17=ERROR, app +log4j.additivity.org.apache.turbine.app.xnat17=false + +# +# Application debugging +# +log4j.category.org.nrg.xdat=ERROR, xdat +log4j.additivity.org.nrg.xdat=false + +# +# Application debugging +# +log4j.category.org.nrg.xft=ERROR, xdat +log4j.additivity.org.nrg.xft=false + +log4j.category.org.nrg.xnat=ERROR, xdat +log4j.additivity.org.nrg.xnat=false + +log4j.category.org.nrg.xnat.restlet=WARN, restlet +log4j.additivity.org.nrg.xnat.restlet=false + +log4j.category.org.nrg.xnat.remote=WARN, remote +log4j.additivity.org.nrg.xnat.remote=false + +log4j.category.org.nrg.xnat.helpers.prearchive=WARN, prearchive +log4j.additivity.org.nrg.xnat.helpers.prearchive=false + +# SETTING AccessLogger Log to INFO will log all site access +log4j.category.org.nrg.xdat.turbine.utils.AccessLogger=INFO, access +log4j.additivity.org.nrg.xdat.turbine.utils.AccessLogger=false + +# SETTING PoolDBUtils Log to DEBUG will log all SQL QUERIES +log4j.category.org.nrg.xft.db.PoolDBUtils=ERROR, sql +log4j.additivity.org.nrg.xft.db.PoolDBUtils=false + +# Analytics category, default analytics level is trace. +# log4j.category.analytics = TRACE, analytics +# log4j.additivity.analytics = false + +# Security logs, both Spring Framework and XNAT +log4j.category.org.springframework.security=WARN, security +log4j.additivity.org.springframework.security=false +log4j.category.org.springframework.ldap=WARN, security +log4j.additivity.org.springframework.ldap=false +log4j.category.org.nrg.xnat.security=WARN, security +log4j.additivity.org.nrg.xnat.security=false + +# Spring Framework logs +log4j.category.org.springframework.beans=WARN, spring +log4j.additivity.org.springframework.beans=false +log4j.category.org.springframework.context=WARN, spring +log4j.additivity.org.springframework.context=false +log4j.category.org.springframework.core=WARN, spring +log4j.additivity.org.springframework.core=false +log4j.category.org.springframework.http=WARN, spring +log4j.additivity.org.springframework.http=false +log4j.category.org.springframework.mail=WARN, spring +log4j.additivity.org.springframework.mail=false +log4j.category.org.springframework.oxm=WARN, spring +log4j.additivity.org.springframework.oxm=false +log4j.category.org.springframework.scheduling=WARN, spring +log4j.additivity.org.springframework.scheduling=false +log4j.category.org.springframework.stereotype=WARN, spring +log4j.additivity.org.springframework.stereotype=false +log4j.category.org.springframework.util=WARN, spring +log4j.additivity.org.springframework.util=false +log4j.category.org.springframework.web=WARN, spring +log4j.additivity.org.springframework.web=false + +# Database and ORM logging. +log4j.category.org.nrg.framework.orm=WARN, orm +log4j.additivity.org.nrg.framework.orm=false +log4j.category.org.springframework.orm=WARN, orm +log4j.additivity.org.springframework.orm=false +log4j.category.org.springframework.dao=WARN, orm +log4j.additivity.org.springframework.dao=false +log4j.category.org.springframework.jdbc=WARN, orm +log4j.additivity.org.springframework.jdbc=false +log4j.category.org.springframework.transaction=WARN, orm +log4j.additivity.org.springframework.transaction=false + + +# DICOM services +log4j.category.org.nrg.dcm=WARN, dicom +log4j.additivity.org.nrg.dcm=false + +# +# Automation logging +# +log4j.category.org.nrg.automation=ERROR, automation +log4j.additivity.org.nrg.automation=false + +######################################################################## +# +# Logfile definitions +# +######################################################################## + +# +# turbine.log +# +log4j.appender.turbine=org.apache.log4j.DailyRollingFileAppender +log4j.appender.turbine.DatePattern='.'yyy-MM-dd +log4j.appender.turbine.file=${xnat.home}/logs/turbine.log +log4j.appender.turbine.layout=org.apache.log4j.PatternLayout +log4j.appender.turbine.layout.conversionPattern=%d [%t] %-5p %c - %m%n +log4j.appender.turbine.append=false + +# +# Scheduler Output +# +log4j.appender.scheduler=org.apache.log4j.FileAppender +log4j.appender.scheduler.file=${xnat.home}/logs/scheduler.log +log4j.appender.scheduler.layout=org.apache.log4j.PatternLayout +log4j.appender.scheduler.layout.conversionPattern=%d [%t] %-5p %c - %m%n +log4j.appender.scheduler.append=false + +# +# Velocity gets configured to write its output onto the velocity +# category. +# +log4j.appender.velocity=org.apache.log4j.DailyRollingFileAppender +log4j.appender.velocity.DatePattern='.'yyy-MM-dd +log4j.appender.velocity.file=${xnat.home}/logs/velocity.log +log4j.appender.velocity.layout=org.apache.log4j.PatternLayout +log4j.appender.velocity.layout.conversionPattern=%d [%t] %-5p %c - %m%n +log4j.appender.velocity.append=false + +# +# Avalon gets configured to write its output onto the avalon +# category. +# +log4j.appender.avalon=org.apache.log4j.FileAppender +log4j.appender.avalon.file=${xnat.home}/logs/avalon.log +log4j.appender.avalon.layout=org.apache.log4j.PatternLayout +log4j.appender.avalon.layout.conversionPattern=%d [%t] %-5p %c - %m%n +log4j.appender.avalon.append=false + +# +# xnatfs.log +# +log4j.appender.xnatfs=org.apache.log4j.DailyRollingFileAppender +log4j.appender.xnatfs.DatePattern='.'yyy-MM-dd +log4j.appender.xnatfs.file=${xnat.home}/logs/xnatfs.log +log4j.appender.xnatfs.layout=org.apache.log4j.PatternLayout +log4j.appender.xnatfs.layout.conversionPattern=%d [%t] %-5p %c - %m%n +log4j.appender.xnatfs.append=false + +# +# Application.log +# +log4j.appender.app=org.apache.log4j.DailyRollingFileAppender +log4j.appender.app.DatePattern='.'yyy-MM-dd +log4j.appender.app.file=${xnat.home}/logs/application.log +log4j.appender.app.layout=org.apache.log4j.PatternLayout +log4j.appender.app.layout.conversionPattern=%d [%t] %-5p %c - %m%n +log4j.appender.app.append=false + +# +# Application.log +# + +log4j.appender.axis=org.apache.log4j.DailyRollingFileAppender +log4j.appender.axis.DatePattern='.'yyy-MM-dd +log4j.appender.axis.File=${xnat.home}/logs/axis.log +log4j.appender.axis.Append=true +log4j.appender.axis.Threshold=WARN +log4j.appender.axis.layout=org.apache.log4j.PatternLayout +log4j.appender.axis.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n + +# +# XDAT +# +log4j.appender.xdat=org.apache.log4j.DailyRollingFileAppender +log4j.appender.xdat.DatePattern='.'yyy-MM-dd +log4j.appender.xdat.file=${xnat.home}/logs/xdat.log +log4j.appender.xdat.layout=org.apache.log4j.PatternLayout +log4j.appender.xdat.layout.conversionPattern=%d [%t] %-5p %c - %m%n +log4j.appender.xdat.append=true + +# +# Restlets +# +log4j.appender.restlet=org.apache.log4j.DailyRollingFileAppender +log4j.appender.restlet.DatePattern='.'yyy-MM-dd +log4j.appender.restlet.file=${xnat.home}/logs/restlet.log +log4j.appender.restlet.layout=org.apache.log4j.PatternLayout +log4j.appender.restlet.layout.conversionPattern=%d [%t] %-5p %c - %m%n +log4j.appender.restlet.append=true + +# +# Prearchive +# +log4j.appender.prearchive=org.apache.log4j.DailyRollingFileAppender +log4j.appender.prearchive.DatePattern='.'yyy-MM-dd +log4j.appender.prearchive.file=${xnat.home}/logs/prearchive.log +log4j.appender.prearchive.layout=org.apache.log4j.PatternLayout +log4j.appender.prearchive.layout.conversionPattern=%d [%t] %-5p %c - %m%n +log4j.appender.prearchive.append=true + +# +# DICOM +# +log4j.appender.dicom=org.apache.log4j.DailyRollingFileAppender +log4j.appender.dicom.DatePattern='.'yyy-MM-dd +log4j.appender.dicom.file=${xnat.home}/logs/dicom.log +log4j.appender.dicom.layout=org.apache.log4j.PatternLayout +log4j.appender.dicom.layout.conversionPattern=%d [%t] %-5p %c - %m%n +log4j.appender.dicom.append=true + +# +# ACCESS LOG +# +log4j.appender.access=org.apache.log4j.DailyRollingFileAppender +log4j.appender.access.DatePattern='.'yyy-MM-dd +log4j.appender.access.file=${xnat.home}/logs/access.log +log4j.appender.access.ImmediateFlush=true +log4j.appender.access.Threshold=ERROR +log4j.appender.access.append=true +log4j.appender.access.layout=org.apache.log4j.PatternLayout +log4j.appender.access.layout.conversionPattern=%d - %m%n + +# +# QUERY LOG +# +log4j.appender.sql=org.apache.log4j.DailyRollingFileAppender +log4j.appender.sql.file=${xnat.home}/logs/sql.log +log4j.appender.sql.ImmediateFlush=true +log4j.appender.sql.DatePattern='.'yyy-MM-dd +log4j.appender.sql.append=true +log4j.appender.sql.layout=org.apache.log4j.PatternLayout +log4j.appender.sql.layout.conversionPattern=%d - %m%n + +# REMOTE LOG +# +log4j.appender.remote=org.apache.log4j.DailyRollingFileAppender +log4j.appender.remote.file=${xnat.home}/logs/remote.log +log4j.appender.remote.ImmediateFlush=true +log4j.appender.remote.DatePattern='.'yyy-MM-dd +log4j.appender.remote.append=true +log4j.appender.remote.layout=org.apache.log4j.PatternLayout +log4j.appender.remote.layout.conversionPattern=%d - %m%n + +# +# ANALYTICS LOG +# +# log4j.appender.analytics = org.apache.log4j.jdbc.JDBCAppender +# log4j.appender.analytics.layout = org.apache.log4j.PatternLayout +# log4j.appender.analytics.layout.conversionPattern = INSERT INTO analytics (entry_date, entry_level, entry_location, message) VALUES ( '%d{yyyy-MM-dd HH:mm:ss.SSS}','%p', '%C;%L', E'%m' ) +# log4j.appender.analytics.URL = jdbc:postgresql://localhost/xnat +# log4j.appender.analytics.Driver = org.postgresql.Driver +# log4j.appender.analytics.User = xnat +# log4j.appender.analytics.Password = xnat + +# +# XDAT Security +# +log4j.appender.security=org.apache.log4j.DailyRollingFileAppender +log4j.appender.security.DatePattern='.'yyy-MM-dd +log4j.appender.security.file=${xnat.home}/logs/security.log +log4j.appender.security.layout=org.apache.log4j.PatternLayout +log4j.appender.security.layout.conversionPattern=%d [%t] %-5p %c - %m%n +log4j.appender.security.append=true + +# +# Spring Framework logs +# +log4j.appender.spring=org.apache.log4j.DailyRollingFileAppender +log4j.appender.spring.DatePattern='.'yyy-MM-dd +log4j.appender.spring.file=${xnat.home}/logs/spring.log +log4j.appender.spring.layout=org.apache.log4j.PatternLayout +log4j.appender.spring.layout.conversionPattern=%d [%t] %-5p %c - %m%n +log4j.appender.spring.append=true + +# +# NRG and Spring ORM Framework logs +# +log4j.appender.orm=org.apache.log4j.DailyRollingFileAppender +log4j.appender.orm.DatePattern='.'yyy-MM-dd +log4j.appender.orm.file=${xnat.home}/logs/orm.log +log4j.appender.orm.layout=org.apache.log4j.PatternLayout +log4j.appender.orm.layout.conversionPattern=%d [%t] %-5p %c - %m%n +log4j.appender.orm.append=true + +# +# Automation log output +# +log4j.appender.automation=org.apache.log4j.DailyRollingFileAppender +log4j.appender.automation.File=${xnat.home}/logs/automation.log +log4j.appender.automation.DatePattern='.'yyyy-MM-dd +log4j.appender.automation.layout=org.apache.log4j.PatternLayout +log4j.appender.automation.layout.ConversionPattern=%d %m%n + +# +# Received file log +# +log4j.appender.RECEIVED=org.apache.log4j.DailyRollingFileAppender +log4j.appender.RECEIVED.File=${xnat.home}/logs/received.log +log4j.appender.RECEIVED.DatePattern='.'yyyy-MM-dd +log4j.appender.RECEIVED.layout=org.apache.log4j.PatternLayout +log4j.appender.RECEIVED.layout.ConversionPattern=%d %m%n +log4j.additivity.org.nrg.xnat.received=false +log4j.logger.org.nrg.xnat.received=INFO,RECEIVED + +# +# Pipeline Logfile +# +log4j.category.org.nrg.pipeline=ERROR, pipeline +log4j.additivity.org.nrg.pipeline=false +log4j.appender.pipeline=org.apache.log4j.DailyRollingFileAppender +log4j.appender.pipeline.File=${xnat.home}/logs/pipeline.log +log4j.appender.pipeline.DatePattern='.'yyyy-MM-dd +log4j.appender.pipeline.layout=org.apache.log4j.PatternLayout +log4j.appender.pipeline.layout.ConversionPattern=%d %m%n + +# +# Pipeline Launch Logfile +# +log4j.category.org.nrg.pipeline.launch=INFO, launch +log4j.additivity.org.nrg.pipeline.launch=false +log4j.appender.launch=org.apache.log4j.DailyRollingFileAppender +log4j.appender.launch.File=${xnat.home}/logs/launch.log +log4j.appender.launch.DatePattern='.'yyyy-MM-dd +log4j.appender.launch.layout=org.apache.log4j.PatternLayout +log4j.appender.launch.layout.ConversionPattern=%d %m%n + +# +# JMS logging +# +log4j.category.org.springframework.jms=INFO, jms +log4j.additivity.org.springframework.jms=false +log4j.category.org.nrg.xnat.services.messaging=INFO, jms +log4j.additivity.org.nrg.xnat.services.messaging=false +log4j.appender.jms=org.apache.log4j.DailyRollingFileAppender +log4j.appender.jms.File=${xnat.home}/logs/jms.log +log4j.appender.jms.DatePattern='.'yyyy-MM-dd +log4j.appender.jms.layout=org.apache.log4j.PatternLayout +log4j.appender.jms.layout.ConversionPattern=%d %m%n diff --git a/src/main/webapp/WEB-INF/conf/TurbineResources.properties b/src/main/webapp/WEB-INF/conf/TurbineResources.properties index 4671c0b610896ace9b4ca3eb1fecad9cdb80970a..84f1203ee9f171dd6e7a09736afa1807d6e2ba7c 100644 --- a/src/main/webapp/WEB-INF/conf/TurbineResources.properties +++ b/src/main/webapp/WEB-INF/conf/TurbineResources.properties @@ -14,7 +14,7 @@ # # ------------------------------------------------------------------- -log4j.file = WEB-INF/conf/log4j.properties +log4j.file = # ------------------------------------------------------------------- # @@ -84,7 +84,7 @@ scheduledjob.cache.size=10 # Default: org.apache.turbine.modules # ------------------------------------------------------------------- -module.packages = org.apache.turbine.app.xnat17.modules,org.nrg.xnat.turbine.modules,org.nrg.xdat.turbine.modules +module.packages = org.apache.turbine.app.xnat.modules,org.nrg.xnat.turbine.modules,org.nrg.xdat.turbine.modules # ------------------------------------------------------------------- #