WebApplicationExceptionMapper.java
- /*
- * GovWay - A customizable API Gateway
- * https://govway.org
- *
- * Copyright (c) 2005-2025 Link.it srl (https://link.it).
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3, as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- package org.openspcoop2.utils.service.fault.jaxrs;
- import javax.ws.rs.core.MultivaluedMap;
- import javax.ws.rs.core.Response;
- import javax.ws.rs.core.Response.ResponseBuilder;
- import javax.ws.rs.ext.ExceptionMapper;
- import org.openspcoop2.utils.transport.http.HttpConstants;
- import org.openspcoop2.utils.transport.http.HttpUtilities;
- import org.slf4j.Logger;
- import com.fasterxml.jackson.core.JsonParseException;
- import com.fasterxml.jackson.databind.JsonMappingException;
- /**
- * WebApplicationExceptionMapper
- *
- * @author Poli Andrea (apoli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class WebApplicationExceptionMapper implements ExceptionMapper<javax.ws.rs.WebApplicationException> {
- private Logger log = org.openspcoop2.utils.LoggerWrapperFactory.getLogger(WebApplicationExceptionMapper.class);
-
- private boolean excludeFaultBean;
- private boolean updateTitle = true;
- private ITypeGenerator typeGenerator;
-
- public boolean isExcludeFaultBean() {
- return this.excludeFaultBean;
- }
- public void setExcludeFaultBean(boolean excludeFaultBean) {
- this.excludeFaultBean = excludeFaultBean;
- }
-
- public boolean isUpdateTitle() {
- return this.updateTitle;
- }
- public void setUpdateTitle(boolean updateTitle) {
- this.updateTitle = updateTitle;
- }
-
- public ITypeGenerator getTypeGenerator() {
- return this.typeGenerator;
- }
- public void setTypeGenerator(ITypeGenerator typeGenerator) {
- this.typeGenerator = typeGenerator;
- }
-
- @Override
- public Response toResponse(javax.ws.rs.WebApplicationException e) {
- if(e.getResponse()==null || e.getResponse().getEntity()==null || !(e.getResponse().getEntity() instanceof ProblemRFC7807)) {
-
- this.log.error(e.getMessage(),e);
-
- ProblemRFC7807 problem = null;
-
- if(e.getCause() instanceof JsonMappingException) {
- JsonMappingException jsonMappingException = (JsonMappingException) e.getCause();
- problem = new ProblemValidation(FaultCode.RICHIESTA_NON_VALIDA.toFault());
- ((ProblemValidation) problem).addInvalidParam(jsonMappingException.getPathReference(), jsonMappingException.getMessage(), null);
- }
- else if(e.getCause() instanceof JsonParseException) {
- JsonParseException jsonParseException = (JsonParseException) e.getCause();
- problem = new ProblemValidation(FaultCode.RICHIESTA_NON_VALIDA.toFault());
- if(jsonParseException.getOriginalMessage()!=null) {
- ((ProblemValidation) problem).addInvalidParam("body", jsonParseException.getOriginalMessage(), null);
- }
- else {
- ((ProblemValidation) problem).addInvalidParam("body", jsonParseException.getMessage(), null);
- }
- if(jsonParseException.getLocation()!=null) {
- StringBuilder bf = new StringBuilder();
- bf.append("line: ").append(jsonParseException.getLocation().getLineNr()).append(", column: ").append(jsonParseException.getLocation().getColumnNr());
- ((ProblemValidation) problem).addInvalidParam("position", bf.toString(), null);
- }
- }
- else {
- problem = FaultCode.RICHIESTA_NON_VALIDA.toFault();
- }
-
- this.updateProblem(problem, e); // customizzabile
- this._setType(problem, e);
- if(this.updateTitle) {
- // aggiorno rispetto al code modificabile nel metodo sopra
- problem.setTitle(HttpUtilities.getHttpReason(problem.getStatus()));
- }
- return Response.status(problem.getStatus()).entity(problem).type(HttpConstants.CONTENT_TYPE_JSON_PROBLEM_DETAILS_RFC_7807).build();
- }
- else {
- if(this.excludeFaultBean) {
- ResponseBuilder responseBuilder = Response.status(e.getResponse().getStatus());
- if(e.getResponse().getHeaders()!=null) {
- MultivaluedMap<String, Object> map = e.getResponse().getHeaders();
- if(!map.isEmpty()) {
- map.keySet().stream().forEach(k -> {
- responseBuilder.header(k, map.get(k));
- });
- }
- }
- return responseBuilder.build();
- } else {
-
- ProblemRFC7807 problem = this._getProblem(e);
- if(problem!=null) {
- this.updateProblem(problem, e); // customizzabile
- this._setType(problem, e);
- if(this.updateTitle) {
- // aggiorno rispetto al code modificabile nel metodo sopra
- problem.setTitle(HttpUtilities.getHttpReason(problem.getStatus()));
- }
- }
-
- return e.getResponse();
- }
- }
- }
-
- private ProblemRFC7807 _getProblem(javax.ws.rs.WebApplicationException e) {
- if(e==null || e.getResponse()==null || e.getResponse().getEntity()==null) {
- return null;
- }
- if(!(e.getResponse().getEntity() instanceof ProblemRFC7807)) {
- return null;
- }
- ProblemRFC7807 problem = (ProblemRFC7807) e.getResponse().getEntity();
- return problem;
- }
- private void _setType(ProblemRFC7807 problem, javax.ws.rs.WebApplicationException e) {
- if(this.typeGenerator==null) {
- return;
- }
- problem.setType(this.typeGenerator.getType(problem.getStatus(), e));
- }
-
-
- public void updateProblem(ProblemRFC7807 problem, javax.ws.rs.WebApplicationException e) {
-
- }
- }