/******************************************************************************* * Copyright (c) 2014 EclipseSource and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * EclipseSource - initial API and implementation ******************************************************************************/ package com.eclipsesource.tabris.tracking.internal.analytics.request; import static com.eclipsesource.tabris.internal.Clauses.when; import static com.eclipsesource.tabris.internal.Clauses.whenNull; import static com.eclipsesource.tabris.tracking.internal.analytics.request.RequestKeyProvider.getRequestKey; import static com.eclipsesource.tabris.tracking.internal.analytics.request.RequestKeys.APP_NAME; import static com.eclipsesource.tabris.tracking.internal.analytics.request.RequestKeys.CLIENT_ID; import static com.eclipsesource.tabris.tracking.internal.analytics.request.RequestValueProvider.getRequestValue; import static com.eclipsesource.tabris.tracking.internal.analytics.request.RequestValues.HIT_SCREENVIEW; import java.io.Serializable; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import com.eclipsesource.tabris.tracking.internal.Requestable; @SuppressWarnings("restriction") public class AnalyticsRequest implements Serializable { private final String appName; private final List<Requestable> requestables; private final String clientId; public AnalyticsRequest( String appName, String clientId, Requestable... requestables ) { validateArguments( appName, clientId ); this.appName = appName; this.clientId = clientId; this.requestables = Arrays.asList( requestables ); } private void validateArguments( String appName, String clientId ) { whenNull( appName ).throwIllegalArgument( "AppName must not be null." ); when( appName.isEmpty() ).throwIllegalArgument( "AppName must not be empty." ); whenNull( clientId ).throwIllegalArgument( "ClientId must not be null." ); when( clientId.isEmpty() ).throwIllegalArgument( "ClientId must not be empty." ); } public Map<String, Object> assemble() { Map<String, Object> parameter = createRequestableParameter(); addAppName( parameter ); checkAppNameSet( parameter ); parameter.put( getRequestKey( CLIENT_ID ), clientId ); return parameter; } private Map<String, Object> createRequestableParameter() { Map<String, Object> parameter = new HashMap<String, Object>(); for( Requestable requestable : requestables ) { parameter.putAll( requestable.getParameter() ); } return parameter; } private void addAppName( Map<String, Object> result ) { if( appName != null ) { result.put( getRequestKey( APP_NAME ), appName ); } } private void checkAppNameSet( Map<String, Object> hitRequestChunk ) { when( hitRequestChunk.containsValue( getRequestValue( HIT_SCREENVIEW ) ) && appName == null ) .throwIllegalState( "AppName must be set when assembling an ScreenViewHit request." ); } }