/*
* 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.Map.Entry;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.usergrid.persistence.Query;
import org.apache.usergrid.persistence.index.query.Identifier;
import static org.apache.commons.lang.StringUtils.isNotBlank;
import static org.apache.usergrid.utils.ListUtils.dequeue;
import static org.apache.usergrid.utils.ListUtils.dequeueCopy;
import static org.apache.usergrid.utils.ListUtils.isEmpty;
import static org.apache.usergrid.utils.ListUtils.queue;
public abstract class ServiceParameter {
private static final Logger logger = LoggerFactory.getLogger( ServiceParameter.class );
ServiceParameter() {
}
public UUID getId() {
return null;
}
public String getName() {
return null;
}
public Query getQuery() {
return null;
}
@Override
public String toString() {
return "";
}
public boolean isQuery() {
return false;
}
public boolean isId() {
return false;
}
public boolean isName() {
return false;
}
public abstract Identifier getIdentifier();
public static List<ServiceParameter> addParameter( List<ServiceParameter> parameters, UUID entityId ) {
if ( parameters == null ) {
parameters = new ArrayList<ServiceParameter>();
}
if ( entityId == null ) {
return parameters;
}
ServiceParameter p = new IdParameter( entityId );
parameters.add( p );
return parameters;
}
public static List<ServiceParameter> addParameter( List<ServiceParameter> parameters, String name ) {
if ( parameters == null ) {
parameters = new ArrayList<ServiceParameter>();
}
if ( name == null ) {
return parameters;
}
if ( "all".equals( name ) ) {
Query query = new Query();
ServiceParameter p = new QueryParameter( query );
parameters.add( p );
return parameters;
}
ServiceParameter p = new NameParameter( name );
parameters.add( p );
return parameters;
}
public static List<ServiceParameter> addParameter( List<ServiceParameter> parameters, Query query ) {
if ( parameters == null ) {
parameters = new ArrayList<>();
}
if ( query == null ) {
return parameters;
}
if ( lastParameterIsQuery( parameters ) ) {
logger.info( "Adding two queries in a row" );
}
ServiceParameter p = new QueryParameter( query );
parameters.add( p );
return parameters;
}
public static List<ServiceParameter> addParameters( List<ServiceParameter> parameters, Object... params )
throws Exception {
if ( parameters == null ) {
parameters = new ArrayList<>();
}
if ( params == null ) {
return parameters;
}
for ( Object param : params ) {
if ( param instanceof UUID ) {
addParameter( parameters, ( UUID ) param );
}
else if ( param instanceof String ) {
addParameter( parameters, ( String ) param );
}
else if ( param instanceof Query ) {
addParameter( parameters, ( Query ) param );
}
}
return parameters;
}
public static List<ServiceParameter> parameters( Object... params ) throws Exception {
return addParameters( null, params );
}
public static boolean firstParameterIsName( List<ServiceParameter> parameters ) {
return !isEmpty(parameters) && parameters.get( 0 ).isName();
}
public static boolean lastParameterIsName( List<ServiceParameter> parameters ) {
return !isEmpty(parameters) && parameters.get( parameters.size() - 1 ).isName();
}
public static boolean firstParameterIsQuery( List<ServiceParameter> parameters ) {
return !isEmpty(parameters) && parameters.get( 0 ).isQuery();
}
public static boolean lastParameterIsQuery( List<ServiceParameter> parameters ) {
return !isEmpty(parameters) && parameters.get( parameters.size() - 1 ).isQuery();
}
public static boolean firstParameterIsId( List<ServiceParameter> parameters ) {
return !isEmpty(parameters) && parameters.get(0).isId();
}
public static boolean lastParameterIsId( List<ServiceParameter> parameters ) {
return !isEmpty(parameters) && parameters.get( parameters.size() - 1 ).isId();
}
public static ServiceParameter firstParameter( List<ServiceParameter> parameters ) {
return !isEmpty(parameters) ? parameters.get(0) : null;
}
public static boolean moreParameters( List<ServiceParameter> parameters ) {
return moreParameters( parameters, true );
}
public static boolean moreParameters( List<ServiceParameter> parameters, boolean ignoreTrailingQueries ) {
if ( isEmpty( parameters ) ) {
return false;
}
if ( ignoreTrailingQueries ) {
for ( ServiceParameter parameter : parameters ) {
if ( !( parameter instanceof QueryParameter ) ) {
return true;
}
}
return false;
}
return true;
}
public static int parameterCount( List<ServiceParameter> parameters ) {
return parameterCount( parameters, false );
}
public static int parameterCount( List<ServiceParameter> parameters, boolean ignoreTrailingQueries ) {
if ( isEmpty( parameters ) ) {
return 0;
}
int count = parameters.size();
if ( ignoreTrailingQueries ) {
count = 0;
for ( ServiceParameter parameter : parameters ) {
if ( !( parameter instanceof QueryParameter ) ) {
count++;
}
else {
return count;
}
}
}
return count;
}
public static ServiceParameter dequeueParameter( List<ServiceParameter> parameters ) {
return dequeue( parameters );
}
public static void queueParameter( List<ServiceParameter> parameters, ServiceParameter parameter ) {
parameters = queue( parameters, parameter );
}
public static List<ServiceParameter> mergeQueries( Query query, List<ServiceParameter> parameters ) {
while ( firstParameterIsQuery( parameters ) ) {
parameters = dequeueCopy( parameters );
}
return parameters;
}
public static List<ServiceParameter> filter( List<ServiceParameter> parameters,
Map<List<String>, List<String>> replaceParameters ) {
if ( replaceParameters == null ) {
return parameters;
}
if ( ( parameters == null ) || ( parameters.size() == 0 ) ) {
return parameters;
}
for ( Entry<List<String>, List<String>> replaceSet : replaceParameters.entrySet() ) {
if ( parameters.size() < replaceSet.getKey().size() ) {
continue;
}
boolean found = true;
for ( int i = 0; i < replaceSet.getKey().size(); i++ ) {
String matchStr = replaceSet.getKey().get( i );
ServiceParameter param = parameters.get( i );
if ( matchStr.equals( "$id" ) && ( ( param instanceof IdParameter )
|| ( param instanceof NameParameter ) ) ) {
continue;
}
else if ( matchStr.equals( "$query" ) && ( param instanceof QueryParameter ) ) {
continue;
}
else if ( matchStr.equalsIgnoreCase( param.getName() ) ) {
continue;
}
found = false;
break;
}
if ( !found ) {
continue;
}
ArrayList<ServiceParameter> p = new ArrayList<>();
for ( String name : replaceSet.getValue() ) {
if ( name.startsWith( "\\" ) ) {
int i = Integer.parseInt( name.substring( 1 ) );
p.add( parameters.get( i ) );
}
else {
p.add( new NameParameter( name ) );
}
}
p.addAll( parameters.subList( replaceSet.getKey().size(), parameters.size() ) );
return p;
}
return parameters;
}
public static class IdParameter extends ServiceParameter {
UUID entityId;
public IdParameter( UUID entityId ) {
this.entityId = entityId;
}
@Override
public UUID getId() {
return entityId;
}
@Override
public boolean isId() {
return true;
}
@Override
public String toString() {
return entityId.toString();
}
@Override
public Identifier getIdentifier() {
return Identifier.from( entityId );
}
}
public static class NameParameter extends ServiceParameter {
String name;
public NameParameter( String name ) {
name = name.trim().toLowerCase();
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public boolean isName() {
return true;
}
@Override
public String toString() {
return name;
}
@Override
public Identifier getIdentifier() {
return Identifier.from( name );
}
}
public static class QueryParameter extends ServiceParameter {
Query query;
public QueryParameter( Query query ) {
this.query = query;
}
@Override
public Query getQuery() {
return query;
}
@Override
public boolean isQuery() {
return true;
}
@Override
public String toString() {
String queryStr = query.toString();
if ( isNotBlank( queryStr ) ) {
return queryStr;
}
return "";
}
@Override
public Identifier getIdentifier() {
return null;
}
}
}