Skip to content

Commit 963be99

Browse files
committed
Resolve matomo-org#8
2 parents 7ff4422 + dd40926 commit 963be99

3 files changed

Lines changed: 234 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</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: 112 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
@@ -397,6 +401,78 @@ public void setCurrentSecond(Integer currentSecond){
397401
setParameter(CURRENT_SECOND, currentSecond);
398402
}
399403

404+
/**
405+
* Gets the list of objects currently stored at the specified custom tracking
406+
* parameter. An empty list will be returned if there are no objects set at
407+
* that key.
408+
* @param key the key of the parameter whose list of objects to get. Cannot be null
409+
* @return the list of objects currently stored at the specified key
410+
*/
411+
public List getCustomTrackingParameter(String key){
412+
if (key == null){
413+
throw new NullPointerException("Key cannot be null.");
414+
}
415+
List l = customTrackingParameters.get(key);
416+
if (l == null){
417+
return new ArrayList(0);
418+
}
419+
return new ArrayList(l);
420+
}
421+
422+
/**
423+
* Set a custom tracking parameter whose toString() value will be sent to
424+
* the Piwik server. These parameters are stored separately from named Piwik
425+
* parameters, meaning it is not possible to overwrite or clear named Piwik
426+
* parameters with this method. A custom parameter that has the same name
427+
* as a named Piwik parameter will be sent in addition to that named parameter.
428+
* @param key the parameter's key. Cannot be null
429+
* @param value the parameter's value. Removes the parameter if null
430+
*/
431+
public void setCustomTrackingParameter(String key, Object value){
432+
if (key == null){
433+
throw new NullPointerException("Key cannot be null.");
434+
}
435+
if (value == null){
436+
customTrackingParameters.remove(key);
437+
}
438+
else{
439+
List l = new ArrayList();
440+
l.add(value);
441+
customTrackingParameters.put(key, l);
442+
}
443+
}
444+
445+
/**
446+
* Add a custom tracking parameter to the specified key. This allows users
447+
* to have multiple parameters with the same name and different values,
448+
* commonly used during situations where list parameters are needed
449+
* @param key the parameter's key. Cannot be null
450+
* @param value the parameter's value. Cannot be null
451+
*/
452+
public void addCustomTrackingParameter(String key, Object value){
453+
if (key == null){
454+
throw new NullPointerException("Key cannot be null.");
455+
}
456+
if (value == null){
457+
throw new NullPointerException("Cannot add a null custom tracking parameter.");
458+
}
459+
else{
460+
List l = customTrackingParameters.get(key);
461+
if (l == null){
462+
l = new ArrayList();
463+
customTrackingParameters.put(key, l);
464+
}
465+
l.add(value);
466+
}
467+
}
468+
469+
/**
470+
* Removes all custom tracking parameters
471+
*/
472+
public void clearCustomTrackingParameter(){
473+
customTrackingParameters.clear();
474+
}
475+
400476
/**
401477
* Get the resolution of the device
402478
* @return the resolution
@@ -1441,14 +1517,24 @@ public void setVisitorVisitCount(Integer visitorVisitCount){
14411517

14421518
public String getQueryString(){
14431519
StringBuilder sb = new StringBuilder();
1444-
for (Map.Entry<String, Object> parameter : parameters.entrySet()){
1520+
for (Entry<String, Object> parameter : parameters.entrySet()){
14451521
if (sb.length() > 0){
14461522
sb.append("&");
14471523
}
14481524
sb.append(parameter.getKey());
14491525
sb.append("=");
14501526
sb.append(parameter.getValue().toString());
14511527
}
1528+
for (Entry<String, List> customTrackingParameter : customTrackingParameters.entrySet()){
1529+
for (Object o : customTrackingParameter.getValue()){
1530+
if (sb.length() > 0){
1531+
sb.append("&");
1532+
}
1533+
sb.append(customTrackingParameter.getKey());
1534+
sb.append("=");
1535+
sb.append(o.toString());
1536+
}
1537+
}
14521538

14531539
return sb.toString();
14541540
}
@@ -1459,18 +1545,38 @@ public String getQueryString(){
14591545
*/
14601546
public String getUrlEncodedQueryString(){
14611547
StringBuilder sb = new StringBuilder();
1462-
for (Map.Entry<String, Object> parameter : parameters.entrySet()){
1548+
for (Entry<String, Object> parameter : parameters.entrySet()){
14631549
if (sb.length() > 0){
14641550
sb.append("&");
14651551
}
1466-
sb.append(parameter.getKey());
1467-
sb.append("=");
14681552
try {
1469-
sb.append(URLEncoder.encode(parameter.getValue().toString(), "UTF-8"));
1470-
} catch (UnsupportedEncodingException e) {
1553+
StringBuilder sb2 = new StringBuilder();
1554+
sb2.append(parameter.getKey());
1555+
sb2.append("=");
1556+
sb2.append(URLEncoder.encode(parameter.getValue().toString(), "UTF-8"));
1557+
sb.append(sb2);
1558+
}
1559+
catch (UnsupportedEncodingException e) {
14711560
System.err.println(e.getMessage());
14721561
}
14731562
}
1563+
for (Entry<String, List> customTrackingParameter : customTrackingParameters.entrySet()){
1564+
for (Object o : customTrackingParameter.getValue()){
1565+
if (sb.length() > 0){
1566+
sb.append("&");
1567+
}
1568+
try {
1569+
StringBuilder sb2 = new StringBuilder();
1570+
sb2.append(URLEncoder.encode(customTrackingParameter.getKey(), "UTF-8"));
1571+
sb2.append("=");
1572+
sb2.append(URLEncoder.encode(o.toString(), "UTF-8"));
1573+
sb.append(sb2);
1574+
}
1575+
catch (UnsupportedEncodingException e) {
1576+
System.err.println(e.getMessage());
1577+
}
1578+
}
1579+
}
14741580

14751581
return sb.toString();
14761582
}

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

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import java.net.URL;
1010
import java.nio.charset.Charset;
11+
import java.util.List;
1112
import java.util.Locale;
1213
import org.junit.After;
1314
import org.junit.AfterClass;
@@ -232,6 +233,90 @@ public void testCurrentSecond(){
232233
request.setCurrentSecond(3);
233234
assertEquals(new Integer(3), request.getCurrentSecond());
234235
}
236+
237+
/**
238+
* Test of getCustomTrackingParameter method, of class PiwikRequest.
239+
*/
240+
@Test
241+
public void testGetCustomTrackingParameter_T(){
242+
try{
243+
request.getCustomTrackingParameter(null);
244+
fail("Exception should have been thrown.");
245+
}
246+
catch(NullPointerException e){
247+
assertEquals("Key cannot be null.", e.getLocalizedMessage());
248+
}
249+
}
250+
@Test
251+
public void testGetCustomTrackingParameter_FT(){
252+
assertTrue(request.getCustomTrackingParameter("key").isEmpty());
253+
}
254+
@Test
255+
public void testSetCustomTrackingParameter_T(){
256+
try{
257+
request.setCustomTrackingParameter(null, null);
258+
fail("Exception should have been thrown.");
259+
}
260+
catch(NullPointerException e){
261+
assertEquals("Key cannot be null.", e.getLocalizedMessage());
262+
}
263+
}
264+
@Test
265+
public void testSetCustomTrackingParameter_F(){
266+
request.setCustomTrackingParameter("key", "value");
267+
List l = request.getCustomTrackingParameter("key");
268+
assertEquals(1, l.size());
269+
assertEquals("value", l.get(0));
270+
271+
request.setCustomTrackingParameter("key", "value2");
272+
l = request.getCustomTrackingParameter("key");
273+
assertEquals(1, l.size());
274+
assertEquals("value2", l.get(0));
275+
276+
request.setCustomTrackingParameter("key", null);
277+
l = request.getCustomTrackingParameter("key");
278+
assertTrue(l.isEmpty());
279+
}
280+
@Test
281+
public void testAddCustomTrackingParameter_T(){
282+
try{
283+
request.addCustomTrackingParameter(null, null);
284+
fail("Exception should have been thrown.");
285+
}
286+
catch(NullPointerException e){
287+
assertEquals("Key cannot be null.", e.getLocalizedMessage());
288+
}
289+
}
290+
@Test
291+
public void testAddCustomTrackingParameter_FT(){
292+
try{
293+
request.addCustomTrackingParameter("key", null);
294+
fail("Exception should have been thrown.");
295+
}
296+
catch(NullPointerException e){
297+
assertEquals("Cannot add a null custom tracking parameter.", e.getLocalizedMessage());
298+
}
299+
}
300+
@Test
301+
public void testAddCustomTrackingParameter_FF(){
302+
request.addCustomTrackingParameter("key", "value");
303+
List l = request.getCustomTrackingParameter("key");
304+
assertEquals(1, l.size());
305+
assertEquals("value", l.get(0));
306+
307+
request.addCustomTrackingParameter("key", "value2");
308+
l = request.getCustomTrackingParameter("key");
309+
assertEquals(2, l.size());
310+
assertTrue(l.contains("value"));
311+
assertTrue(l.contains("value2"));
312+
}
313+
@Test
314+
public void testClearCustomTrackingParameter(){
315+
request.setCustomTrackingParameter("key", "value");
316+
request.clearCustomTrackingParameter();
317+
List l = request.getCustomTrackingParameter("key");
318+
assertTrue(l.isEmpty());
319+
}
235320

236321
/**
237322
* Test of getDeviceResolution method, of class PiwikRequest.
@@ -1269,6 +1354,24 @@ public void testGetQueryString(){
12691354
request.getQueryString());
12701355
request.setPageCustomVariable("key", null);
12711356
assertEquals("rand=random&idsite=3&rec=1&apiv=1&send_image=0&_id=1234567890123456&url=http://test.com", request.getQueryString());
1357+
request.addCustomTrackingParameter("key", "test");
1358+
assertEquals("rand=random&idsite=3&rec=1&apiv=1&send_image=0&_id=1234567890123456&url=http://test.com&key=test", request.getQueryString());
1359+
request.addCustomTrackingParameter("key", "test2");
1360+
assertEquals("rand=random&idsite=3&rec=1&apiv=1&send_image=0&_id=1234567890123456&url=http://test.com&key=test&key=test2", request.getQueryString());
1361+
request.setCustomTrackingParameter("key2", "test3");
1362+
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());
1363+
request.setCustomTrackingParameter("key", "test4");
1364+
assertEquals("rand=random&idsite=3&rec=1&apiv=1&send_image=0&_id=1234567890123456&url=http://test.com&key2=test3&key=test4", request.getQueryString());
1365+
request.setRandomValue(null);
1366+
request.setSiteId(null);
1367+
request.setRequired(null);
1368+
request.setApiVersion(null);
1369+
request.setResponseAsImage(null);
1370+
request.setVisitorId(null);
1371+
request.setActionUrl(null);
1372+
assertEquals("key2=test3&key=test4", request.getQueryString());
1373+
request.clearCustomTrackingParameter();
1374+
assertEquals("", request.getQueryString());
12721375
}
12731376

12741377
/**
@@ -1279,6 +1382,24 @@ public void testGetUrlEncodedQueryString(){
12791382
request.setRandomValue("random");
12801383
request.setVisitorId("1234567890123456");
12811384
assertEquals("rand=random&idsite=3&rec=1&apiv=1&send_image=0&_id=1234567890123456&url=http%3A%2F%2Ftest.com", request.getUrlEncodedQueryString());
1385+
request.addCustomTrackingParameter("ke/y", "te:st");
1386+
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());
1387+
request.addCustomTrackingParameter("ke/y", "te:st2");
1388+
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());
1389+
request.setCustomTrackingParameter("ke/y2", "te:st3");
1390+
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());
1391+
request.setCustomTrackingParameter("ke/y", "te:st4");
1392+
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());
1393+
request.setRandomValue(null);
1394+
request.setSiteId(null);
1395+
request.setRequired(null);
1396+
request.setApiVersion(null);
1397+
request.setResponseAsImage(null);
1398+
request.setVisitorId(null);
1399+
request.setActionUrl(null);
1400+
assertEquals("ke%2Fy=te%3Ast4&ke%2Fy2=te%3Ast3", request.getUrlEncodedQueryString());
1401+
request.clearCustomTrackingParameter();
1402+
assertEquals("", request.getUrlEncodedQueryString());
12821403
}
12831404

12841405
/**

0 commit comments

Comments
 (0)