Skip to content

Commit dd40926

Browse files
committed
Resolve matomo-org#8
1 parent 5fea54d commit dd40926

3 files changed

Lines changed: 122 additions & 7 deletions

File tree

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<groupId>org.piwik.java.tracking</groupId>
66
<artifactId>piwik-java-tracker</artifactId>
7-
<version>1.0.1-SNAPSHOT</version>
7+
<version>1.1-SNAPSHOT</version>
88
<packaging>jar</packaging>
99

1010
<name>Piwik Java Tracker</name>

src/main/java/org/piwik/java/tracking/PiwikRequest.java

Lines changed: 85 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@
1010
import java.net.URL;
1111
import java.net.URLEncoder;
1212
import java.nio.charset.Charset;
13+
import java.util.ArrayList;
1314
import java.util.Date;
1415
import java.util.HashMap;
16+
import java.util.List;
1517
import java.util.Map;
18+
import java.util.Map.Entry;
1619
import java.util.Random;
1720
import javax.json.JsonValue;
1821
import javax.xml.bind.DatatypeConverter;
@@ -99,6 +102,7 @@ public class PiwikRequest{
99102
private static final long REQUEST_DATETIME_AUTH_LIMIT = 14400000L;
100103

101104
private final Map<String, Object> parameters = new HashMap<>();
105+
private final Map<String, List> customTrackingParameters = new HashMap<>();
102106

103107
/**
104108
* Create a new request from the id of the site being tracked and the full
@@ -396,6 +400,51 @@ public Integer getCurrentSecond(){
396400
public void setCurrentSecond(Integer currentSecond){
397401
setParameter(CURRENT_SECOND, currentSecond);
398402
}
403+
404+
/**
405+
* Set a custom tracking parameter whose toString() value will be sent to
406+
* the Piwik server. These parameters are stored separately from named Piwik
407+
* parameters, meaning it is not possible to overwrite or clear named Piwik
408+
* parameters with this method. A custom parameter that has the same name
409+
* as a set named Piwik parameter will be sent in addition to the named parameter.
410+
* @param key the parameter's key
411+
* @param value the parameter's value. Removes the parameter if null
412+
*/
413+
public void setCustomTrackingParameter(String key, Object value){
414+
if (value == null){
415+
customTrackingParameters.remove(key);
416+
}
417+
else{
418+
List l = new ArrayList<>();
419+
l.add(value);
420+
customTrackingParameters.put(key, l);
421+
}
422+
}
423+
424+
/**
425+
* Add a custom tracking parameter to the specified key. This allows users
426+
* to have multiple parameters with the same name and different values,
427+
* commonly used during situations where list parameters are needed
428+
* @param key the parameter's key
429+
* @param value the parameter's value. Cannot be null
430+
*/
431+
public void addCustomTrackingParameter(String key, Object value){
432+
if (value == null){
433+
throw new NullPointerException("Cannot add a null custom tracking parameter.");
434+
}
435+
else{
436+
List l = customTrackingParameters.getOrDefault(key, new ArrayList<>());
437+
l.add(value);
438+
customTrackingParameters.put(key, l);
439+
}
440+
}
441+
442+
/**
443+
* Removes all custom tracking parameters
444+
*/
445+
public void clearCustomTrackingParameter(){
446+
customTrackingParameters.clear();
447+
}
399448

400449
/**
401450
* Get the resolution of the device
@@ -1441,14 +1490,24 @@ public void setVisitorVisitCount(Integer visitorVisitCount){
14411490

14421491
public String getQueryString(){
14431492
StringBuilder sb = new StringBuilder();
1444-
for (Map.Entry<String, Object> parameter : parameters.entrySet()){
1493+
for (Entry<String, Object> parameter : parameters.entrySet()){
14451494
if (sb.length() > 0){
14461495
sb.append("&");
14471496
}
14481497
sb.append(parameter.getKey());
14491498
sb.append("=");
14501499
sb.append(parameter.getValue().toString());
14511500
}
1501+
for (Entry<String, List> customTrackingParameter : customTrackingParameters.entrySet()){
1502+
for (Object o : customTrackingParameter.getValue()){
1503+
if (sb.length() > 0){
1504+
sb.append("&");
1505+
}
1506+
sb.append(customTrackingParameter.getKey());
1507+
sb.append("=");
1508+
sb.append(o.toString());
1509+
}
1510+
}
14521511

14531512
return sb.toString();
14541513
}
@@ -1459,18 +1518,38 @@ public String getQueryString(){
14591518
*/
14601519
public String getUrlEncodedQueryString(){
14611520
StringBuilder sb = new StringBuilder();
1462-
for (Map.Entry<String, Object> parameter : parameters.entrySet()){
1521+
for (Entry<String, Object> parameter : parameters.entrySet()){
14631522
if (sb.length() > 0){
14641523
sb.append("&");
14651524
}
1466-
sb.append(parameter.getKey());
1467-
sb.append("=");
14681525
try {
1469-
sb.append(URLEncoder.encode(parameter.getValue().toString(), "UTF-8"));
1470-
} catch (UnsupportedEncodingException e) {
1526+
StringBuilder sb2 = new StringBuilder();
1527+
sb2.append(parameter.getKey());
1528+
sb2.append("=");
1529+
sb2.append(URLEncoder.encode(parameter.getValue().toString(), "UTF-8"));
1530+
sb.append(sb2);
1531+
}
1532+
catch (UnsupportedEncodingException e) {
14711533
System.err.println(e.getMessage());
14721534
}
14731535
}
1536+
for (Entry<String, List> customTrackingParameter : customTrackingParameters.entrySet()){
1537+
for (Object o : customTrackingParameter.getValue()){
1538+
if (sb.length() > 0){
1539+
sb.append("&");
1540+
}
1541+
try {
1542+
StringBuilder sb2 = new StringBuilder();
1543+
sb2.append(URLEncoder.encode(customTrackingParameter.getKey(), "UTF-8"));
1544+
sb2.append("=");
1545+
sb2.append(URLEncoder.encode(o.toString(), "UTF-8"));
1546+
sb.append(sb2);
1547+
}
1548+
catch (UnsupportedEncodingException e) {
1549+
System.err.println(e.getMessage());
1550+
}
1551+
}
1552+
}
14741553

14751554
return sb.toString();
14761555
}

src/test/java/org/piwik/java/tracking/PiwikRequestTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1269,6 +1269,24 @@ public void testGetQueryString(){
12691269
request.getQueryString());
12701270
request.setPageCustomVariable("key", null);
12711271
assertEquals("rand=random&idsite=3&rec=1&apiv=1&send_image=0&_id=1234567890123456&url=http://test.com", request.getQueryString());
1272+
request.addCustomTrackingParameter("key", "test");
1273+
assertEquals("rand=random&idsite=3&rec=1&apiv=1&send_image=0&_id=1234567890123456&url=http://test.com&key=test", request.getQueryString());
1274+
request.addCustomTrackingParameter("key", "test2");
1275+
assertEquals("rand=random&idsite=3&rec=1&apiv=1&send_image=0&_id=1234567890123456&url=http://test.com&key=test&key=test2", request.getQueryString());
1276+
request.setCustomTrackingParameter("key2", "test3");
1277+
assertEquals("rand=random&idsite=3&rec=1&apiv=1&send_image=0&_id=1234567890123456&url=http://test.com&key2=test3&key=test&key=test2", request.getQueryString());
1278+
request.setCustomTrackingParameter("key", "test4");
1279+
assertEquals("rand=random&idsite=3&rec=1&apiv=1&send_image=0&_id=1234567890123456&url=http://test.com&key2=test3&key=test4", request.getQueryString());
1280+
request.setRandomValue(null);
1281+
request.setSiteId(null);
1282+
request.setRequired(null);
1283+
request.setApiVersion(null);
1284+
request.setResponseAsImage(null);
1285+
request.setVisitorId(null);
1286+
request.setActionUrl(null);
1287+
assertEquals("key2=test3&key=test4", request.getQueryString());
1288+
request.clearCustomTrackingParameter();
1289+
assertEquals("", request.getQueryString());
12721290
}
12731291

12741292
/**
@@ -1279,6 +1297,24 @@ public void testGetUrlEncodedQueryString(){
12791297
request.setRandomValue("random");
12801298
request.setVisitorId("1234567890123456");
12811299
assertEquals("rand=random&idsite=3&rec=1&apiv=1&send_image=0&_id=1234567890123456&url=http%3A%2F%2Ftest.com", request.getUrlEncodedQueryString());
1300+
request.addCustomTrackingParameter("ke/y", "te:st");
1301+
assertEquals("rand=random&idsite=3&rec=1&apiv=1&send_image=0&_id=1234567890123456&url=http%3A%2F%2Ftest.com&ke%2Fy=te%3Ast", request.getUrlEncodedQueryString());
1302+
request.addCustomTrackingParameter("ke/y", "te:st2");
1303+
assertEquals("rand=random&idsite=3&rec=1&apiv=1&send_image=0&_id=1234567890123456&url=http%3A%2F%2Ftest.com&ke%2Fy=te%3Ast&ke%2Fy=te%3Ast2", request.getUrlEncodedQueryString());
1304+
request.setCustomTrackingParameter("ke/y2", "te:st3");
1305+
assertEquals("rand=random&idsite=3&rec=1&apiv=1&send_image=0&_id=1234567890123456&url=http%3A%2F%2Ftest.com&ke%2Fy=te%3Ast&ke%2Fy=te%3Ast2&ke%2Fy2=te%3Ast3", request.getUrlEncodedQueryString());
1306+
request.setCustomTrackingParameter("ke/y", "te:st4");
1307+
assertEquals("rand=random&idsite=3&rec=1&apiv=1&send_image=0&_id=1234567890123456&url=http%3A%2F%2Ftest.com&ke%2Fy=te%3Ast4&ke%2Fy2=te%3Ast3", request.getUrlEncodedQueryString());
1308+
request.setRandomValue(null);
1309+
request.setSiteId(null);
1310+
request.setRequired(null);
1311+
request.setApiVersion(null);
1312+
request.setResponseAsImage(null);
1313+
request.setVisitorId(null);
1314+
request.setActionUrl(null);
1315+
assertEquals("ke%2Fy=te%3Ast4&ke%2Fy2=te%3Ast3", request.getUrlEncodedQueryString());
1316+
request.clearCustomTrackingParameter();
1317+
assertEquals("", request.getUrlEncodedQueryString());
12821318
}
12831319

12841320
/**

0 commit comments

Comments
 (0)