Hi Pradeep, I have some concerns regarding the schema.
1. In partition deployment, do we really need to make it mandatory to include partitionMin and partitionMax? IMO, minOccurs should be 0 for these two properties since this can be overridden in the deployment definition 2. What is the need for having a sequence in properties definition? For eg - In cartridge definition if the user don't enter the values in the order that you have defined in the schema it won't validate. IMO, we should use <xs:choice> instead of <xs:sequence> when describing properties. Thanks. On Wed, Apr 23, 2014 at 4:22 PM, Pradeep Fernando <[email protected]> wrote: > 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> > > -- Akila Ravihansa Perera Software Engineer WSO2 Inc. http://wso2.com Phone: +94 77 64 154 38 Blog: http://ravihansa3000.blogspot.com
