Hi devs,

Now the API spits error messages irrespective of the backend exception. It
sends the JSON error message even if there is an Nullpointer in our
backend. Writing a exception mapper for throwable did the trick.

Here is the schema I came up with for validating input. I derived it from
the sample inputs i have. Please review it. Pretty sure there is space for
improvements particularly min occurs.


<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema";>
    <xs:element name="partition">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="id" type="xs:string" minOccurs="1"
maxOccurs="1" nillable="false"/>
                <xs:element name="provider" type="xs:string" minOccurs="1"
maxOccurs="1" nillable="false"/>
                <xs:element name="property" minOccurs="1"
maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:all>
                            <xs:element name="name" type="xs:string"
minOccurs="1" maxOccurs="1" nillable="false"/>
                            <xs:element name="value" type="xs:string"
minOccurs="1" maxOccurs="1" nillable="false"/>
                        </xs:all>
                    </xs:complexType>
                </xs:element>
                <xs:element name="partitionMin" type="xs:int" minOccurs="1"
maxOccurs="1" nillable="false"/>
                <xs:element name="partitionMax" type="xs:int" minOccurs="1"
maxOccurs="1" nillable="false"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="autoscalePolicy">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="id" type="xs:string" minOccurs="1"
maxOccurs="1" nillable="false"/>
                <xs:element name="loadThresholds" minOccurs="1"
maxOccurs="1" nillable="false">
                    <xs:complexType>
                        <xs:all>
                            <xs:element name="requestsInFlight"
type="thresholdValues" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <xs:element name="memoryConsumption"
type="thresholdValues" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <xs:element name="loadAverage"
type="thresholdValues" minOccurs="1" maxOccurs="1" nillable="false"/>
                        </xs:all>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="deploymentPolicy">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="id" type="xs:string" maxOccurs="1"
minOccurs="1" nillable="false"/>
                <xs:element name="partitionGroup">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="id" type="xs:string"
maxOccurs="1" minOccurs="1" nillable="false"/>
                            <xs:element name="partitionAlgo" minOccurs="1"
maxOccurs="1" nillable="false">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:enumeration
value="round-robin"/>
                                        <xs:enumeration
value="one-after-another"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="partition" minOccurs="1"
maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:all>
                                        <xs:element name="id"
type="xs:string" maxOccurs="1" minOccurs="1" nillable="false"/>
                                        <xs:element name="partitionMax"
type="xs:int" minOccurs="1" maxOccurs="1" nillable="false"/>
                                        <xs:element name="partitionMin"
type="xs:int" minOccurs="1" maxOccurs="1" nillable="false"/>
                                    </xs:all>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="cartridgeDefinitionBean">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="type" type="xs:string" minOccurs="1"
maxOccurs="1" nillable="false"/>
                <xs:element name="provider" type="xs:string" minOccurs="1"
maxOccurs="1" nillable="false"/>
                <xs:element name="host" type="xs:string" minOccurs="1"
maxOccurs="1" nillable="false"/>
                <xs:element name="displayName" type="xs:string"
minOccurs="1" maxOccurs="1" nillable="false"/>
                <xs:element name="description" type="xs:string"
minOccurs="1" maxOccurs="1" nillable="false"/>
                <xs:element name="version" type="xs:float" minOccurs="1"
maxOccurs="1" nillable="false"/>
                <xs:element name="defaultAutoscalingPolicy"
type="xs:string" minOccurs="0" maxOccurs="1" nillable="false"/>
                <xs:element name="multiTenant" type="xs:boolean"
minOccurs="1" maxOccurs="1" nillable="false"/>
                <xs:element name="portMapping" minOccurs="1"
maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:all>
                            <xs:element name="protocol" type="xs:string"
maxOccurs="1" minOccurs="1" nillable="false"/>
                            <xs:element name="port" type="xs:int"
minOccurs="1" maxOccurs="1" nillable="false"/>
                            <xs:element name="proxyPort" type="xs:int"
minOccurs="1" maxOccurs="1" nillable="false"/>
                        </xs:all>
                    </xs:complexType>
                </xs:element>
                <xs:element name="iaasProvider" minOccurs="0"
maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="type" type="xs:string"
minOccurs="1" maxOccurs="1" nillable="false"/>
                            <xs:element name="imageId" type="xs:string"
minOccurs="1" maxOccurs="1" nillable="false"/>
                            <xs:element name="maxInstanceLimit"
type="xs:int" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <xs:element name="property" minOccurs="1"
maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:all>
                                        <xs:element name="name"
type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/>
                                        <xs:element name="value"
type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/>
                                    </xs:all>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="loadBalancer" minOccurs="0" maxOccurs="1"
nillable="true">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="type" type="xs:string"
minOccurs="1" maxOccurs="1" nillable="false"/>
                            <xs:element name="property" minOccurs="1"
maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:all>
                                        <xs:element name="name"
type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/>
                                        <xs:element name="value"
type="xs:string" minOccurs="1" maxOccurs="1" nillable="false"/>
                                    </xs:all>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="property" minOccurs="0"
maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:all>
                            <xs:element name="name" type="xs:string"
minOccurs="1" maxOccurs="1" nillable="false"/>
                            <xs:element name="value" type="xs:string"
minOccurs="1" maxOccurs="1" nillable="false"/>
                        </xs:all>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="thresholdValues">
        <xs:all>
            <xs:element name="average" type="xs:int" minOccurs="1"
maxOccurs="1"/>
            <xs:element name="gradient" type="xs:float" minOccurs="1"
maxOccurs="1"/>
            <xs:element name="secondDerivative" type="xs:float"
minOccurs="1" maxOccurs="1"/>
            <xs:element name="scaleDownMarginOfGradient" type="xs:float"
minOccurs="1" maxOccurs="1"/>
            <xs:element name="scaleDownMarginOfSecondDerivative"
type="xs:float" minOccurs="1" maxOccurs="1"/>
        </xs:all>
    </xs:complexType>
</xs:schema>

Reply via email to