public ServiceContext getContext()

in stack/services/src/main/java/org/apache/usergrid/services/AbstractPathBasedCollectionService.java [52:152]


    public ServiceContext getContext( ServiceAction action, ServiceRequest request, ServiceResults previousResults,
                                      ServicePayload payload ) throws Exception {

        EntityRef owner = request.getOwner();
        String collectionName = "application".equals( owner.getType() ) ? pluralize( getServiceInfo().getItemType() ) :
                                getServiceInfo().getCollectionName();

        EntityRef pathEntity = null;
        List<ServiceParameter> parameters = filter( request.getParameters(), replaceParameters );
        ServiceParameter first_parameter = null;
        if ( !isEmpty( parameters ) ) {
            first_parameter = parameters.get( 0 );

            if ( first_parameter instanceof NameParameter ) {

                if ( hasServiceMetadata( first_parameter.getName() ) ) {
                    return new ServiceContext( this, action, request, previousResults, owner, collectionName,
                            parameters, payload ).withServiceMetadata( first_parameter.getName() );
                }
                else if ( hasServiceCommand( first_parameter.getName() ) ) {
                    return new ServiceContext( this, action, request, previousResults, owner, collectionName,
                            parameters, payload ).withServiceCommand( first_parameter.getName() );
                }

                List<String> aliases = new ArrayList<String>();
                String alias = "";
                String slash = "";
                for ( ServiceParameter parameter : parameters ) {
                    if ( parameter instanceof NameParameter ) {
                        String name = parameter.getName();
                        if ( ( entityDictionaries != null ) && ( entityDictionaries
                                .contains( new EntityDictionaryEntry( name ) ) ) ) {
                            break;
                        }
                        if ( Schema.getDefaultSchema().hasCollection( getServiceInfo().getItemType(), name ) ) {
                            break;
                        }
                        alias += slash + name;
                        aliases.add( alias );
                        slash = "/";
                    }
                    else {
                        break;
                    }
                }
                if ( !isEmpty( aliases ) ) {
                    if (logger.isTraceEnabled()) {
                        logger.trace("Found {} potential paths", aliases.size());
                    }
                    Map<String, EntityRef> aliasedEntities = em.getAlias( getEntityType(), aliases );
                    for ( int i = aliases.size() - 1; i >= 0; i-- ) {
                        alias = aliases.get( i );
                        pathEntity = aliasedEntities.get( alias );
                        if ( pathEntity != null ) {
                            if (logger.isTraceEnabled()) {
                                logger.trace("Found entity {} of type {} for alias {}",
                                        pathEntity.getUuid(), pathEntity.getType(), alias);
                            }
                            parameters = parameters.subList( i + 1, parameters.size() );
                            first_parameter = new IdParameter( pathEntity.getUuid() );
                            // if (!isEmpty(parameters)) {
                            // first_parameter = parameters.get(0);
                            // }
                            break;
                        }
                    }
                }
            }

            if ( pathEntity == null ) {
                parameters = dequeueCopy( parameters );
            }
        }

        Query query = null;
        if ( first_parameter instanceof QueryParameter ) {
            query = first_parameter.getQuery();
        }
        parameters = mergeQueries( query, parameters );

        if ( first_parameter instanceof IdParameter ) {
            UUID id = first_parameter.getId();
            return new ServiceContext( this, action, request, previousResults, owner, collectionName,
                    Query.fromUUID( id ), parameters, payload );
        }
        else if ( first_parameter instanceof NameParameter ) {
            String name = first_parameter.getName();
            return new ServiceContext( this, action, request, previousResults, owner, collectionName,
                    Query.fromIdentifier( name ), parameters, payload );
        }
        else if ( query != null ) {
            return new ServiceContext( this, action, request, previousResults, owner, collectionName, query, parameters,
                    payload );
        }
        else if ( first_parameter == null ) {
            return new ServiceContext( this, action, request, previousResults, owner, collectionName, null, null,
                    payload );
        }

        throw new ServiceInvocationException( request, "No parameter found" );
    }