/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.jaxrs;

import org.apache.axis2.context.MessageContext;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.AxisBindingOperation;
import org.apache.axis2.description.AxisEndpoint;
import org.apache.axis2.description.AxisBinding;
import org.apache.axis2.description.WSDL2Constants;

import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.PUT;
import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import javax.xml.namespace.QName;
import java.util.Iterator;

//root level annotations. some of these can be overriden by method level annotations.
@Path("testroot/")
@Consumes(value={"text/xml","application/xml"})
@Produces("text/xml")
public class Service {
/*
 * These are some operations for testing with plain archive deployment. here we try to test
 * proper functionality of http:location & http:method. since these values can be overriden in the Services xml
 * there are some test methods to test that behaviour too.
 */
    // uses the root path, root input-output serialization & default httpMethod

    @Path("add/{data1}")
    public String addDataFromURL(String data1){

          return data1+" created";
    }

    @POST
    @Path("getFromBody/{data1}")
    @Consumes("application/xml")
    @Produces("text/xml")
    public String addDataFromURLandBody(String data1,String data2){

          return data1+" and "+data2+" created";

    }

    @PUT
    @Produces("application/xml")
    @Path("update/{data1}")
    public String updateDataFromURL(String data1){
        return data1+" updated";

    }

    @PUT
    @Path("getFromBody/{data1}")
    public String updateDataFromURLandBody(String data1,String data2){

        return data1+" and "+data2+" updated";
    }

    @GET
    @Path("get/{data1}")
    public String getDataFromURL(String data1){

       return data1+" read";


    }

    @GET
    @Path("getFromBody/{data1}")
    public String getDataFromURLandBody(String data1,String data2){

        return data1+" and "+data2+" read";
    }

    @DELETE
    @Path("delete/{data1}")
    public String deleteDataFromURL(String data1){

        return data1+" deleted";
    }

    @DELETE
    @Path("getFromBody/{data1}")
    public String deleteDataFromURLandBody(String data1,String data2){

        return data1+" and "+data2+" deleted";

    }


    @POST
    @Path("wrong/error/{data1}")
    public String checkServicesXMLoverriding(String data1,String data2){

        return data1+" and "+data2+" correct";

    }


   public boolean checkTypePublishing(){
      
       MessageContext msgctx= MessageContext.getCurrentMessageContext();
       AxisService axisServce= msgctx.getAxisService();
       AxisEndpoint axisEndpoint= axisServce.getEndpoint("AnnotationServiceHttpEndpoint");
       AxisBinding axisBinding=axisEndpoint.getBinding();
       AxisBindingOperation axisBindingOperation;
       Iterator<AxisBindingOperation> iterator=axisBinding.getChildren();


         while(iterator.hasNext()){
           axisBindingOperation=iterator.next();
             if(axisBindingOperation.getName().equals(new QName("addDataFromURLandBody"))){
                 if(!axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_LOCATION).equals("testroot/getFromBody/{data1}")){
                 System.out.println("wrong http location : found : "+axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_LOCATION)+" expected : testroot/getFromBody/{data1}" );
                  return false;
                }
                 if(!axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_METHOD).equals("POST")){
                  System.out.println("wrong http method : found : "+axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_METHOD)+" expected : POST" );
                  return false;
                }

                 if(!axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_INPUT_SERIALIZATION).equals("application/xml")){
                     System.out.println("INPUT SERIALIZATION TESTS");
                  System.out.println("wrong input serialization : found : "+ axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_INPUT_SERIALIZATION) +" expected : application/xml" );
                  return false;
                }

                if(!axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_OUTPUT_SERIALIZATION).equals("text/xml")){
                     System.out.println("OUTPUT SERIALIZATION TEST");
                  System.out.println("wrong output serialization : found : "+axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_OUTPUT_SERIALIZATION)+" expected : text/xml" );
                  return false;
                }
                 System.out.println("Type publishing test \"addDataFromURLandBody\" OK.........");
             }   

             if(axisBindingOperation.getName().equals(new QName("updateDataFromURL"))){
              
                 if(!axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_LOCATION).equals("testroot/update/{data1}")){
                 System.out.println("wrong http location : found : "+axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_LOCATION)+" expected : testroot/update/{data1}" );
                  return false;
                }
                 if(!axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_METHOD).equals("PUT")){
                  System.out.println("wrong http method : found : "+axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_METHOD)+" expected : PUT" );
                  return false;
                }
                 if(!axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_INPUT_SERIALIZATION).equals("text/xml")){
                  System.out.println("wrong input serialization : found : "+axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_INPUT_SERIALIZATION)+" expected : text/xml" );
                  return false;
                }
                 if(!axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_OUTPUT_SERIALIZATION).equals("application/xml")) {
                  System.out.println("wrong output serialization : found : "+axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_OUTPUT_SERIALIZATION)+" expected : application/xml" );
                  return false;
                }
                 System.out.println("Type publishing test \"updateDataFromURL\" OK.........");
             }

             if(axisBindingOperation.getName().equals(new QName("checkServicesXMLoverriding"))){
                 if(!axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_LOCATION).equals("serviceroot/check")){
                 System.out.println("wrong http location : found : "+axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_LOCATION)+" expected : serviceroot/check" );
                  return false;
                }
                 if(!axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_METHOD).equals("POST")){
                  System.out.println("wrong http method : found : "+axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_METHOD)+" expected : POST" );
                  return false;
                }
                 if(!axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_INPUT_SERIALIZATION).equals("application/xml")){
                  System.out.println("wrong input serialization : found : "+axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_INPUT_SERIALIZATION)+" expected : application/xml" );
                  return false;
                }
                 if(!axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_OUTPUT_SERIALIZATION).equals("application/xml")) {
                  System.out.println("wrong output serialization : found : "+axisBindingOperation.getProperty(WSDL2Constants.ATTR_WHTTP_OUTPUT_SERIALIZATION)+" expected : application/xml" );
                  return false;
                }
                 System.out.println("Type publishing test \"checkServicesXMLoverriding\" OK.........");
             }
         }
      return true; // all the test are ok     
   }



}



