From 3f008bc3b3be75e3057c7646ed4e8ce586ff2e64 Mon Sep 17 00:00:00 2001 From: utas-raymondng Date: Wed, 23 Oct 2024 13:57:07 +1100 Subject: [PATCH 1/4] Init checkin --- Dockerfile | 10 +- geonetwork-core/pom.xml | 94 ++++++++------ .../au/org/aodn/geonetwork4/AspectConfig.java | 119 ++++++++++++++++++ .../java/au/org/aodn/geonetwork4/Config.java | 44 ------- .../src/main/resources/log4j-imos.xml | 5 + .../formatter/post-processing.xsl | 14 +++ 6 files changed, 200 insertions(+), 86 deletions(-) create mode 100644 geonetwork-core/src/main/java/au/org/aodn/geonetwork4/AspectConfig.java create mode 100644 geonetwork-core/src/main/resources/schema_plugins/iso19115-3.2018/formatter/post-processing.xsl diff --git a/Dockerfile b/Dockerfile index 50e5499..94878f2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,10 +19,18 @@ COPY ./geonetwork-core/target/classes/log4j-imos-index.xml ${GN_DIR}/WEB-INF/cla # Copy our jar to the lib folder so that scan can happens COPY ./geonetwork-core/target/geonetwork4-*.jar ${GN_DIR}/WEB-INF/lib/ COPY ./geonetwork-api/target/geonetwork-api-*.jar ${GN_DIR}/WEB-INF/lib/ +# Copy deps that missing +COPY ./geonetwork-core/target/dependency/aspectjweaver-*.jar ${GN_DIR}/WEB-INF/lib/ +COPY ./geonetwork-core/target/dependency/jackson-dataformat-xml-*.jar ${GN_DIR}/WEB-INF/lib/ +COPY ./geonetwork-core/target/dependency/stax2-api-*.jar ${GN_DIR}/WEB-INF/lib/ +COPY ./geonetwork-core/target/dependency/spring-boot-actuator-*.jar ${GN_DIR}/WEB-INF/lib/ +COPY ./geonetwork-core/target/dependency/spring-boot-actuator-autoconfigure-*.jar ${GN_DIR}/WEB-INF/lib/ +COPY ./geonetwork-core/target/dependency/underscore-*.jar ${GN_DIR}/WEB-INF/lib/ -COPY ./geonetwork-core/target/dependency/* ${GN_DIR}/WEB-INF/lib/ COPY ./geonetwork-core/target/classes/schema_plugins/converter/*.xsl ${GN_DIR}/WEB-INF/data/config/schema_plugins/iso19139/process/ COPY ./geonetwork-core/target/classes/schema_plugins/converter/*.xsl ${GN_DIR}/WEB-INF/data/config/schema_plugins/iso19115-3.2018/process/ +COPY ./geonetwork-core/target/classes/schema_plugins/iso19115-3.2018/formatter/*.xsl ${GN_DIR}/WEB-INF/data/config/schema_plugins/iso19115-3.2018/formatter/xsl-view/ + # Config override COPY ./geonetwork-core/target/classes/gnconfig/config-overrides.xml ${GN_DIR}/WEB-INF/ diff --git a/geonetwork-core/pom.xml b/geonetwork-core/pom.xml index 4de9120..db5f499 100644 --- a/geonetwork-core/pom.xml +++ b/geonetwork-core/pom.xml @@ -79,59 +79,71 @@ - + org.apache.maven.plugins maven-dependency-plugin - copy + copy-jar package copy + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + ${jackson.version} + jar + true + + + org.codehaus.woodstox + stax2-api + ${stax2.version} + jar + true + + + org.springframework.boot + spring-boot-actuator + ${springboot.version} + jar + true + + + org.springframework.boot + spring-boot-actuator-autoconfigure + ${springboot.version} + jar + true + + + com.github.javadev + underscore + ${underscore.version} + jar + true + + + + + + copy-deps + package + + copy-dependencies + + + runtime + jar + - - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - ${jackson.version} - jar - true - - - org.codehaus.woodstox - stax2-api - ${stax2.version} - jar - true - - - org.springframework.boot - spring-boot-actuator - ${springboot.version} - jar - true - - - org.springframework.boot - spring-boot-actuator-autoconfigure - ${springboot.version} - jar - true - - - com.github.javadev - underscore - ${underscore.version} - jar - true - - - + diff --git a/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/AspectConfig.java b/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/AspectConfig.java new file mode 100644 index 0000000..6917065 --- /dev/null +++ b/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/AspectConfig.java @@ -0,0 +1,119 @@ +package au.org.aodn.geonetwork4; + +import au.org.aodn.geonetwork_api.openapi.invoker.ApiClient; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.fao.geonet.api.records.formatters.FormatterParams; + +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.StringReader; +import java.io.StringWriter; +import java.lang.reflect.Method; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.Path; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.context.annotation.EnableLoadTimeWeaving; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.HttpClientErrorException; + +import javax.annotation.PostConstruct; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +@Aspect +//@EnableAspectJAutoProxy +@EnableLoadTimeWeaving +@Configuration +public class AspectConfig { + protected Logger logger = LoggerFactory.getLogger(AspectConfig.class); + protected TransformerFactory factory = TransformerFactory.newInstance(); + + @Pointcut("execution(public * org.fao.geonet.api.records.formatters..*.format(..))") + public void interceptFormatter() {} + /** + * Use aspectJ to intercept all call that ends with WithHttpInfo, we must always use geonetwork api call + * ends with WithHttpInfo because the way geonetworks works is you must present an X-XSRF-TOKEN and session + * in the call with username password, otherwise it will fail. + * You need to make an init call to get the X-XSRF-TOKEN, the call will have status forbidden + * and comes back with the token in cookie, then you need to set the token before next call. + */ + @Pointcut("execution(public * au.org.aodn.geonetwork_api.openapi.api..*.*WithHttpInfo(..))") + public void interceptWithHttpInfo() {} + + @Around("interceptWithHttpInfo()") + public ResponseEntity aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable { + try { + return (ResponseEntity) joinPoint.proceed(); + } + catch(HttpClientErrorException.Forbidden e) { + // cookie format is like this + // XSRF-TOKEN=634f5b0d-49b6-43a6-a995-c7cb0db9eb64; Path=/geonetwork + String cookie = e.getResponseHeaders().getFirst(HttpHeaders.SET_COOKIE); + String token = cookie.split(";")[0].split("=")[1].trim(); + + // All these api object have the getApiClient() method + Method method = joinPoint.getTarget().getClass().getMethod("getApiClient"); + ApiClient apiClient = (ApiClient)method.invoke(joinPoint.getTarget()); + + logger.info("Setting X-XSRF-TOKEN for {} to {}", joinPoint.getTarget().getClass(), token); + apiClient.addDefaultHeader("X-XSRF-TOKEN", token); + apiClient.addDefaultCookie("XSRF-TOKEN", token); + + return (ResponseEntity)joinPoint.proceed(); + } + } + + @Around("interceptFormatter()") + public Object afterProcessingXslt(ProceedingJoinPoint joinPoint) throws Throwable { + if(joinPoint.getArgs()[0] instanceof FormatterParams) { + FormatterParams params = (FormatterParams)joinPoint.getArgs()[0]; + + // Expect a string of html after processing + Object value = joinPoint.proceed(); + + Path p = Paths.get(params.formatDir + "post-processing.xsl"); + if(Files.exists(p)) { + try(InputStream inputStream = new FileInputStream(p.toFile())) { + Source xslt = new StreamSource(inputStream); + Transformer transformer = factory.newTransformer(xslt); + + // Set the parameter value + transformer.setParameter("xml", params.metadataInfo.asXml()); + + // Input source (XHTML) + Source text = new StreamSource(new StringReader(value.toString())); + + // Output destination + StringWriter outputWriter = new StringWriter(); + StreamResult result = new StreamResult(outputWriter); + + // Perform the transformation + transformer.transform(text, result); + return result.toString(); + } + } + + return value; + } + else { + throw new RuntimeException("Format function call expected FormatterParams args"); + } + } + + @PostConstruct + public void init() { + logger.info("Init XsltConfig completed"); + } +} diff --git a/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/Config.java b/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/Config.java index c25d59e..c42b02f 100644 --- a/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/Config.java +++ b/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/Config.java @@ -8,11 +8,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Pointcut; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; @@ -28,21 +23,16 @@ import org.fao.geonet.ApplicationContextHolder; import org.springframework.core.io.ResourceLoader; -import org.springframework.http.HttpHeaders; -import org.springframework.http.ResponseEntity; import org.springframework.http.client.support.BasicAuthenticationInterceptor; -import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.util.DefaultUriBuilderFactory; -import java.lang.reflect.Method; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.Map; -@Aspect @Configuration /* * EnableAutoConfiguration so that Actuator can config automatically, however, the @@ -54,7 +44,6 @@ org.springdoc.webmvc.core.SpringDocWebMvcConfiguration.class, org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration.class }) -@EnableAspectJAutoProxy @PropertySources({ @PropertySource("classpath:application.properties"), @PropertySource( @@ -74,39 +63,6 @@ public class Config { @Autowired protected GenericEntityListener genericEntityListener; - /** - * Use aspectJ to intercept all call that ends with WithHttpInfo, we must always use geonetwork api call - * ends with WithHttpInfo because the way geonetworks works is you must present an X-XSRF-TOKEN and session - * in the call with username password, otherwise it will fail. - * You need to make an init call to get the X-XSRF-TOKEN, the call will have status forbidden - * and comes back with the token in cookie, then you need to set the token before next call. - */ - @Pointcut("execution(public * au.org.aodn.geonetwork_api.openapi.api..*.*WithHttpInfo(..))") - public void interceptWithHttpInfo() {} - - @Around("interceptWithHttpInfo()") - public ResponseEntity aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable { - try { - return (ResponseEntity) joinPoint.proceed(); - } - catch(HttpClientErrorException.Forbidden e) { - // cookie format is like this - // XSRF-TOKEN=634f5b0d-49b6-43a6-a995-c7cb0db9eb64; Path=/geonetwork - String cookie = e.getResponseHeaders().getFirst(HttpHeaders.SET_COOKIE); - String token = cookie.split(";")[0].split("=")[1].trim(); - - // All these api object have the getApiClient() method - Method method = joinPoint.getTarget().getClass().getMethod("getApiClient"); - ApiClient apiClient = (ApiClient)method.invoke(joinPoint.getTarget()); - - logger.info("Setting X-XSRF-TOKEN for {} to {}", joinPoint.getTarget().getClass(), token); - apiClient.addDefaultHeader("X-XSRF-TOKEN", token); - apiClient.addDefaultCookie("XSRF-TOKEN", token); - - return (ResponseEntity)joinPoint.proceed(); - } - } - @PostConstruct public void init() throws NoSuchAlgorithmException, KeyManagementException { logger.info("AODN - Done set logger info"); diff --git a/geonetwork-core/src/main/resources/log4j-imos.xml b/geonetwork-core/src/main/resources/log4j-imos.xml index 43b7e16..3ff382e 100644 --- a/geonetwork-core/src/main/resources/log4j-imos.xml +++ b/geonetwork-core/src/main/resources/log4j-imos.xml @@ -148,6 +148,11 @@ + + + + + diff --git a/geonetwork-core/src/main/resources/schema_plugins/iso19115-3.2018/formatter/post-processing.xsl b/geonetwork-core/src/main/resources/schema_plugins/iso19115-3.2018/formatter/post-processing.xsl new file mode 100644 index 0000000..8ca34f1 --- /dev/null +++ b/geonetwork-core/src/main/resources/schema_plugins/iso19115-3.2018/formatter/post-processing.xsl @@ -0,0 +1,14 @@ + + + +
+

