[ 
https://issues.apache.org/jira/browse/OPENJPA-1851?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12924743#action_12924743
 ] 

Pinaki Poddar commented on OPENJPA-1851:
----------------------------------------

The proposed XML schema for Java instances serialized on-the-wire

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- 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. -->
<!-- ========================================================================= 
-->
<!-- Schema for serialized persistence instance.                                
                                                          -->
<!-- ========================================================================= 
-->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema";
        attributeFormDefault="unqualified" elementFormDefault="qualified"
        version="1.0">

        <xsd:annotation>
                <xsd:documentation><![CDATA[
         Describes closure of managed persistence instance.
         Each instance is described by all its loaded persistent attribute.
         The related instances are resolved within the document root.
         Document root represents zero or more instances. 
          
         The file must be named "META-INF/jest-instance.xsd".
         ]]>
                </xsd:documentation>
        </xsd:annotation>

    <!-- The root element of the document contains zero or more instances -->
        <xsd:element name="instances">
                <xsd:complexType>
                        <xsd:sequence>
                                <xsd:element name="instance" 
maxOccurs="unbounded" type="instance-type" />
                        </xsd:sequence>
                        <xsd:attribute name="version" type="xsd:string" />
                </xsd:complexType>
        </xsd:element>

        <!-- The root element for a single instance -->
        <xsd:complexType name="instance-type">
                <xsd:sequence>
                        <xsd:element name="basic"          
type="basic-attr-type"       minOccurs="0" maxOccurs="unbounded" />
                        <xsd:element name="lob"               
type="lob-attr-type"           minOccurs="0" maxOccurs="unbounded"/>
                        <xsd:element name="embedded" type="instance-type"       
  minOccurs="0" maxOccurs="unbounded" />
                        <xsd:element name="singular"      
type="singular-attr-type"     minOccurs="0" maxOccurs="unbounded" />
                        <xsd:element name="collection"   
type="collection-attr-type"    minOccurs="0" maxOccurs="unbounded" />
                        <xsd:element name="map"            type="map-attr-type" 
         minOccurs="0" maxOccurs="unbounded" />
                </xsd:sequence>
                <xsd:attribute name="id" type="xsd:ID" use="required" />
        </xsd:complexType>

        <!-- A reference to another instance within the same(?) document -->
        <xsd:complexType name="ref-type">
                <xsd:attribute name="id" type="xsd:IDREF" />
        </xsd:complexType>
        
        <!-- A null reference                                            -->
        <xsd:complexType name="ref-null">
        </xsd:complexType>

        <!-- Basic Attribute has a name and its runtime type   -->
        <!-- non-null value appears as text content.           -->
        <!-- null value appears as attribute with empty text . -->
        <xsd:complexType name="basic-attr-type">
                <xsd:simpleContent>
                        <xsd:extension base="xsd:string">
                                <xsd:attribute name="name" type="xsd:string" 
use="required" />
                                <xsd:attribute name="type"   type="xsd:string" 
use="required" />
                                <xsd:attribute name="null"    
type="xsd:boolean" />
                        </xsd:extension>
                </xsd:simpleContent>
        </xsd:complexType>
        
        <!-- Large Binary Objects (LOB) represented as hex array -->
        <xsd:complexType name="lob-attr-type">
                <xsd:simpleContent>
                        <xsd:extension base="xsd:hexBinary">
                                <xsd:attribute name="name" type="xsd:string" 
use="required" />
                                <xsd:attribute name="type"    type="xsd:string" 
use="required" />
                                <xsd:attribute name="null"      
type="xsd:boolean" />
                        </xsd:extension>
                </xsd:simpleContent>
        </xsd:complexType>

        <!-- Singular attribute can be a reference or another instance. -->
        <xsd:complexType name="singular-attr-type">
                <xsd:choice>
                        <xsd:element name="null" type="ref-null" />
                        <xsd:element name="ref"  type="ref-type" />
                        <xsd:element name="instance" type="instance-type" />
                </xsd:choice>
                <xsd:attribute name="name" type="xsd:string" use="required" />
                <xsd:attribute name="type"    type="xsd:string" use="required" 
/>
        </xsd:complexType>

        <!-- Collection attributes list their members with their runtime type 
-->
        <!-- Members can be basic or other managed instance                   
-->
        <xsd:complexType name="collection-attr-type">
                <xsd:sequence>
                        <xsd:element name="member" type="member-type" 
