Return-Path: X-Original-To: apmail-directory-commits-archive@www.apache.org Delivered-To: apmail-directory-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 41B9A10EE6 for ; Sun, 6 Oct 2013 04:26:33 +0000 (UTC) Received: (qmail 63518 invoked by uid 500); 6 Oct 2013 04:25:44 -0000 Delivered-To: apmail-directory-commits-archive@directory.apache.org Received: (qmail 63460 invoked by uid 500); 6 Oct 2013 04:25:36 -0000 Mailing-List: contact commits-help@directory.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@directory.apache.org Delivered-To: mailing list commits@directory.apache.org Received: (qmail 63444 invoked by uid 99); 6 Oct 2013 04:25:29 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 06 Oct 2013 04:25:29 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 06 Oct 2013 04:25:24 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 81566238890B; Sun, 6 Oct 2013 04:25:01 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1529564 - in /directory/escimo/branches/json-schema-experiment: common/ common/src/main/java/org/apache/directory/scim/ common/src/main/java/org/apache/directory/scim/schema/ ldap/src/main/java/org/apache/directory/scim/ldap/ ldap/src/main... Date: Sun, 06 Oct 2013 04:25:00 -0000 To: commits@directory.apache.org From: kayyagari@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20131006042501.81566238890B@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: kayyagari Date: Sun Oct 6 04:25:00 2013 New Revision: 1529564 URL: http://svn.apache.org/r1529564 Log: o added a class for holding json schema o added readOnly variable to the schema models o added dependency on gson in schema o renamed handle() to read() Added: directory/escimo/branches/json-schema-experiment/schema/src/main/java/org/apache/directory/scim/schema/JsonSchema.java Modified: directory/escimo/branches/json-schema-experiment/common/pom.xml directory/escimo/branches/json-schema-experiment/common/src/main/java/org/apache/directory/scim/AttributeHandler.java directory/escimo/branches/json-schema-experiment/common/src/main/java/org/apache/directory/scim/ProviderService.java directory/escimo/branches/json-schema-experiment/common/src/main/java/org/apache/directory/scim/schema/BaseType.java directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/LdapResourceProvider.java directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/LdapSchemaMapper.java directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/ActiveAttributeHandler.java directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/GroupsAttributeHandler.java directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/MembersAttributeHandler.java directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/MetaAttributeHandler.java directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/PhotosAttributeHandler.java directory/escimo/branches/json-schema-experiment/schema/pom.xml directory/escimo/branches/json-schema-experiment/schema/src/main/java/org/apache/directory/scim/schema/SchemaUtil.java directory/escimo/branches/json-schema-experiment/server/src/main/java/org/apache/directory/scim/rest/SchemaService.java directory/escimo/branches/json-schema-experiment/server/src/main/java/org/apache/directory/scim/rest/ServerInitializer.java Modified: directory/escimo/branches/json-schema-experiment/common/pom.xml URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/common/pom.xml?rev=1529564&r1=1529563&r2=1529564&view=diff ============================================================================== --- directory/escimo/branches/json-schema-experiment/common/pom.xml (original) +++ directory/escimo/branches/json-schema-experiment/common/pom.xml Sun Oct 6 04:25:00 2013 @@ -41,10 +41,6 @@ wink-server ${wink.version} - - com.google.code.gson - gson - Modified: directory/escimo/branches/json-schema-experiment/common/src/main/java/org/apache/directory/scim/AttributeHandler.java URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/common/src/main/java/org/apache/directory/scim/AttributeHandler.java?rev=1529564&r1=1529563&r2=1529564&view=diff ============================================================================== --- directory/escimo/branches/json-schema-experiment/common/src/main/java/org/apache/directory/scim/AttributeHandler.java (original) +++ directory/escimo/branches/json-schema-experiment/common/src/main/java/org/apache/directory/scim/AttributeHandler.java Sun Oct 6 04:25:00 2013 @@ -30,5 +30,5 @@ import org.apache.directory.scim.schema. */ public interface AttributeHandler { - void handle( BaseType bt, Object srcResource, RequestContext ctx ); + void read( BaseType bt, Object srcResource, RequestContext ctx ); } Modified: directory/escimo/branches/json-schema-experiment/common/src/main/java/org/apache/directory/scim/ProviderService.java URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/common/src/main/java/org/apache/directory/scim/ProviderService.java?rev=1529564&r1=1529563&r2=1529564&view=diff ============================================================================== --- directory/escimo/branches/json-schema-experiment/common/src/main/java/org/apache/directory/scim/ProviderService.java (original) +++ directory/escimo/branches/json-schema-experiment/common/src/main/java/org/apache/directory/scim/ProviderService.java Sun Oct 6 04:25:00 2013 @@ -20,6 +20,8 @@ package org.apache.directory.scim; import java.io.InputStream; +import org.apache.directory.scim.schema.JsonSchema; + /** * * @author Apache Directory Project @@ -35,4 +37,6 @@ public interface ProviderService InputStream getUserPhoto( String id, String atName ) throws MissingParameterException; Group getGroup( RequestContext ctx, String groupId ) throws ResourceNotFoundException; + + JsonSchema getSchema( String uriId ); } Modified: directory/escimo/branches/json-schema-experiment/common/src/main/java/org/apache/directory/scim/schema/BaseType.java URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/common/src/main/java/org/apache/directory/scim/schema/BaseType.java?rev=1529564&r1=1529563&r2=1529564&view=diff ============================================================================== --- directory/escimo/branches/json-schema-experiment/common/src/main/java/org/apache/directory/scim/schema/BaseType.java (original) +++ directory/escimo/branches/json-schema-experiment/common/src/main/java/org/apache/directory/scim/schema/BaseType.java Sun Oct 6 04:25:00 2013 @@ -38,6 +38,8 @@ public abstract class BaseType private String atHandlerName; + private boolean readOnly = false; + public BaseType( String uri, String name, boolean show ) { this.uri = uri; @@ -114,4 +116,22 @@ public abstract class BaseType return false; } + + /** + * @return the readOnly + */ + public boolean isReadOnly() + { + return readOnly; + } + + + /** + * @param readOnly the readOnly to set + */ + public void setReadOnly( boolean readOnly ) + { + this.readOnly = readOnly; + } + } Modified: directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/LdapResourceProvider.java URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/LdapResourceProvider.java?rev=1529564&r1=1529563&r2=1529564&view=diff ============================================================================== --- directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/LdapResourceProvider.java (original) +++ directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/LdapResourceProvider.java Sun Oct 6 04:25:00 2013 @@ -26,10 +26,13 @@ import static org.apache.directory.api.l import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import java.net.URL; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Properties; import org.apache.directory.api.ldap.model.constants.SchemaConstants; @@ -81,6 +84,8 @@ import org.apache.directory.scim.ldap.sc import org.apache.directory.scim.ldap.schema.TypedType; import org.apache.directory.scim.ldap.schema.UserSchema; import org.apache.directory.scim.schema.BaseType; +import org.apache.directory.scim.schema.JsonSchema; +import org.apache.directory.scim.schema.SchemaUtil; import org.apache.directory.scim.util.ResourceUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -107,6 +112,8 @@ public class LdapResourceProvider implem private SchemaManager ldapSchema; + private Map schemas = new HashMap(); + private static final Logger LOG = LoggerFactory.getLogger( LdapResourceProvider.class ); @@ -124,6 +131,27 @@ public class LdapResourceProvider implem public void init() throws Exception { LOG.info( "Initializing LDAP resource provider" ); + + try + { + JsonParser parser = new JsonParser(); + + List urls = SchemaUtil.getDefaultSchemas(); + for( URL u : urls ) + { + JsonSchema json = SchemaUtil.getSchemaJson( u ); + schemas.put( json.getId(), json ); + } + + // TODO load custom schemas + } + catch( Exception e ) + { + RuntimeException re = new RuntimeException( "Failed to load the default schemas" ); + re.initCause( e ); + throw re; + } + if ( connection == null ) { createConnection(); @@ -134,7 +162,8 @@ public class LdapResourceProvider implem ( ( LdapNetworkConnection ) connection ).loadSchema( new JarLdifSchemaLoader() ); } - schemaMapper = new LdapSchemaMapper(); + Map jsonSchemaCopy = new HashMap( schemas ); + schemaMapper = new LdapSchemaMapper( jsonSchemaCopy ); schemaMapper.loadMappings(); userSchema = schemaMapper.getUserSchema(); groupSchema = schemaMapper.getGroupSchema(); @@ -292,8 +321,13 @@ public class LdapResourceProvider implem } - private void processAttributeData( BaseType bt, JsonElement el, Entry entry ) throws LdapException + private void scimToLdapAttribute( BaseType bt, JsonElement el, Entry entry ) throws LdapException { + if( bt.isReadOnly() ) + { + return; + } + if( bt instanceof SimpleType ) { SimpleType st = ( SimpleType ) bt; @@ -448,7 +482,7 @@ public class LdapResourceProvider implem if ( atHandler != null ) { AttributeHandler handler = userSchema.getHandler( atHandler ); - handler.handle( ct, entry, ctx ); + handler.read( ct, entry, ctx ); continue; } @@ -474,7 +508,7 @@ public class LdapResourceProvider implem if ( atHandler != null ) { AttributeHandler handler = userSchema.getHandler( atHandler ); - handler.handle( bt, entry, ctx ); + handler.read( bt, entry, ctx ); continue; } @@ -586,7 +620,7 @@ public class LdapResourceProvider implem if ( atHandler != null ) { AttributeHandler handler = userSchema.getHandler( atHandler ); - handler.handle( st, entry, ctx ); + handler.read( st, entry, ctx ); return null; } else @@ -739,6 +773,11 @@ public class LdapResourceProvider implem return entry; } + + public JsonSchema getSchema( String uri ) + { + return schemas.get( uri ); + } public static void main( String[] args ) throws Exception { Modified: directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/LdapSchemaMapper.java URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/LdapSchemaMapper.java?rev=1529564&r1=1529563&r2=1529564&view=diff ============================================================================== --- directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/LdapSchemaMapper.java (original) +++ directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/LdapSchemaMapper.java Sun Oct 6 04:25:00 2013 @@ -43,12 +43,16 @@ import org.apache.directory.scim.ldap.sc import org.apache.directory.scim.ldap.schema.SimpleType; import org.apache.directory.scim.ldap.schema.SimpleTypeGroup; import org.apache.directory.scim.ldap.schema.UserSchema; +import org.apache.directory.scim.schema.JsonSchema; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + /** * TODO LdapSchemaMapper. @@ -65,9 +69,11 @@ public class LdapSchemaMapper implements private UserSchema userSchema; - - public LdapSchemaMapper() + private Map jsonSchemas; + + public LdapSchemaMapper( Map jsonSchemas ) { + this.jsonSchemas = jsonSchemas; } @@ -216,6 +222,8 @@ public class LdapSchemaMapper implements resourceSchema.addUri( uri ); + JsonSchema json = jsonSchemas.get( uri ); + List simpleAtElmList = schemaRoot.elements( "attribute" ); for ( Element el : simpleAtElmList ) @@ -223,6 +231,7 @@ public class LdapSchemaMapper implements SimpleType st = parseSimpleType( el, uri ); if ( st != null ) { + st.setReadOnly( json.isReadOnly( st.getName() ) ); resourceSchema.addAttributeType( st.getName(), st ); } } @@ -243,7 +252,7 @@ public class LdapSchemaMapper implements boolean show = getShowVal( elmComplex ); Element atGrpElm = elmComplex.element( "at-group" ); - SimpleTypeGroup stg = parseAtGroup( atGrpElm, uri ); + SimpleTypeGroup stg = parseAtGroup( atGrpElm, uri, name ); ComplexType ct = null; if ( stg != null ) { @@ -266,6 +275,7 @@ public class LdapSchemaMapper implements if( ct != null ) { ct.setAtHandlerName( handlerRef ); + ct.setReadOnly( json.isReadOnly( name ) ); resourceSchema.addAttributeType( name, ct ); } } @@ -288,15 +298,15 @@ public class LdapSchemaMapper implements boolean showMultiVal = getShowVal( elmMultiVal ); - MultiValType ct = null; + MultiValType mt = null; Element elmAtGroup = elmMultiVal.element( "at-group" ); if ( elmAtGroup != null ) { - SimpleTypeGroup stg = parseAtGroup( elmAtGroup, uri ); + SimpleTypeGroup stg = parseAtGroup( elmAtGroup, uri, name ); if ( stg != null ) { - ct = new MultiValType( uri, name, showMultiVal, stg, baseDn, filter ); + mt = new MultiValType( uri, name, showMultiVal, stg, baseDn, filter ); } } @@ -308,26 +318,29 @@ public class LdapSchemaMapper implements handlerRef = null; } - if( ( ct == null ) && ( handlerRef != null ) ) + if( ( mt == null ) && ( handlerRef != null ) ) { - ct = new MultiValType( uri, name, showMultiVal, ( SimpleTypeGroup ) null, baseDn, filter ); + mt = new MultiValType( uri, name, showMultiVal, ( SimpleTypeGroup ) null, baseDn, filter ); } - if( ct != null ) + if( mt != null ) { - ct.setAtHandlerName( handlerRef ); - resourceSchema.addAttributeType( name, ct ); + mt.setAtHandlerName( handlerRef ); + mt.setReadOnly( json.isReadOnly( name ) ); + resourceSchema.addAttributeType( name, mt ); } } } - private SimpleTypeGroup parseAtGroup( Element elmAtGroup, String uri ) + private SimpleTypeGroup parseAtGroup( Element elmAtGroup, String uri, String parentAtName ) { SimpleTypeGroup stg = null; List lstSTypes = null; - + + JsonSchema json = jsonSchemas.get( uri ); + if ( elmAtGroup != null ) { lstSTypes = new ArrayList(); @@ -338,6 +351,7 @@ public class LdapSchemaMapper implements SimpleType st = parseSimpleType( elmAt, uri ); if ( st != null ) { + st.setReadOnly( json.isReadOnly( parentAtName + "." + st.getName() ) ); lstSTypes.add( st ); } } Modified: directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/ActiveAttributeHandler.java URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/ActiveAttributeHandler.java?rev=1529564&r1=1529563&r2=1529564&view=diff ============================================================================== --- directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/ActiveAttributeHandler.java (original) +++ directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/ActiveAttributeHandler.java Sun Oct 6 04:25:00 2013 @@ -41,7 +41,7 @@ public class ActiveAttributeHandler impl private static final Logger LOG = LoggerFactory.getLogger( ActiveAttributeHandler.class ); @Override - public void handle( BaseType bt, Object srcResource, RequestContext ctx ) + public void read( BaseType bt, Object srcResource, RequestContext ctx ) { if( !bt.getName().equals( "active" ) ) { Modified: directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/GroupsAttributeHandler.java URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/GroupsAttributeHandler.java?rev=1529564&r1=1529563&r2=1529564&view=diff ============================================================================== --- directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/GroupsAttributeHandler.java (original) +++ directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/GroupsAttributeHandler.java Sun Oct 6 04:25:00 2013 @@ -63,7 +63,7 @@ public class GroupsAttributeHandler impl @Override - public void handle( BaseType bt, Object srcResource, RequestContext ctx ) + public void read( BaseType bt, Object srcResource, RequestContext ctx ) { if ( !bt.getName().equals( "groups" ) ) { Modified: directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/MembersAttributeHandler.java URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/MembersAttributeHandler.java?rev=1529564&r1=1529563&r2=1529564&view=diff ============================================================================== --- directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/MembersAttributeHandler.java (original) +++ directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/MembersAttributeHandler.java Sun Oct 6 04:25:00 2013 @@ -62,7 +62,7 @@ public class MembersAttributeHandler imp @Override - public void handle( BaseType bt, Object srcResource, RequestContext ctx ) + public void read( BaseType bt, Object srcResource, RequestContext ctx ) { if ( !bt.getName().equals( "members" ) ) { Modified: directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/MetaAttributeHandler.java URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/MetaAttributeHandler.java?rev=1529564&r1=1529563&r2=1529564&view=diff ============================================================================== --- directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/MetaAttributeHandler.java (original) +++ directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/MetaAttributeHandler.java Sun Oct 6 04:25:00 2013 @@ -48,7 +48,7 @@ public class MetaAttributeHandler implem private static final Logger LOG = LoggerFactory.getLogger( ActiveAttributeHandler.class ); @Override - public void handle( BaseType bt, Object srcResource, RequestContext ctx ) + public void read( BaseType bt, Object srcResource, RequestContext ctx ) { Entry entry = ( Entry ) srcResource; Modified: directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/PhotosAttributeHandler.java URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/PhotosAttributeHandler.java?rev=1529564&r1=1529563&r2=1529564&view=diff ============================================================================== --- directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/PhotosAttributeHandler.java (original) +++ directory/escimo/branches/json-schema-experiment/ldap/src/main/java/org/apache/directory/scim/ldap/handlers/PhotosAttributeHandler.java Sun Oct 6 04:25:00 2013 @@ -54,7 +54,7 @@ public class PhotosAttributeHandler impl @Override - public void handle( BaseType bt, Object srcResource, RequestContext ctx ) + public void read( BaseType bt, Object srcResource, RequestContext ctx ) { if ( !bt.getName().equals( "photos" ) ) { Modified: directory/escimo/branches/json-schema-experiment/schema/pom.xml URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/schema/pom.xml?rev=1529564&r1=1529563&r2=1529564&view=diff ============================================================================== --- directory/escimo/branches/json-schema-experiment/schema/pom.xml (original) +++ directory/escimo/branches/json-schema-experiment/schema/pom.xml Sun Oct 6 04:25:00 2013 @@ -9,6 +9,11 @@ escimo-schema eSCIMo Schema Resources + + + com.google.code.gson + gson + Added: directory/escimo/branches/json-schema-experiment/schema/src/main/java/org/apache/directory/scim/schema/JsonSchema.java URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/schema/src/main/java/org/apache/directory/scim/schema/JsonSchema.java?rev=1529564&view=auto ============================================================================== --- directory/escimo/branches/json-schema-experiment/schema/src/main/java/org/apache/directory/scim/schema/JsonSchema.java (added) +++ directory/escimo/branches/json-schema-experiment/schema/src/main/java/org/apache/directory/scim/schema/JsonSchema.java Sun Oct 6 04:25:00 2013 @@ -0,0 +1,220 @@ +/* + * 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.apache.directory.scim.schema; + + +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import org.apache.directory.scim.schema.SchemaUtil; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + + +/** + * TODO JsonSchema. + * + * @author Apache Directory Project + */ +public class JsonSchema +{ + private String rawJson; + + private String id; + + private String name; + + private String desc; + + private Map attributes; + + + private JsonSchema( String rawJson ) + { + this.rawJson = rawJson; + this.attributes = new HashMap(); + } + + + public static JsonSchema parse( String rawJson ) + { + JsonSchema schema = new JsonSchema( rawJson ); + schema._parse(); + + return schema; + } + + + private void _parse() + { + JsonParser parser = new JsonParser(); + JsonObject obj = ( JsonObject ) parser.parse( rawJson ); + + this.id = obj.get( "id" ).getAsString(); + this.name = obj.get( "name" ).getAsString(); + this.desc = obj.get( "description" ).getAsString(); + + _readAttributeDef( obj ); + } + + + private void _readAttributeDef( JsonObject obj ) + { + JsonArray atArray = null; + + String parentName = null; + + if ( obj.has( "attributes" ) ) + { + atArray = obj.get( "attributes" ).getAsJsonArray(); + } + else + { + atArray = obj.get( "subAttributes" ).getAsJsonArray(); + parentName = obj.get( "name" ).getAsString(); + } + + for ( JsonElement je : atArray ) + { + JsonObject attribute = ( JsonObject ) je; + String type = attribute.get( "type" ).getAsString(); + String name = attribute.get( "name" ).getAsString(); + + if ( parentName != null ) + { + name = parentName + "." + name; + } + + attributes.put( name, attribute ); + + if ( type.equals( "complex" ) ) + { + _readAttributeDef( attribute ); + } + } + } + + /** + * gives the schema definition of an attribute with the given name. + * JSON dot notation is also supported in the attribute's name. + * e.x emails.value will give the definition of 'value' sub-attribute + * of the 'emails' attribute + * + * @param name the name of the attribute, e.x 'userName', 'emails.value' etc. + * @return a JSON object containing the definition of attribute's schema + */ + public JsonObject getAttributeDef( String name ) + { + return attributes.get( name ); + } + + + /** + * tells if an attribute with the given name is read-only. + * + * JSON dot notation is also supported in the attribute's name. + * e.x emails.value will tell if 'value' sub-attribute of the + * 'emails' attribute is read-only + * + * + * @param name the name of the attribute, e.x 'userName', 'emails.value' etc. + * @return true if attribute is read-only, false when 'readOnly' value is not + * specified or is set to false + */ + public boolean isReadOnly( String name ) + { + JsonObject jo = getAttributeDef( name ); + + if( jo == null ) + { + if( name.equals( "meta" ) ) + { + return true; + } + + throw new IllegalArgumentException( "Unknown attribute name " + name ); + } + + JsonElement je = jo.get( "readOnly" ); + + if( je != null ) + { + return je.getAsBoolean(); + } + + return false; + } + + + /** + * @return the rawJson + */ + public String getRawJson() + { + return rawJson; + } + + + /** + * @return the id + */ + public String getId() + { + return id; + } + + + /** + * @return the name + */ + public String getName() + { + return name; + } + + + /** + * @return the desc + */ + public String getDesc() + { + return desc; + } + + + @Override + public String toString() + { + return "JsonSchema [id=" + id + ", name=" + name + ", desc=" + desc + "]"; + } + + + public static void main( String[] args ) throws Exception + { + URL url = SchemaUtil.getDefaultSchemas().get( 0 ); + JsonSchema json = SchemaUtil.getSchemaJson( url ); + System.out.println(json); + } + +} Modified: directory/escimo/branches/json-schema-experiment/schema/src/main/java/org/apache/directory/scim/schema/SchemaUtil.java URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/schema/src/main/java/org/apache/directory/scim/schema/SchemaUtil.java?rev=1529564&r1=1529563&r2=1529564&view=diff ============================================================================== --- directory/escimo/branches/json-schema-experiment/schema/src/main/java/org/apache/directory/scim/schema/SchemaUtil.java (original) +++ directory/escimo/branches/json-schema-experiment/schema/src/main/java/org/apache/directory/scim/schema/SchemaUtil.java Sun Oct 6 04:25:00 2013 @@ -52,7 +52,7 @@ public class SchemaUtil } - public static String getSchemaJson( URL url ) throws IOException + public static JsonSchema getSchemaJson( URL url ) throws IOException { BufferedReader br = null; try @@ -67,7 +67,7 @@ public class SchemaUtil sb.append( s ); } - return sb.toString(); + return JsonSchema.parse( sb.toString() ); } finally { Modified: directory/escimo/branches/json-schema-experiment/server/src/main/java/org/apache/directory/scim/rest/SchemaService.java URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/server/src/main/java/org/apache/directory/scim/rest/SchemaService.java?rev=1529564&r1=1529563&r2=1529564&view=diff ============================================================================== --- directory/escimo/branches/json-schema-experiment/server/src/main/java/org/apache/directory/scim/rest/SchemaService.java (original) +++ directory/escimo/branches/json-schema-experiment/server/src/main/java/org/apache/directory/scim/rest/SchemaService.java Sun Oct 6 04:25:00 2013 @@ -27,13 +27,10 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; -import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.UriInfo; -import org.apache.directory.scim.RequestContext; -import org.apache.directory.scim.ResourceNotFoundException; -import org.apache.directory.scim.User; -import org.apache.directory.scim.json.ResourceSerializer; +import org.apache.directory.scim.ProviderService; +import org.apache.directory.scim.schema.JsonSchema; /** * TODO SchemaService. @@ -44,6 +41,9 @@ import org.apache.directory.scim.json.Re public class SchemaService { + private ProviderService provider = ServerInitializer.getProvider(); + + @GET @Produces({MediaType.APPLICATION_JSON}) @Path("{uri}") @@ -51,11 +51,11 @@ public class SchemaService { ResponseBuilder rb = null; - String json = ServerInitializer.getSchema( schemaUri ); + JsonSchema jsonSchema = provider.getSchema( schemaUri ); - if( json != null ) + if( jsonSchema != null ) { - rb = Response.ok( json, MediaType.APPLICATION_JSON ); + rb = Response.ok( jsonSchema.getRawJson(), MediaType.APPLICATION_JSON ); } else { Modified: directory/escimo/branches/json-schema-experiment/server/src/main/java/org/apache/directory/scim/rest/ServerInitializer.java URL: http://svn.apache.org/viewvc/directory/escimo/branches/json-schema-experiment/server/src/main/java/org/apache/directory/scim/rest/ServerInitializer.java?rev=1529564&r1=1529563&r2=1529564&view=diff ============================================================================== --- directory/escimo/branches/json-schema-experiment/server/src/main/java/org/apache/directory/scim/rest/ServerInitializer.java (original) +++ directory/escimo/branches/json-schema-experiment/server/src/main/java/org/apache/directory/scim/rest/ServerInitializer.java Sun Oct 6 04:25:00 2013 @@ -40,8 +40,6 @@ public class ServerInitializer { private static ProviderService provider; - private static Map schemas = new HashMap(); - private static void init() { String fqcn = System.getProperty( "escimo.resource.provider", "org.apache.directory.scim.ldap.LdapResourceProvider" ); @@ -62,29 +60,6 @@ public class ServerInitializer throw re; } - try - { - JsonParser parser = new JsonParser(); - - List urls = SchemaUtil.getDefaultSchemas(); - for( URL u : urls ) - { - String json = SchemaUtil.getSchemaJson( u ); - JsonObject obj = ( JsonObject ) parser.parse( json ); - String uri = obj.get( "id" ).getAsString(); - - schemas.put( uri, json ); - } - - // TODO load custom schemas - } - catch( Exception e ) - { - RuntimeException re = new RuntimeException( "Failed to load the default schemas" ); - re.initCause( e ); - throw re; - } - } public static ProviderService getProvider() @@ -96,10 +71,4 @@ public class ServerInitializer return provider; } - - - public static String getSchema( String uri ) - { - return schemas.get( uri ); - } }