/* * 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.usergrid.services; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.UUID; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.usergrid.persistence.EntityRef; import org.apache.usergrid.persistence.Query; import org.apache.usergrid.persistence.Schema; import org.apache.usergrid.services.ServiceParameter.IdParameter; import org.apache.usergrid.services.ServiceParameter.NameParameter; import org.apache.usergrid.services.ServiceParameter.QueryParameter; import org.apache.usergrid.services.exceptions.ServiceInvocationException; import static org.apache.usergrid.services.ServiceParameter.filter; import static org.apache.usergrid.services.ServiceParameter.mergeQueries; import static org.apache.usergrid.utils.InflectionUtils.pluralize; import static org.apache.usergrid.utils.ListUtils.dequeueCopy; import static org.apache.usergrid.utils.ListUtils.isEmpty; public class AbstractPathBasedCollectionService extends AbstractCollectionService { private static final Logger logger = LoggerFactory.getLogger( AbstractPathBasedCollectionService.class ); public AbstractPathBasedCollectionService() { super(); } @Override 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" ); } }