+ + Custom Provided By Section +

+ +
+
+
\ No newline at end of file From dfc516cb8b444aec35a29bc8eea26974282f8c2b Mon Sep 17 00:00:00 2001 From: utas-raymondng Date: Fri, 25 Oct 2024 11:47:15 +1100 Subject: [PATCH 2/4] Called the apsectj formatter --- Dockerfile | 1 - geonetwork-core/pom.xml | 1 - .../au/org/aodn/geonetwork4/AspectConfig.java | 8 +++--- .../java/au/org/aodn/geonetwork4/Config.java | 25 ++++++++++++++++++- .../src/main/resources/log4j-imos.xml | 2 +- 5 files changed, 28 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index 94878f2..6520b06 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,7 +20,6 @@ COPY ./geonetwork-core/target/classes/log4j-imos-index.xml ${GN_DIR}/WEB-INF/cla COPY ./geonetwork-core/target/geonetwork4-*.jar ${GN_DIR}/WEB-INF/lib/ COPY ./geonetwork-api/target/geonetwork-api-*.jar ${GN_DIR}/WEB-INF/lib/ # Copy deps that missing -COPY ./geonetwork-core/target/dependency/aspectjweaver-*.jar ${GN_DIR}/WEB-INF/lib/ COPY ./geonetwork-core/target/dependency/jackson-dataformat-xml-*.jar ${GN_DIR}/WEB-INF/lib/ COPY ./geonetwork-core/target/dependency/stax2-api-*.jar ${GN_DIR}/WEB-INF/lib/ COPY ./geonetwork-core/target/dependency/spring-boot-actuator-*.jar ${GN_DIR}/WEB-INF/lib/ diff --git a/geonetwork-core/pom.xml b/geonetwork-core/pom.xml index db5f499..3c1f093 100644 --- a/geonetwork-core/pom.xml +++ b/geonetwork-core/pom.xml @@ -143,7 +143,6 @@ - diff --git a/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/AspectConfig.java b/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/AspectConfig.java index 6917065..dafa0e4 100644 --- a/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/AspectConfig.java +++ b/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/AspectConfig.java @@ -20,7 +20,6 @@ import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; -import org.springframework.context.annotation.EnableLoadTimeWeaving; import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.web.client.HttpClientErrorException; @@ -33,14 +32,14 @@ import javax.xml.transform.stream.StreamSource; @Aspect -//@EnableAspectJAutoProxy -@EnableLoadTimeWeaving @Configuration +@EnableAspectJAutoProxy public class AspectConfig { + protected Logger logger = LoggerFactory.getLogger(AspectConfig.class); protected TransformerFactory factory = TransformerFactory.newInstance(); - @Pointcut("execution(public * org.fao.geonet.api.records.formatters..*.format(..))") + @Pointcut("execution(public * org.fao.geonet.api.records.formatters.XsltFormatter.format(org.fao.geonet.api.records.formatters.FormatterParams))") public void interceptFormatter() {} /** * Use aspectJ to intercept all call that ends with WithHttpInfo, we must always use geonetwork api call @@ -104,7 +103,6 @@ public Object afterProcessingXslt(ProceedingJoinPoint joinPoint) throws Throwabl return result.toString(); } } - return value; } else { diff --git a/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/Config.java b/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/Config.java index c42b02f..2133a75 100644 --- a/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/Config.java +++ b/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/Config.java @@ -8,10 +8,14 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.fao.geonet.api.records.formatters.XsltFormatter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.*; @@ -62,10 +66,26 @@ public class Config { @Autowired protected GenericEntityListener genericEntityListener; + /** + * This is an aspectj based formatter in the parent context. + */ + @Autowired + protected XsltFormatter aspectJXsltFormatter; + + public void swapBean(String beanName, T bean) { + DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) ApplicationContextHolder.get().getBeanFactory(); + + // Remove the old bean + if (beanFactory.containsBean(beanName)) { + beanFactory.destroySingleton(beanName); + } + + // Register the new singleton instance + beanFactory.registerSingleton(beanName, bean); + } @PostConstruct public void init() throws NoSuchAlgorithmException, KeyManagementException { - logger.info("AODN - Done set logger info"); logger.info("Using git branch {} for setup", gitBranch); /* @@ -81,6 +101,9 @@ public void init() throws NoSuchAlgorithmException, KeyManagementException { */ ConfigurableApplicationContext jeevesContext = ApplicationContextHolder.get(); jeevesContext.getBeanFactory().registerSingleton("genericEntityListener", genericEntityListener); + + // We need to swap with the aspectj bean + swapBean("xsltFormatter", aspectJXsltFormatter); } /** * The reason we need is to set the WEB_ROOT context to be used by Actuator. In springboot application it is diff --git a/geonetwork-core/src/main/resources/log4j-imos.xml b/geonetwork-core/src/main/resources/log4j-imos.xml index 3ff382e..7ce1827 100644 --- a/geonetwork-core/src/main/resources/log4j-imos.xml +++ b/geonetwork-core/src/main/resources/log4j-imos.xml @@ -148,7 +148,7 @@
- + From 1e5fa297b65cb9309c78be6b1b363b8fec82730c Mon Sep 17 00:00:00 2001 From: utas-raymondng Date: Fri, 25 Oct 2024 13:55:14 +1100 Subject: [PATCH 3/4] Post-processing works --- .../au/org/aodn/geonetwork4/AspectConfig.java | 40 +++++++++++++------ .../java/au/org/aodn/geonetwork4/Config.java | 8 +++- .../formatter/post-processing.xsl | 17 ++++++-- 3 files changed, 46 insertions(+), 19 deletions(-) diff --git a/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/AspectConfig.java b/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/AspectConfig.java index dafa0e4..a2ec47d 100644 --- a/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/AspectConfig.java +++ b/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/AspectConfig.java @@ -7,8 +7,6 @@ import org.aspectj.lang.annotation.Pointcut; import org.fao.geonet.api.records.formatters.FormatterParams; -import java.io.FileInputStream; -import java.io.InputStream; import java.io.StringReader; import java.io.StringWriter; import java.lang.reflect.Method; @@ -31,13 +29,16 @@ import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; +/** + * This class is used to add AspectJ support to the geonetwork. Mainly override or intercept function call + * that is not possible without alter the code of geonetwork. + */ @Aspect @Configuration @EnableAspectJAutoProxy public class AspectConfig { protected Logger logger = LoggerFactory.getLogger(AspectConfig.class); - protected TransformerFactory factory = TransformerFactory.newInstance(); @Pointcut("execution(public * org.fao.geonet.api.records.formatters.XsltFormatter.format(org.fao.geonet.api.records.formatters.FormatterParams))") public void interceptFormatter() {} @@ -73,7 +74,14 @@ public ResponseEntity aroundAdvice(ProceedingJoinPoint joinPoint) throws Thro return (ResponseEntity)joinPoint.proceed(); } } - + /** + * Use to intercept the formatter to provide a post-processing transformation. That is after the original transform + * you got a chance to do additional transformation based on the output content. By doing so you just need to + * add a post-processing.xsl in the same folder, and it will work without duplicate or create new view.xsl + * @param joinPoint - Aspect call param for @Around + * @return - A post-processed string + * @throws Throwable - Not expect to have this throw + */ @Around("interceptFormatter()") public Object afterProcessingXslt(ProceedingJoinPoint joinPoint) throws Throwable { if(joinPoint.getArgs()[0] instanceof FormatterParams) { @@ -82,25 +90,31 @@ public Object afterProcessingXslt(ProceedingJoinPoint joinPoint) throws Throwabl // Expect a string of html after processing Object value = joinPoint.proceed(); - Path p = Paths.get(params.formatDir + "post-processing.xsl"); + Path p = Paths.get(params.formatDir + "/post-processing.xsl"); if(Files.exists(p)) { - try(InputStream inputStream = new FileInputStream(p.toFile())) { - Source xslt = new StreamSource(inputStream); + try { + Source xslt = new StreamSource(p.toFile()); + // Input source (XHTML), but need to remove the extra tag as this is not valid during transformation + Source text = new StreamSource( + new StringReader(value.toString().replaceAll("]*>", "")) + ); + + TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(xslt); // Set the parameter value transformer.setParameter("xml", params.metadataInfo.asXml()); - // Input source (XHTML) - Source text = new StreamSource(new StringReader(value.toString())); - // Output destination StringWriter outputWriter = new StringWriter(); - StreamResult result = new StreamResult(outputWriter); // Perform the transformation - transformer.transform(text, result); - return result.toString(); + transformer.transform(text, new StreamResult(outputWriter)); + // Add back the tag + return "" + outputWriter; + } + catch(Exception e) { + logger.error("Error in post-processing", e); } } return value; diff --git a/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/Config.java b/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/Config.java index 2133a75..83a6829 100644 --- a/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/Config.java +++ b/geonetwork-core/src/main/java/au/org/aodn/geonetwork4/Config.java @@ -12,9 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; -import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.ConfigurableApplicationContext; @@ -72,6 +70,12 @@ public class Config { @Autowired protected XsltFormatter aspectJXsltFormatter; + /** + * This is used to swap a bean in the real context that operated which is not current parent context! + * + * @param beanName - The name of the bean you want to swap + * @param bean - Replace by this bean + */ public void swapBean(String beanName, T bean) { DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) ApplicationContextHolder.get().getBeanFactory(); diff --git a/geonetwork-core/src/main/resources/schema_plugins/iso19115-3.2018/formatter/post-processing.xsl b/geonetwork-core/src/main/resources/schema_plugins/iso19115-3.2018/formatter/post-processing.xsl index 8ca34f1..fb6504f 100644 --- a/geonetwork-core/src/main/resources/schema_plugins/iso19115-3.2018/formatter/post-processing.xsl +++ b/geonetwork-core/src/main/resources/schema_plugins/iso19115-3.2018/formatter/post-processing.xsl @@ -1,14 +1,23 @@ - - + + + + + + + + + + -
+

Custom Provided By Section

+ src="custom-logo.png">
\ No newline at end of file From e9102a722f67e57ec3d4e1b257cfd3dfa5fc6269 Mon Sep 17 00:00:00 2001 From: utas-raymondng Date: Fri, 25 Oct 2024 14:01:27 +1100 Subject: [PATCH 4/4] Fix pre-commit --- .../iso19115-3.2018/formatter/post-processing.xsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geonetwork-core/src/main/resources/schema_plugins/iso19115-3.2018/formatter/post-processing.xsl b/geonetwork-core/src/main/resources/schema_plugins/iso19115-3.2018/formatter/post-processing.xsl index fb6504f..d7a2129 100644 --- a/geonetwork-core/src/main/resources/schema_plugins/iso19115-3.2018/formatter/post-processing.xsl +++ b/geonetwork-core/src/main/resources/schema_plugins/iso19115-3.2018/formatter/post-processing.xsl @@ -20,4 +20,4 @@ src="custom-logo.png">
-
\ No newline at end of file +