/*
 * JBoss, Home of Professional Open Source.
 * Copyright 2016, Red Hat Middleware LLC, and individual contributors
 * as indicated by the @author tags. See the copyright.txt file in the
 * distribution for a full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.jboss.wsf.stack.cxf.interceptor;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

import javax.servlet.ServletRequest;
import javax.xml.namespace.QName;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor;
import org.apache.cxf.common.i18n.Message;
import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
import org.jboss.wsf.spi.deployment.Deployment;
import org.jboss.wsf.spi.deployment.Endpoint;
import org.jboss.wsf.spi.invocation.RejectionRule;

/**
 * An interceptor that rejects message by throwing a Fault when the server is suspended.
 * 
 * @author alessio.soldano@jboss.com
 * @since 4-Nov-2016
 *
 */
public class GracefulShutdownInterceptor extends AbstractSoapInterceptor
{
   private static final Logger LOG = LogUtils.getL7dLogger(GracefulShutdownInterceptor.class);

   public GracefulShutdownInterceptor()
   {
      super(Phase.READ);
      addAfter(ReadHeadersInterceptor.class.getName());
   }

   @Override
   public void handleMessage(SoapMessage message) throws Fault
   {
      ServletRequest req = (ServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST);
      if ("true".equals(req.getAttribute("org.wildfly.suspended")))
      {
         if (!message.hasHeaders())
         {
            throw createFault();
         }
         else
         {
            Deployment dep = message.getExchange().get(Endpoint.class).getService().getDeployment();
            RejectionRule rr = dep.getAttachment(RejectionRule.class);
            if (rr != null)
            {
               List<Header> headers = message.getHeaders();
               Map<QName, Object> m = new HashMap<>();
               for (Header header : headers)
               {
                  m.put(header.getName(), header.getObject());
               }
               if (rr.rejectMessage(m))
               {
                  throw createFault();
               }
            }
         }
      }
   }

   private Fault createFault() {
      Fault f = new Fault(new Message("Server is suspended", LOG));
      f.setStatusCode(503);
      return f;
   }
}

@@ -1347,145 +1347,30 @@
 tor.
-AbstractSoapInterceptor;%0Aimport org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor;%0Aimport org.apache.cxf.common.i18n.Message
+ReadHeadersInterceptor
 ;%0Aim
@@ -1493,16 +1493,109 @@
 .Fault;%0A
+import org.apache.cxf.message.Message;%0Aimport org.apache.cxf.phase.AbstractPhaseInterceptor;%0A
 import o
@@ -2048,20 +2048,21 @@
 Abstract
-Soap
+Phase
 Intercep
@@ -2064,16 +2064,25 @@
 erceptor
+%3CMessage%3E
 %0A%7B%0A   pr
@@ -2346,20 +2346,16 @@
 Message(
-Soap
 Message 
@@ -2569,16 +2569,139 @@
 if (
-!
 message
+ instanceof SoapMessage)%0A         %7B%0A            SoapMessage soapMessage = (SoapMessage)message;%0A            if (!soapMessage
 .has
@@ -2712,34 +2712,40 @@
 ers())%0A         
+ 
-%7B%0A
+  %7B%0A   
             thro
@@ -2762,32 +2762,35 @@
 ult();%0A         
+   
 %7D%0A         else%0A
@@ -2784,16 +2784,19 @@
         
+ 
+  
 else%0A   
@@ -2793,34 +2793,40 @@
   else%0A         
-%7B%0A
+   %7B%0A   
             Depl
@@ -2838,17 +2838,21 @@
 t dep = 
-m
+soapM
 essage.g
@@ -2926,16 +2926,19 @@
         
+   
 Rejectio
@@ -2996,24 +2996,27 @@
             
+  
+ 
 if (rr != nu
@@ -3023,32 +3023,35 @@
 ll)%0A            
+   
 %7B%0A              
@@ -3051,16 +3051,19 @@
         
+ 
+  
 List%3CHea
@@ -3077,17 +3077,21 @@
 aders = 
-m
+soapM
 essage.g
@@ -3099,24 +3099,27 @@
 tHeaders();%0A
+   
             
@@ -3176,16 +3176,19 @@
         
+   
 for (Hea
@@ -3216,34 +3216,40 @@
 %0A               
+ 
-%7B%0A
+  %7B%0A   
                 
@@ -3302,34 +3302,39 @@
 %0A               
-%7D%0A
+   %7D%0A  
                i
@@ -3328,24 +3328,25 @@
             
+ 
 if (rr.rejec
@@ -3365,32 +3365,35 @@
 %0A               
+   
 %7B%0A              
@@ -3388,32 +3388,35 @@
                 
+ 
+  
 throw createFaul
@@ -3412,32 +3412,52 @@
  createFault();%0A
+                  %7D%0A
                %7D
@@ -3478,24 +3478,93 @@
 %0A         %7D%0A
+         else%0A         %7B%0A            throw createFault();%0A         %7D%0A
       %7D%0A   %7D
@@ -3628,16 +3628,43 @@
 ult(new 
+org.apache.cxf.common.i18n.
 Message(

Fix regression with XMLMessage instances