package com.example.sbcamel.init; import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.bean.BeanConstants; import org.apache.camel.component.cxf.common.message.CxfConstants; import org.apache.camel.model.dataformat.JsonLibrary; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; import com.example.sbcamel.mapper.SessionMapper; import com.example.sbcamel.processor.InspectionProcessor; import com.example.sbcamel.processor.TestProcessor; import com.example.sbcamel.service.SessionService; import jakarta.annotation.PostConstruct; import jakarta.ws.rs.core.Response; @Component public class CamelRouter extends RouteBuilder { private static final String createSessionSql = "CREATE TABLE IF NOT EXISTS public.session (sessionId UUID not null, " + "username CHARACTER VARYING not null, password CHARACTER VARYING not null, PRIMARY KEY (sessionId))"; private static final String addSelector1Sql = "ALTER TABLE IF EXISTS public.session ADD COLUMN IF NOT EXISTS selector1 CHARACTER VARYING NULL"; private static final String addSelector2Sql = "ALTER TABLE IF EXISTS public.session ADD COLUMN IF NOT EXISTS selector2 CHARACTER VARYING NULL"; private static final String addSelector3Sql = "ALTER TABLE IF EXISTS public.session ADD COLUMN IF NOT EXISTS selector3 CHARACTER VARYING NULL"; @Value("${app.queue-name}") private String queueName; @Autowired private JdbcTemplate jdbcTemplate; @Autowired protected InspectionProcessor inspectionProcessor; @Autowired protected TestProcessor testProcessor; @PostConstruct private void init() { org.apache.ibatis.logging.LogFactory.useSlf4jLogging(); jdbcTemplate.execute(createSessionSql); jdbcTemplate.execute(addSelector1Sql); jdbcTemplate.execute(addSelector2Sql); jdbcTemplate.execute(addSelector3Sql); } @Override public void configure() throws Exception { onException(jakarta.ws.rs.NotFoundException.class).handled(true) .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(Response.Status.NOT_FOUND.getStatusCode())) .setBody(simple("${exchangeProperty.CamelExceptionCaught.getMessage()}")); from("cxfrs:/api?resourceClasses=" + SessionService.class.getName() + "&bindingStyle=Default" + "&providers=jaxrsProvider&loggingFeatureEnabled=true").to("log:cxfrs?showAll=true") .to("activemq6:queue:" + queueName).process(exchange -> { if (exchange.getMessage().getBody() != null && exchange.getMessage().getBody() instanceof byte[] && new String((byte[]) exchange.getMessage().getBody()).equals("null")) { if (exchange.getIn().getHeader(Exchange.HTTP_METHOD).equals("GET")) { throw new jakarta.ws.rs.NotFoundException(); } } }); from("activemq6:queue:" + queueName) .process(exchange -> exchange.getIn().setHeader(BeanConstants.BEAN_METHOD_NAME, exchange.getIn().getHeader(CxfConstants.OPERATION_NAME.toLowerCase()))) .to("log:activemq?showAll=true").transacted("propagationRequired").choice() .when(header(BeanConstants.BEAN_METHOD_NAME).isEqualTo("updateSession")) .to("mybatis:" + SessionMapper.class.getName() + ".updateSession?statementType=Update&outputHeader=X-UpdateResult") .process(exchange -> { exchange.getMessage().setBody(exchange.getIn().getBody()); }) .when(header(BeanConstants.BEAN_METHOD_NAME).isEqualTo("findSessions")) .to("mybatis:" + SessionMapper.class.getName() + ".findSessions?statementType=SelectList") .when(header(BeanConstants.BEAN_METHOD_NAME).isEqualTo("findSession")) .to("mybatis:" + SessionMapper.class.getName() + ".findSession?statementType=SelectOne") .when(header(BeanConstants.BEAN_METHOD_NAME).isEqualTo("inspect")) .to("mybatis:" + SessionMapper.class.getName() + ".findSession?statementType=SelectOne") .process(inspectionProcessor) .when(header(BeanConstants.BEAN_METHOD_NAME).isEqualTo("test")) .process(testProcessor) .end().marshal().json(JsonLibrary.Jackson); } }