[ 
https://jira.nuxeo.com/browse/NXP-6301?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=89666#action_89666
 ] 

Wojciech Sulejman commented on NXP-6301:
----------------------------------------

Let me present how I understand this and maybe somebody correct me and get me 
back on the track.

1) Firstly, here is my schema definition:

 <xs:simpleType name="store"> 
  <xs:restriction base="xs:string"> 
   <xs:maxLength value="8192"/>
  </xs:restriction> 
 </xs:simpleType>

  <xs:include schemaLocation="core-types.xsd"/>
  <xs:element name="userid" type="xs:string"/>
  <xs:element name="certificate" type="xs:string"/>
  <xs:element name="keypassword" type="xs:string"/>
  <xs:element name="startdate" type="xs:date" />
  <xs:element name="enddate" type="xs:date" />
  <xs:element name="revocationdate" type="xs:date" />
  <xs:element name="keystore" type="cert:store"/>
</xs:schema>

where I defined a SimpleType store that is used to represent and store the 
keystore field values.


2)  The XSDLoader has a method (loadSchema) which in turn arranges for 
providing fields to the schema:
                Type ecmType = loadType(ecmSchema, el.getType());
                if (ecmType != null) {
                    // add the field to the schema
                    createField(ecmSchema, el, ecmType);

The ecmType is provided by the loadType-> loadSimpleType(schema, type) methods. 

3) A SimpleType (the ecmType above) object is supposed to provide the "string" 
type -> resolvable to the DB type:  "VARCHAR", plus the "restriction" to be 
used by the database for VARCHAR length.

There exists a SimpleType implementation (RestrictionSimpleTypeImpl) that has 
the "getFacet" method that provides access to the value stored in the 
xs:maxLength field.

CODE START====>
 private SimpleType loadSimpleType(Schema schema, XSType type)
            throws TypeBindingException {
        String name = type.getName();
        {...}

// HERE'S MY ADDED METHOD:
        // add constraints/restrictions to the simple type
        if (type instanceof RestrictionSimpleTypeImpl) {
            RestrictionSimpleTypeImpl restrictionType= 
(RestrictionSimpleTypeImpl)type;
            List<Constraint> constraints = new ArrayList<Constraint>();
            if(restrictionType.getFacet("maxLength")!=null){
                int MIN_LENGTH = 1;
                int 
MAX_LENGTH=Integer.parseInt(restrictionType.getFacet("maxLength").getValue().toString());
                Constraint stringLengthConstraint = new StringLengthConstraint(
                        MIN_LENGTH, MAX_LENGTH);
                constraints.add(stringLengthConstraint);
            }
            simpleType.setConstraints(constraints.toArray(new Constraint[0]));
        }
        return simpleType;
    }


<====CODEEND

You might notice here that I hard-coded the MIN_LENGTH value as I am not sure 
yet how to approach it. 


4) The SQLDirectory performs in its constructor SQL Mapping from our schema 
fields:

for (Field f : schema.getFields()) {
     {...}
     fieldSqlType = FieldMapper.getSqlField(f.getType().getName());


the Mapper is looking for one of the following: 

  if (name.equals("integer")) {
            return Types.INTEGER;
        } else if (name.equals("long")) {
            return Types.INTEGER;
        } else if (name.equals("string")) {
            return Types.VARCHAR;
        } else if (name.equals("date")) {
            return Types.TIMESTAMP;
        }

Otherwise an exception is thrown.

My field ("store") is not one of acceptable field names so the "warning" is 
logged:
                try {
                    fieldSqlType = 
FieldMapper.getSqlField(f.getType().getName());
                } catch (DirectoryException e) {
                    log.warn(String.format(
                            "Field %s of type %s in SQLDirectory %s is not 
supported and thus ignored",

As the field is ignored, no database column is created for my field.

Also: 

I saw that the default column length used in Nuxeo comes from the following 
class:   org.nuxeo.ecm.directory.sql.repository.Column
Here's the field:   private int length = 255; // Hibernate default
There is a public mutator: setLength(int length)  so I would think that that 
would be the path to consider.

====

Now, for my questions:
 
Am I on the right path in general? 
Looks ok to me. 

How do you recommend mapping my field name and its length to the FieldMapper?
I would probably make the FieldMapper directly return a Column (containing both 
data type and size) 


> length of field in schema should be configurable
> ------------------------------------------------
>
>                 Key: NXP-6301
>                 URL: https://jira.nuxeo.com/browse/NXP-6301
>             Project: Nuxeo Enterprise Platform
>          Issue Type: Improvement
>    Affects Versions: 5.4.0.1
>            Reporter: Alexandre Russel
>            Assignee: Wojciech Sulejman
>             Fix For: 5.4.1
>
>
> I should be able to do:
> <simpleType name="myString">
>  <restriction base="string">
>    <maxLength value="200"/>
>  </restriction>
> </simpleType>

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
https://jira.nuxeo.com/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        
_______________________________________________
ECM-tickets mailing list
ECM-tickets@lists.nuxeo.com
http://lists.nuxeo.com/mailman/listinfo/ecm-tickets

Reply via email to