/*
* 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.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.apache.usergrid.utils.JsonUtils;
import org.apache.commons.collections.iterators.EmptyIterator;
import org.apache.commons.collections.iterators.SingletonListIterator;
import static org.apache.usergrid.utils.JsonUtils.normalizeJsonTree;
public class ServicePayload {
private final Map<String, Object> properties;
private final List<Map<String, Object>> batch;
private final List<UUID> list;
public ServicePayload() {
properties = new LinkedHashMap<String, Object>();
batch = null;
list = null;
}
private ServicePayload( Map<String, Object> properties, List<Map<String, Object>> batch, List<UUID> list ) {
this.properties = properties;
this.batch = batch;
this.list = list;
}
public static ServicePayload payload( Map<String, Object> properties ) {
return new ServicePayload( properties, null, null );
}
public static ServicePayload batchPayload( List<Map<String, Object>> batch ) {
return new ServicePayload( null, batch, null );
}
public static ServicePayload idListPayload( List<UUID> list ) {
return new ServicePayload( null, null, list );
}
@SuppressWarnings("unchecked")
public static ServicePayload jsonPayload( Object json ) {
ServicePayload payload = null;
json = normalizeJsonTree( json );
if ( json instanceof Map ) {
Map<String, Object> jsonMap = ( Map<String, Object> ) json;
payload = payload( jsonMap );
}
else if ( json instanceof List ) {
List<?> jsonList = ( List<?> ) json;
if ( jsonList.size() > 0 ) {
if ( jsonList.get( 0 ) instanceof UUID ) {
payload = idListPayload( ( List<UUID> ) json );
}
else if ( jsonList.get( 0 ) instanceof Map ) {
payload = ServicePayload.batchPayload( ( List<Map<String, Object>> ) jsonList );
}
}
}
return payload;
}
public static ServicePayload stringPayload( String str ) {
return jsonPayload( JsonUtils.parse( str ) );
}
public boolean isBatch() {
return batch != null;
}
public boolean isList() {
return list != null;
}
public Map<String, Object> getProperties() {
if ( properties != null ) {
return properties;
}
if ( ( batch != null ) && ( batch.size() > 0 ) ) {
return batch.get( 0 );
}
return null;
}
public Object getProperty( String property ) {
Map<String, Object> p = getProperties();
if ( p == null ) {
return null;
}
return p.get( property );
}
public void setProperty( String property, Object value ) {
Map<String, Object> p = getProperties();
if ( p == null ) {
throw new NullPointerException( "No payload exists, cannot add properties to it" );
}
p.put( property, value );
}
public String getStringProperty( String property ) {
Object obj = getProperty( property );
if ( obj instanceof String ) {
return ( String ) obj;
}
return null;
}
public Long getLongProperty( String property ) {
Object obj = getProperty( property );
if ( obj instanceof Long ) {
return ( Long ) obj;
}
return null;
}
public List<Map<String, Object>> getBatchProperties() {
if ( batch != null ) {
return batch;
}
if ( properties != null ) {
List<Map<String, Object>> l = new ArrayList<Map<String, Object>>( 1 );
l.add( properties );
return l;
}
return null;
}
public List<UUID> getIdList() {
return list;
}
@Override
public String toString() {
if ( batch != null ) {
return JsonUtils.mapToJsonString( batch );
}
else if ( list != null ) {
return JsonUtils.mapToJsonString( list );
}
return JsonUtils.mapToJsonString( properties );
}
@SuppressWarnings("unchecked")
public Iterator<Map<String, Object>> payloadIterator() {
if ( isBatch() ) {
return batch.iterator();
}
if ( properties != null ) {
return new SingletonListIterator( properties );
}
return EmptyIterator.INSTANCE;
}
}