/*
 * 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.temp.doclitbare;

import org.temp.doclitbare.jaxb.xsd.ChangeType;
import org.temp.doclitbare.jaxb.xsd.GetStockQuote;
import org.temp.doclitbare.jaxb.xsd.LastTradeType;
import org.temp.doclitbare.jaxb.xsd.ObjectFactory2;
import org.temp.doclitbare.pojo.arrays.xsd.CarArray;
import org.temp.doclitbare.pojo.arrays.xsd.FloatArray;
import org.temp.doclitbare.pojo.arrays.xsd.ObjectArray;
import org.temp.doclitbare.pojo.arrays.xsd.StringArray;
import org.temp.doclitbare.pojo.xsd.Car;
import org.temp.doclitbare.pojo.xsd.Diablo;
import org.temp.doclitbare.pojo.xsd.Fighter;
import org.temp.doclitbare.xsd.CalendarStringArray;
import org.temp.doclitbare.xsd.IntArrayObjectArrayResult;

import javax.xml.datatype.XMLGregorianCalendar;
import java.math.BigDecimal;


public class DocLitBareService {

    public String stringCar(
            Car carArg) {
        return null;
    }

    public int intFloat(
            float floatArgB) {
        return 0;
    }

    public boolean booleanBoolean(
            boolean boolArg) {
        return false;
    }

    public GetStockQuote getStockQuoteInt(
            int intArgC) {
        return null;
    }

    public FloatArray floatArrayFighter(
            Fighter fighterArg) {
        return null;
    }

    public void voidInt(
            int intArgA) {

    }

    public byte[] byteArrayIntArray(
            int[] intArrayArg) {
        return new byte[0];
    }

    public XMLGregorianCalendar calendarStringArray(
            CalendarStringArray calendarStringArray) {
        return null;
    }

    public ObjectFactory2 objectFactoryCar(
            Car carArgB) {
        return null;
    }

    public StringArray stringArrayInt(
            int intArgB) {
        return null;
    }

    public byte byteByte(
            byte byteArg) {
        return 0;
    }

    public String stringVoid() {
        return null;
    }

    public int intString(
            String stringArgA) {
        return 0;
    }

    public ObjectArray objectArrayCarArray(
            CarArray carArrayArg) {
        return null;
    }

    public Object objectFloat(
            float floatArg) {
        return null;
    }

    public void voidLastTradeType(
            LastTradeType lttArg) {

    }

    public String stringString(
            String stringArgB) {
        return null;
    }

    public IntArrayObjectArrayResult intArrayObjectArray(
            ObjectArray objectArrayArg) {
        return null;
    }

    public Object qNameQName(
            Object qNameArg) {
        return null;
    }

    public BigDecimal bigDecimalBigDecimal(
            BigDecimal bigDecimalArg) {
        return null;
    }

    public XMLGregorianCalendar calendarDiablo(
            Diablo dabloArg) {
        return null;
    }

    public float floatFloat(
            float floatArgC) {
        return 0;
    }

    public StringArray stringArrayStringArray(
            StringArray stringArrayArg) {
        return null;
    }

    public int intDiablo(
            Diablo diabloArgA) {
        return 0;
    }

    public short shortChangeType(
            ChangeType ctArg) {
        return 0;
    }

    public short shortShort(
            short shortArg) {
        return 0;
    }
}