minOccurs="0"
                                maxOccurs="unbounded" />
                </xsd:sequence>
                <xsd:attribute name="name" type="xsd:string" use="required" />
                <xsd:attribute name="type"    type="xsd:string" use="required" 
/>
                <xsd:attribute name="member-type" type="xsd:string" 
use="required" />
        </xsd:complexType>

        <!-- Map attributes list their entries with runtime type of key and 
value    -->
        <!-- Both key and value can be independently basic or other managed 
instance -->
        <xsd:complexType name="map-attr-type">
                <xsd:sequence>
                        <xsd:element name="entry" type="entry-type" />
                </xsd:sequence>
                <xsd:attribute name="name" type="xsd:string" use="required" />
                <xsd:attribute name="type" type="xsd:string" use="required" />
                <xsd:attribute name="key-type" type="xsd:string" use="required" 
/>
                <xsd:attribute name="value-type" type="xsd:string" 
use="required" />
        </xsd:complexType>

        <!-- Value of a member of basic type. -->
        <xsd:complexType name="basic-value-type">
                <xsd:simpleContent>
                        <xsd:extension base="xsd:string">
                                <xsd:attribute name="null" type="xsd:boolean" />
                        </xsd:extension>
                </xsd:simpleContent>
        </xsd:complexType>

        <!-- Value of a member of a collection/map -->
        <xsd:complexType name="member-type">
                <xsd:choice>
                        <xsd:element name="basic" type="basic-value-type" />
                        <xsd:element name="instance" type="instance-type" />
                        <xsd:element name="null" type="ref-null" />
                        <xsd:element name="ref" type="ref-type" />
                </xsd:choice>
        </xsd:complexType>

        <!-- Denotes entry of a map element -->
        <xsd:complexType name="entry-type">
                <xsd:sequence>
                        <xsd:element name="key"   type="member-type" 
minOccurs="1" maxOccurs="1" />
                        <xsd:element name="value" type="member-type" 
minOccurs="1" maxOccurs="1"  />
                </xsd:sequence>
        </xsd:complexType>
        
</xsd:schema>

and here is a typical example of a Person with a singular reference to another 
Person (spouse) and multi-valued relation to Persons (friends)


<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<instances xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; version="1.0" 
xsi:noNamespaceSchemaLocation="jest-instance.xsd">
  <instance id="Person-1288026511796">
    <basic name="ssn" type="long">1288026511796</basic>
    <basic name="age" type="int">20</basic>
    <basic name="name" type="String">P1</basic>
    <singular name="spouse" type="Person">
      <instance id="Person-1288026511797">
        <basic name="ssn" type="long">1288026511797</basic>
        <basic name="age" type="int">20</basic>
        <basic name="name" type="String">P2</basic>
        <singular name="spouse" type="Person">
          <ref id="Person-1288026511796"/>
        </singular>
        <collection member-type="Person" name="friends" type="List">
          <member>
            <ref id="Person-1288026511796"/>
          </member>
        </collection>
      </instance>
    </singular>
    <collection member-type="Person" name="friends" type="List">
      <member>
        <ref id="Person-1288026511797"/>
      </member>
      <member>
        <instance id="Person-1288026511798">
          <basic name="ssn" type="long">1288026511798</basic>
          <basic name="age" type="int">20</basic>
          <basic name="name" type="String">P3</basic>
          <singular name="spouse" type="Person">
            <null/>
          </singular>
          <collection member-type="Person" name="friends" type="List">
            <member>
              <ref id="Person-1288026511798"/>
            </member>
          </collection>
        </instance>
      </member>
    </collection>
  </instance>
</instances>

1. The object references are of the format <type>-<ior>
    where <type> is the simple name of the type and ior is a string 
representation of its primary key (we need a syntax for complex identity)
2. The type names are simple name (if unambiguous in the given persistence unit)

> RESTful access to Persistence Unit runtime 
> -------------------------------------------
>
>                 Key: OPENJPA-1851
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-1851
>             Project: OpenJPA
>          Issue Type: New Feature
>          Components: competitive, jpa, usability
>            Reporter: Pinaki Poddar
>            Assignee: Pinaki Poddar
>
> A persistence unit should provide access to a remote, non-Java client in a 
> RESTful fashion.
> The communication protocol should be HTTP.
> The 'safe' operations (HTTP GET for find, query, properties, metamodel 
> browsing etc) can be encoded in URI syntax itself. 
> The state representation would start with schema-less  XML, followed by 
> schema-compliant XML and JSON
> The POST/PUT operations and transactions will be addressed in a separate task.
>  

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to