adaptive-caching-framework
Changes
evaluation/Applications/AP/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/country/model/Country.java 23(+5 -18)
evaluation/Applications/AP/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/currency/model/Currency.java 16(+4 -12)
evaluation/Applications/AP/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/language/model/Language.java 22(+5 -17)
evaluation/Applications/AP/shopizer/sm-shop/src/main/java/com/salesmanager/web/Configuration.java 2(+1 -1)
evaluation/Applications/AP/spring-petclinic/src/main/java/org/springframework/samples/petclinic/Configuration.java 2(+1 -1)
evaluation/Applications/DEV/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/merchant/model/MerchantStore.java 34(+9 -25)
evaluation/Applications/NO/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/country/model/Country.java 23(+5 -18)
evaluation/Applications/NO/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/currency/model/Currency.java 16(+4 -12)
evaluation/Applications/NO/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/language/model/Language.java 22(+5 -17)
evaluation/JMeter/cloudscale-max.jmx 1258(+1257 -1)
evaluation/JMeter/cloudscale-sustain.jmx 1236(+1235 -1)
evaluation/JMeter/Shopizer.jmx 6(+3 -3)
experiments.sh 42(+27 -15)
framework/autonomicmanager/pom.xml 2(+1 -1)
framework/autonomicmanager/README.md 6(+3 -3)
framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/Analyzer.java 141(+77 -64)
framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/model/MethodEntry.java 4(+4 -0)
framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/cacher/key/generic/SimpleKey.java 5(+2 -3)
framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/cacher/key/generic/SimpleKeyGenerator.java 44(+0 -44)
framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/cacher/key/Key.java 15(+13 -2)
framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/model/support/SimpleCacheManager.java 2(+1 -1)
framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/util/CacheManagerFactory.java 5(+3 -2)
framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/configuration/annotation/AdaptiveCaching.java 13(+8 -5)
framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/aspects/TracerAspect.java 97(+63 -34)
framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfo.java 13(+12 -1)
framework/autonomicmanager/src/test/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/Learner.java 22(+21 -1)
README.md 34(+17 -17)
Details
diff --git a/evaluation/Applications/AP/CloudStore/pom.xml b/evaluation/Applications/AP/CloudStore/pom.xml
index 43a97fd..145fd8a 100644
--- a/evaluation/Applications/AP/CloudStore/pom.xml
+++ b/evaluation/Applications/AP/CloudStore/pom.xml
@@ -185,7 +185,7 @@
<dependency>
<groupId>br.ufrgs.inf.prosoft.adaptivecaching</groupId>
<artifactId>autonomicmanager</artifactId>
- <version>0.3.0-SNAPSHOT</version>
+ <version>0.5.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
diff --git a/evaluation/Applications/AP/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/country/model/Country.java b/evaluation/Applications/AP/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/country/model/Country.java
index 6be29db..bbb1890 100755
--- a/evaluation/Applications/AP/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/country/model/Country.java
+++ b/evaluation/Applications/AP/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/country/model/Country.java
@@ -1,30 +1,17 @@
package com.salesmanager.core.business.reference.country.model;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.Cacheable;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Transient;
-
import com.salesmanager.core.business.generic.model.SalesManagerEntity;
import com.salesmanager.core.business.reference.geozone.model.GeoZone;
import com.salesmanager.core.business.reference.zone.model.Zone;
import com.salesmanager.core.constants.SchemaConstant;
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.List;
+
@Entity
@Table(name = "COUNTRY", schema=SchemaConstant.SALESMANAGER_SCHEMA)
-@Cacheable
+//@Cacheable
public class Country extends SalesManagerEntity<Integer, Country> {
private static final long serialVersionUID = -7388011537255588035L;
diff --git a/evaluation/Applications/AP/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/currency/model/Currency.java b/evaluation/Applications/AP/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/currency/model/Currency.java
index 0e1912c..a2c3136 100755
--- a/evaluation/Applications/AP/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/currency/model/Currency.java
+++ b/evaluation/Applications/AP/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/currency/model/Currency.java
@@ -1,22 +1,14 @@
package com.salesmanager.core.business.reference.currency.model;
-import java.io.Serializable;
-
-import javax.persistence.Cacheable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-
import com.salesmanager.core.business.generic.model.SalesManagerEntity;
import com.salesmanager.core.constants.SchemaConstant;
+import javax.persistence.*;
+import java.io.Serializable;
+
@Entity
@Table(name = "CURRENCY", schema = SchemaConstant.SALESMANAGER_SCHEMA)
-@Cacheable
+//@Cacheable
public class Currency extends SalesManagerEntity<Long, Currency> implements Serializable {
private static final long serialVersionUID = -999926410367685145L;
diff --git a/evaluation/Applications/AP/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/language/model/Language.java b/evaluation/Applications/AP/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/language/model/Language.java
index d359f59..7850dee 100755
--- a/evaluation/Applications/AP/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/language/model/Language.java
+++ b/evaluation/Applications/AP/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/language/model/Language.java
@@ -1,21 +1,5 @@
package com.salesmanager.core.business.reference.language.model;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.Cacheable;
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.EntityListeners;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.ManyToMany;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-
import com.salesmanager.core.business.common.model.audit.AuditListener;
import com.salesmanager.core.business.common.model.audit.AuditSection;
import com.salesmanager.core.business.common.model.audit.Auditable;
@@ -23,10 +7,14 @@ import com.salesmanager.core.business.generic.model.SalesManagerEntity;
import com.salesmanager.core.business.merchant.model.MerchantStore;
import com.salesmanager.core.constants.SchemaConstant;
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.List;
+
@Entity
@EntityListeners(value = AuditListener.class)
@Table(name = "LANGUAGE", schema=SchemaConstant.SALESMANAGER_SCHEMA)
-@Cacheable
+//@Cacheable
public class Language extends SalesManagerEntity<Integer, Language> implements Auditable {
private static final long serialVersionUID = -7676627812941330669L;
diff --git a/evaluation/Applications/AP/shopizer/sm-shop/pom.xml b/evaluation/Applications/AP/shopizer/sm-shop/pom.xml
index e5741d2..96fbd23 100755
--- a/evaluation/Applications/AP/shopizer/sm-shop/pom.xml
+++ b/evaluation/Applications/AP/shopizer/sm-shop/pom.xml
@@ -361,7 +361,7 @@
<dependency>
<groupId>br.ufrgs.inf.prosoft.adaptivecaching</groupId>
<artifactId>autonomicmanager</artifactId>
- <version>0.3.0-SNAPSHOT</version>
+ <version>0.5.0-SNAPSHOT</version>
</dependency>
<dependency>
diff --git a/evaluation/Applications/AP/shopizer/sm-shop/src/main/java/com/salesmanager/web/Configuration.java b/evaluation/Applications/AP/shopizer/sm-shop/src/main/java/com/salesmanager/web/Configuration.java
index e4a4a37..70bb622 100644
--- a/evaluation/Applications/AP/shopizer/sm-shop/src/main/java/com/salesmanager/web/Configuration.java
+++ b/evaluation/Applications/AP/shopizer/sm-shop/src/main/java/com/salesmanager/web/Configuration.java
@@ -10,6 +10,6 @@ import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.Repos
@AdaptiveCaching(cacheProvider = CacheProviderType.EHCACHE, logRepository = RepositoryType.MEMORY,
modelling = Modelling.FULLEXPLORATION, analyzerEnabled = true, enabled = true, disableMonitoringAfterAnalysis = true,
clearMonitoringDataOnStart = true, traceAsync = false, tracerEnabled = true)
-@ComponentScan(allowed = "com.salesmanager", denied = "modelasdasd21323asd")
+@ComponentScan(allowed = "com.salesmanager", denied = "model")
public class Configuration {
}
diff --git a/evaluation/Applications/AP/spring-petclinic/pom.xml b/evaluation/Applications/AP/spring-petclinic/pom.xml
index e554c95..18e70c8 100644
--- a/evaluation/Applications/AP/spring-petclinic/pom.xml
+++ b/evaluation/Applications/AP/spring-petclinic/pom.xml
@@ -229,7 +229,7 @@
<dependency>
<groupId>br.ufrgs.inf.prosoft.adaptivecaching</groupId>
<artifactId>autonomicmanager</artifactId>
- <version>0.4.0-SNAPSHOT</version>
+ <version>0.5.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
diff --git a/evaluation/Applications/AP/spring-petclinic/spring-petclinic.iml b/evaluation/Applications/AP/spring-petclinic/spring-petclinic.iml
index 1be412a..0eeb2c9 100644
--- a/evaluation/Applications/AP/spring-petclinic/spring-petclinic.iml
+++ b/evaluation/Applications/AP/spring-petclinic/spring-petclinic.iml
@@ -1,30 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="web" name="Web">
- <configuration>
- <descriptors>
- <deploymentDescriptor name="jetty-web.xml" url="file://$MODULE_DIR$/src/main/webapp/WEB-INF/jetty-web.xml" />
- </descriptors>
- <webroots>
- <root url="file://$MODULE_DIR$/src/main/webapp" relative="/" />
- </webroots>
- <sourceRoots>
- <root url="file://$MODULE_DIR$/src/main/java" />
- <root url="file://$MODULE_DIR$/src/main/resources" />
- </sourceRoots>
- </configuration>
- </facet>
- <facet type="AspectJ" name="AspectJ">
- <configuration>
- <option name="aspectPath">
- <module>
- <option name="name" value="autonomicmanager" />
- </module>
- </option>
- </configuration>
- </facet>
- </component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
@@ -104,7 +79,7 @@
<orderEntry type="library" name="Maven: org.objenesis:objenesis:2.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-all:1.3" level="project" />
<orderEntry type="library" name="Maven: com.googlecode.json-simple:json-simple:1.1.1" level="project" />
- <orderEntry type="module" module-name="autonomicmanager" />
+ <orderEntry type="library" name="Maven: br.ufrgs.inf.prosoft.adaptivecaching:autonomicmanager:0.5.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: org.reflections:reflections:0.9.10" level="project" />
<orderEntry type="library" name="Maven: com.google.code.findbugs:annotations:2.0.1" level="project" />
<orderEntry type="library" name="Maven: org.ehcache:sizeof:0.3.0" level="project" />
diff --git a/evaluation/Applications/AP/spring-petclinic/src/main/java/org/springframework/samples/petclinic/Configuration.java b/evaluation/Applications/AP/spring-petclinic/src/main/java/org/springframework/samples/petclinic/Configuration.java
index c41b705..9da18c7 100644
--- a/evaluation/Applications/AP/spring-petclinic/src/main/java/org/springframework/samples/petclinic/Configuration.java
+++ b/evaluation/Applications/AP/spring-petclinic/src/main/java/org/springframework/samples/petclinic/Configuration.java
@@ -7,7 +7,7 @@ import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.Model
import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.RepositoryType;
//working config: mongodb, accumulation
-@AdaptiveCaching(cacheProvider = CacheProviderType.EHCACHE, logRepository = RepositoryType.MONGODB,
+@AdaptiveCaching(cacheProvider = CacheProviderType.EHCACHE, logRepository = RepositoryType.MEMORY,
modelling = Modelling.ACCUMULATION, analyzerEnabled = false, enabled = true, disableMonitoringAfterAnalysis = true,
clearMonitoringDataOnStart = true, traceAsync = false, tracerEnabled = true)
diff --git a/evaluation/Applications/DEV/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/merchant/model/MerchantStore.java b/evaluation/Applications/DEV/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/merchant/model/MerchantStore.java
index 35e77dd..0bcf5f4 100755
--- a/evaluation/Applications/DEV/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/merchant/model/MerchantStore.java
+++ b/evaluation/Applications/DEV/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/merchant/model/MerchantStore.java
@@ -1,29 +1,5 @@
package com.salesmanager.core.business.merchant.model;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-import javax.validation.constraints.Pattern;
-
-import org.hibernate.validator.constraints.Email;
-import org.hibernate.validator.constraints.NotEmpty;
-
import com.salesmanager.core.business.generic.model.SalesManagerEntity;
import com.salesmanager.core.business.reference.country.model.Country;
import com.salesmanager.core.business.reference.currency.model.Currency;
@@ -32,6 +8,14 @@ import com.salesmanager.core.business.reference.zone.model.Zone;
import com.salesmanager.core.constants.MeasureUnit;
import com.salesmanager.core.constants.SchemaConstant;
import com.salesmanager.core.utils.CloneUtils;
+import org.hibernate.validator.constraints.Email;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.persistence.*;
+import javax.validation.constraints.Pattern;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
@Entity
@Table(name = "MERCHANT_STORE", schema=SchemaConstant.SALESMANAGER_SCHEMA)
@@ -106,7 +90,7 @@ public class MerchantStore extends SalesManagerEntity<Integer, MerchantStore> {
private List<Language> languages = new ArrayList<Language>();
@Column(name = "USE_CACHE")
- private boolean useCache = false;
+ private boolean useCache = true;
@Column(name="STORE_TEMPLATE", length=25)
private String storeTemplate;
diff --git a/evaluation/Applications/DEV/shopizer/sm-shop/sm-shop.iml b/evaluation/Applications/DEV/shopizer/sm-shop/sm-shop.iml
index b91e59f..c4919f3 100644
--- a/evaluation/Applications/DEV/shopizer/sm-shop/sm-shop.iml
+++ b/evaluation/Applications/DEV/shopizer/sm-shop/sm-shop.iml
@@ -1,30 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="AspectJ" name="AspectJ">
- <configuration>
- <option name="aspectPath">
- <projectLibrary>
- <option name="name" value="Maven: br.ufrgs.inf.prosoft.adaptivecaching:autonomicmanager:0.3.0-SNAPSHOT" />
- </projectLibrary>
- </option>
- </configuration>
- </facet>
- <facet type="web" name="Web">
- <configuration>
- <descriptors>
- <deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/src/main/webapp/WEB-INF/web.xml" />
- </descriptors>
- <webroots>
- <root url="file://$MODULE_DIR$/src/main/webapp" relative="/" />
- </webroots>
- <sourceRoots>
- <root url="file://$MODULE_DIR$/src/main/java" />
- <root url="file://$MODULE_DIR$/src/main/resources" />
- </sourceRoots>
- </configuration>
- </facet>
- </component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
diff --git a/evaluation/Applications/NO/CloudStore/showcase.iml b/evaluation/Applications/NO/CloudStore/showcase.iml
index 85d79a6..152eda5 100644
--- a/evaluation/Applications/NO/CloudStore/showcase.iml
+++ b/evaluation/Applications/NO/CloudStore/showcase.iml
@@ -1,21 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="web" name="Web">
- <configuration>
- <descriptors>
- <deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/src/main/webapp/WEB-INF/web.xml" />
- </descriptors>
- <webroots>
- <root url="file://$MODULE_DIR$/src/main/webapp" relative="/" />
- </webroots>
- <sourceRoots>
- <root url="file://$MODULE_DIR$/src/main/java" />
- <root url="file://$MODULE_DIR$/src/main/resources" />
- </sourceRoots>
- </configuration>
- </facet>
- </component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
diff --git a/evaluation/Applications/NO/shopizer/sm-core-model/sm-core-model.iml b/evaluation/Applications/NO/shopizer/sm-core-model/sm-core-model.iml
index b62a63b..53f8d13 100644
--- a/evaluation/Applications/NO/shopizer/sm-core-model/sm-core-model.iml
+++ b/evaluation/Applications/NO/shopizer/sm-core-model/sm-core-model.iml
@@ -3,13 +3,9 @@
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
- <exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
- <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/apt" isTestSource="false" generated="true" />
- <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/querydsl" isTestSource="false" generated="true" />
- <excludeFolder url="file://$MODULE_DIR$/target/maven-archiver" />
- <excludeFolder url="file://$MODULE_DIR$/target/maven-status" />
+ <excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
diff --git a/evaluation/Applications/NO/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/country/model/Country.java b/evaluation/Applications/NO/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/country/model/Country.java
index 6be29db..bbb1890 100755
--- a/evaluation/Applications/NO/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/country/model/Country.java
+++ b/evaluation/Applications/NO/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/country/model/Country.java
@@ -1,30 +1,17 @@
package com.salesmanager.core.business.reference.country.model;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.Cacheable;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Transient;
-
import com.salesmanager.core.business.generic.model.SalesManagerEntity;
import com.salesmanager.core.business.reference.geozone.model.GeoZone;
import com.salesmanager.core.business.reference.zone.model.Zone;
import com.salesmanager.core.constants.SchemaConstant;
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.List;
+
@Entity
@Table(name = "COUNTRY", schema=SchemaConstant.SALESMANAGER_SCHEMA)
-@Cacheable
+//@Cacheable
public class Country extends SalesManagerEntity<Integer, Country> {
private static final long serialVersionUID = -7388011537255588035L;
diff --git a/evaluation/Applications/NO/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/currency/model/Currency.java b/evaluation/Applications/NO/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/currency/model/Currency.java
index 0e1912c..a2c3136 100755
--- a/evaluation/Applications/NO/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/currency/model/Currency.java
+++ b/evaluation/Applications/NO/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/currency/model/Currency.java
@@ -1,22 +1,14 @@
package com.salesmanager.core.business.reference.currency.model;
-import java.io.Serializable;
-
-import javax.persistence.Cacheable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-
import com.salesmanager.core.business.generic.model.SalesManagerEntity;
import com.salesmanager.core.constants.SchemaConstant;
+import javax.persistence.*;
+import java.io.Serializable;
+
@Entity
@Table(name = "CURRENCY", schema = SchemaConstant.SALESMANAGER_SCHEMA)
-@Cacheable
+//@Cacheable
public class Currency extends SalesManagerEntity<Long, Currency> implements Serializable {
private static final long serialVersionUID = -999926410367685145L;
diff --git a/evaluation/Applications/NO/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/language/model/Language.java b/evaluation/Applications/NO/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/language/model/Language.java
index d359f59..7850dee 100755
--- a/evaluation/Applications/NO/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/language/model/Language.java
+++ b/evaluation/Applications/NO/shopizer/sm-core-model/src/main/java/com/salesmanager/core/business/reference/language/model/Language.java
@@ -1,21 +1,5 @@
package com.salesmanager.core.business.reference.language.model;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.Cacheable;
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.EntityListeners;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.ManyToMany;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-
import com.salesmanager.core.business.common.model.audit.AuditListener;
import com.salesmanager.core.business.common.model.audit.AuditSection;
import com.salesmanager.core.business.common.model.audit.Auditable;
@@ -23,10 +7,14 @@ import com.salesmanager.core.business.generic.model.SalesManagerEntity;
import com.salesmanager.core.business.merchant.model.MerchantStore;
import com.salesmanager.core.constants.SchemaConstant;
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.List;
+
@Entity
@EntityListeners(value = AuditListener.class)
@Table(name = "LANGUAGE", schema=SchemaConstant.SALESMANAGER_SCHEMA)
-@Cacheable
+//@Cacheable
public class Language extends SalesManagerEntity<Integer, Language> implements Auditable {
private static final long serialVersionUID = -7676627812941330669L;
diff --git a/evaluation/Applications/NO/shopizer/sm-shop/sm-shop.iml b/evaluation/Applications/NO/shopizer/sm-shop/sm-shop.iml
index 63d4fca..4e62059 100644
--- a/evaluation/Applications/NO/shopizer/sm-shop/sm-shop.iml
+++ b/evaluation/Applications/NO/shopizer/sm-shop/sm-shop.iml
@@ -1,30 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="AspectJ" name="AspectJ">
- <configuration>
- <option name="aspectPath">
- <projectLibrary>
- <option name="name" value="Maven: br.ufrgs.inf.prosoft.adaptivecaching:autonomicmanager:0.3.0-SNAPSHOT" />
- </projectLibrary>
- </option>
- </configuration>
- </facet>
- <facet type="web" name="Web">
- <configuration>
- <descriptors>
- <deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/src/main/webapp/WEB-INF/web.xml" />
- </descriptors>
- <webroots>
- <root url="file://$MODULE_DIR$/src/main/webapp" relative="/" />
- </webroots>
- <sourceRoots>
- <root url="file://$MODULE_DIR$/src/main/java" />
- <root url="file://$MODULE_DIR$/src/main/resources" />
- </sourceRoots>
- </configuration>
- </facet>
- </component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
evaluation/JMeter/cloudscale-max.jmx 1258(+1257 -1)
diff --git a/evaluation/JMeter/cloudscale-max.jmx b/evaluation/JMeter/cloudscale-max.jmx
index 69270bf..6cc3dee 100644
--- a/evaluation/JMeter/cloudscale-max.jmx
+++ b/evaluation/JMeter/cloudscale-max.jmx
@@ -96,7 +96,7 @@
</collectionProp>
</Arguments>
<hashTree/>
- <kg.apc.jmeter.threads.UltimateThreadGroup guiclass="kg.apc.jmeter.threads.UltimateThreadGroupGui" testclass="kg.apc.jmeter.threads.UltimateThreadGroup" testname="jp@gc - Ultimate Thread Group" enabled="true">
+ <kg.apc.jmeter.threads.UltimateThreadGroup guiclass="kg.apc.jmeter.threads.UltimateThreadGroupGui" testclass="kg.apc.jmeter.threads.UltimateThreadGroup" testname="jp@gc - Ultimate Thread Group" enabled="false">
<collectionProp name="ultimatethreadgroupdata">
<collectionProp name="1277204053">
<stringProp name="1537214">2000</stringProp>
@@ -1352,6 +1352,1262 @@ if( ids.size() > 0 )
</hashTree>
</hashTree>
</hashTree>
+ <kg.apc.jmeter.threads.UltimateThreadGroup guiclass="kg.apc.jmeter.threads.UltimateThreadGroupGui" testclass="kg.apc.jmeter.threads.UltimateThreadGroup" testname="Workload forced to cache" enabled="true">
+ <collectionProp name="ultimatethreadgroupdata">
+ <collectionProp name="1277204053">
+ <stringProp name="1537214">2000</stringProp>
+ <stringProp name="48">0</stringProp>
+ <stringProp name="56499">960</stringProp>
+ <stringProp name="48">0</stringProp>
+ <stringProp name="48">0</stringProp>
+ </collectionProp>
+ </collectionProp>
+ <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
+ <boolProp name="LoopController.continue_forever">false</boolProp>
+ <intProp name="LoopController.loops">-1</intProp>
+ </elementProp>
+ <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
+ </kg.apc.jmeter.threads.UltimateThreadGroup>
+ <hashTree>
+ <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="[BeanShell PreProcessor] Tresholds" enabled="false">
+ <boolProp name="resetInterpreter">false</boolProp>
+ <stringProp name="parameters"></stringProp>
+ <stringProp name="filename"></stringProp>
+ <stringProp name="script">int ADMIN_CONFIRM = 0;
+int ADMIN_REQUEST = 1;
+int BEST_SELLERS = 2;
+int BUY_CONFIRM = 3;
+int BUY_REQUEST = 4;
+int CUSTOMER_REGISTRATION = 5;
+int HOME = 6;
+int NEW_PRODUCTS = 7;
+int ORDER_DISPLAY = 8;
+int ORDER_INQUIRY = 9;
+int PRODUCT_DETAIL = 10;
+int SEARCH_REQUEST = 11;
+int SEARCH_RESULTS = 12;
+int SHOPPING_CART = 13;
+
+/*
+ * See http://www.tpc.org/tpcw/spec/tpcw_v16.pdf page 94
+ */
+int[][] tresholdsMatrix = {
+ {0, 0, 0, 0, 0, 0, 9952, 0, 0, 0, 0, 9999, 0, 0},
+ {8999, 0, 0, 0, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0},
+ {0,0,0,0,0, 0, 167, 0,0,0, 472, 9927,0,9999},
+ {0,0,0,0,0, 0, 84, 0,0,0,0,9999,0,0},
+ {0,0,0,4614,0, 0, 6546, 0,0,0,0,0,0,9999},
+ {0,0,0,0,8666, 0, 8760, 0,0,0,0,9999,0,0},
+ {0,0,3124,0,0, 0, 0, 6249,0, 6718,0,7026,0,9999},
+ {0,0,0,0,0, 0, 156, 0,0,0,9735,9784,0,9999},
+ {0,0,0,0,0, 0, 69, 0,0,0,0,9999,0,0},
+ {0,0,0,0,0, 0, 72, 0,8872,0,0,9999,0,0},
+ {0,58,0,0,0, 0, 832, 0,0,0,1288,8603,0,9999},
+ {0,0,0,0,0, 0, 635, 0,0,0,0,0,9135,9999},
+ {0,0,0,0,0, 0, 2657, 0,0,0,9294,9304,0,9999},
+ {0,0,0,0,0, 2585, 9552, 0,0,0,0,0,0,9999},
+};
+
+int nextOperation(int currentOperation)
+{
+ int newOperation = -1;
+
+ Random rand = new Random();
+ int r = 1 + rand.nextInt(9999);
+
+ for( int i = 0; i < tresholdsMatrix[currentOperation].length; i++)
+ {
+ int t = tresholdsMatrix[currentOperation][i];
+ if( r <= t)
+ return i;
+ }
+
+ return newOperation;
+}
+
+previousOperation = vars.get("OPERATION");
+newOp = nextOperation(Integer.parseInt(previousOperation));
+vars.put("OPERATION", String.valueOf(newOp));</stringProp>
+ </BeanShellPreProcessor>
+ <hashTree/>
+ <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="[BeanShell PreProcessor] ITEM_ID" enabled="true">
+ <boolProp name="resetInterpreter">false</boolProp>
+ <stringProp name="parameters"></stringProp>
+ <stringProp name="filename"></stringProp>
+ <stringProp name="script">import java.util.Random;
+import java.util.ArrayList;
+
+prevTreshold = vars.get("TRESHOLD");
+prevSwitchId = vars.get("SWITCH_ID");
+numItems = Integer.parseInt(vars.get("NUM_ITEMS"));
+
+Random rand = new Random();
+item = 1 + rand.nextInt(numItems);
+vars.put("ITEM_ID", Integer.toString(item));
+
+treshold = 1+rand.nextInt(numItems);
+vars.put("TRESHOLD", Integer.toString(treshold));
+
+//System.out.println("Treshold1 = " + treshold);
+//System.out.println("ITEM_ID1 = " + item);
+</stringProp>
+ </BeanShellPreProcessor>
+ <hashTree/>
+ <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="[BeanShell PreProcessor] probability3" enabled="false">
+ <boolProp name="resetInterpreter">false</boolProp>
+ <stringProp name="parameters"></stringProp>
+ <stringProp name="filename"></stringProp>
+ <stringProp name="script">import org.apache.commons.math3.distribution.EnumeratedDistribution;
+import org.apache.commons.math3.util.Pair;
+import java.util.ArrayList;
+
+class Item
+{
+ String operation;
+ double probability;
+ int jmeterIndex;
+
+ public Item(String operation, double probability, int jmeterIndex)
+ {
+ this.operation = operation;
+ this.probability = probability;
+ this.jmeterIndex = jmeterIndex;
+ }
+}
+
+ArrayList items = new ArrayList(){{
+ add(new Item("Home", 29, 7));
+ add(new Item("New products", 11, 8));
+ add(new Item("Best Sellers", 11, 3));
+ add(new Item("Product Detail", 21, 11));
+ add(new Item("Search Request", 12, 12));
+ add(new Item("Search Results", 11, 13));
+ add(new Item("Shopping Cart", 1.25, 14));
+ add(new Item("Customer Registration", 0.82, 6));
+ add(new Item("Buy Request", 0.75, 5));
+ add(new Item("Buy Confirm", 0.69, 4));
+ add(new Item("Order Inquiry", 0.30, 10));
+ add(new Item("Order Display", 0.25, 9));
+ add(new Item("Admin Request", 0.10, 2));
+ add(new Item("Admin Confirm", 0.09, 1));
+}};
+
+ArrayList itemWeights = new ArrayList();
+for(Item i : items)
+{
+ itemWeights.add(new Pair(i, i.probability));
+}
+
+newOperation = new EnumeratedDistribution(itemWeights).sample();
+
+vars.put("SWITCH_ID", String.valueOf(newOperation.jmeterIndex));</stringProp>
+ </BeanShellPreProcessor>
+ <hashTree/>
+ <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="[BeanShell PreProcessor] probability2" enabled="true">
+ <boolProp name="resetInterpreter">false</boolProp>
+ <stringProp name="parameters"></stringProp>
+ <stringProp name="filename"></stringProp>
+ <stringProp name="script">import java.util.Random;
+
+Random rand = vars.getObject("RANDOM");
+if(rand == null)
+{
+ rand = new Random();
+ vars.putObject("RANDOM", rand);
+}
+
+int[] browsingMix = {
+ 2900, //home
+ 2100, // product-detail
+ 1100, // new-products
+ 75, //buy
+ 69, // buy-confirm
+ 25, // order-display
+ 9, // admin confirm
+ 10, // admin request
+ 30, // order-inquiry
+ 82, //customer-registration
+ 125, // shopping-cart
+ 1100, // best-sellers
+ 1100, // search-result
+ 1200, // search-request
+};
+
+int probSum = 0;
+
+for( int i=0; i < browsingMix.length; i++)
+{
+ probSum += browsingMix[i];
+}
+
+int[] range = new int[2 * browsingMix.length];
+
+for( int i=0; i < browsingMix.length; i++)
+{
+ int sum = 0;
+ for( int j=0; j<i; j++)
+ {
+ sum += browsingMix[j];
+ }
+
+ range[i] = sum;
+ range[i+1] = range[i] + browsingMix[i];
+}
+
+
+int randNum = rand.nextInt(probSum);
+
+for(int i=0; i < browsingMix.length; i++)
+{
+ if( randNum >= range[i] && randNum < range[i+1] )
+ {
+ vars.put("SWITCH_ID", String.valueOf(i));
+ return;
+ }
+}
+</stringProp>
+ </BeanShellPreProcessor>
+ <hashTree/>
+ <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="[BeanShell PreProcessor] buy-confirm" enabled="true">
+ <boolProp name="resetInterpreter">false</boolProp>
+ <stringProp name="parameters"></stringProp>
+ <stringProp name="filename"></stringProp>
+ <stringProp name="script">import java.util.Random;
+
+Random rand = new Random();
+
+String[] ccTypes = {
+ "Visa",
+ "MasterCard",
+ "Discover",
+ "Amex",
+ "Diners"
+};
+
+String[] shippingTypes = {
+ "AIR",
+ "UPS",
+ "FEDEX",
+ "SHIP",
+ "COURIER",
+ "MAIL"
+};
+
+int min = 0;
+int max = ccTypes.length -1;
+
+ccType = ccTypes[rand.nextInt((max - min) + 1) + min];
+
+max = shippingTypes.length-1;
+
+shipping = shippingTypes[rand.nextInt((max - min) + 1) + min];
+
+vars.put("RAND_CC_TYPE", ccType);
+vars.put("RAND_SHIPPING", shipping);</stringProp>
+ </BeanShellPreProcessor>
+ <hashTree/>
+ <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="[BeanShell PreProcessor] Random subject" enabled="true">
+ <stringProp name="filename"></stringProp>
+ <stringProp name="parameters"></stringProp>
+ <boolProp name="resetInterpreter">true</boolProp>
+ <stringProp name="script">import java.util.*;
+
+String[] subjects = {
+ "ARTS",
+ "BIOGRAPHIES",
+ "BUSINESS",
+ "CHILDREN",
+ "COMPUTERS",
+ "COOKING",
+ "HEALTH",
+ "HISTORY",
+ "HOME",
+ "HUMOR",
+ "LITERATURE",
+ "MYSTERY",
+ "NON-FICTION",
+ "PARENTING",
+ "POLITICS",
+ "REFERENCE",
+ "RELIGION",
+ "ROMANCE",
+ "SELF-HELP",
+ "SCIENCE-NATURE",
+ "SCIENCE-FICTION",
+ "SPORTS",
+ "YOUTH",
+ "TRAVEL"
+ };
+
+min = 0;
+max = subjects.length-1;
+
+Random rand = new Random();
+subject = subjects[rand.nextInt((max - min) + 1) + min];
+
+vars.put("RAND_SUBJECT", subject);</stringProp>
+ <stringProp name="TestPlan.comments">Random subject</stringProp>
+ </BeanShellPreProcessor>
+ <hashTree/>
+ <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="[BeanShell PreProcessor] Random searchField" enabled="true">
+ <boolProp name="resetInterpreter">false</boolProp>
+ <stringProp name="parameters"></stringProp>
+ <stringProp name="filename"></stringProp>
+ <stringProp name="script">import java.util.Random;
+
+Random rand = new Random();
+
+String[] searchFields = {
+ "author",
+ "title",
+ "subject"
+};
+
+min = 0;
+max = searchFields.length -1;
+
+searchField = searchFields[rand.nextInt((max - min) + 1) + min];
+
+vars.put("RAND_SEARCHFIELD", searchField);</stringProp>
+ </BeanShellPreProcessor>
+ <hashTree/>
+ <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="[BeanShell PreProcessor] Random new_price" enabled="true">
+ <boolProp name="resetInterpreter">false</boolProp>
+ <stringProp name="parameters"></stringProp>
+ <stringProp name="filename"></stringProp>
+ <stringProp name="script">import java.util.Random;
+
+Random rand = new Random();
+max = 300;
+min = 10;
+price = rand.nextInt((max - min) + 1) + min;
+
+vars.put("NEW_PRICE", Integer.toString(price));</stringProp>
+ </BeanShellPreProcessor>
+ <hashTree/>
+ <SwitchController guiclass="SwitchControllerGui" testclass="SwitchController" testname="Switch Controller" enabled="true">
+ <stringProp name="SwitchController.value">${SWITCH_ID}</stringProp>
+ </SwitchController>
+ <hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/home" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="SHOPPING_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${SHOPPING_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SHOPPING_ID</stringProp>
+ </elementProp>
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">true</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/product-detail" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/product-detail" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ <elementProp name="I_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${ITEM_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">I_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/product-detail</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/new-products" enabled="true"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/new-products" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="SUBJECT" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${RAND_SUBJECT}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SUBJECT</stringProp>
+ </elementProp>
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/new-products</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree>
+ <BeanShellPostProcessor guiclass="TestBeanGUI" testclass="BeanShellPostProcessor" testname="[BeanShell PostProcessor] get ITEM_ID" enabled="true">
+ <stringProp name="filename"></stringProp>
+ <stringProp name="parameters"></stringProp>
+ <boolProp name="resetInterpreter">false</boolProp>
+ <stringProp name="script">import java.util.regex;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.Random;
+import java.util.ArrayList;
+
+String testString = prev.getResponseDataAsString();
+
+String patternString = "product-detail(.+)\\?I_ID=([0-9]+)(.+)";
+Pattern pattern = Pattern.compile(patternString);
+Matcher matcher = pattern.matcher(testString);
+
+ArrayList ids = new ArrayList();
+
+while(matcher.find())
+{
+ ids.add(matcher.group(2));
+}
+
+Random rand = new Random();
+
+if( ids.size() > 0 )
+{
+ String itemId = String.valueOf(ids.get(rand.nextInt( ids.size() ) ) );
+ vars.put("ITEM_ID", itemId);
+}</stringProp>
+ </BeanShellPostProcessor>
+ <hashTree/>
+ </hashTree>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/buy" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/shopping-cart?I_ID=&QTY=1&ADD_FLAG=Y" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="I_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${ITEM_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">I_ID</stringProp>
+ </elementProp>
+ <elementProp name="QTY" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">1</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">QTY</stringProp>
+ </elementProp>
+ <elementProp name="ADD_FLAG" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">Y</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">ADD_FLAG</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/shopping-cart</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree>
+ <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor - SHOPPING_ID" enabled="true">
+ <stringProp name="RegexExtractor.useHeaders">false</stringProp>
+ <stringProp name="RegexExtractor.refname">SHOPPING_ID</stringProp>
+ <stringProp name="RegexExtractor.regex">SHOPPING_ID=([0-9]+)</stringProp>
+ <stringProp name="RegexExtractor.template">$1$</stringProp>
+ <stringProp name="RegexExtractor.default">0</stringProp>
+ <stringProp name="RegexExtractor.match_number">0</stringProp>
+ </RegexExtractor>
+ <hashTree/>
+ </hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/buy?RETURNING_FLAG=Y" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="RETURNING_FLAG" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">Y</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">RETURNING_FLAG</stringProp>
+ </elementProp>
+ <elementProp name="SHOPPING_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${SHOPPING_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SHOPPING_ID</stringProp>
+ </elementProp>
+ <elementProp name="username" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${__digSyl(${CUSTOMER_ID})}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">username</stringProp>
+ </elementProp>
+ <elementProp name="password" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${__digSyl(${CUSTOMER_ID})}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">password</stringProp>
+ </elementProp>
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/buy</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">false</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/buy-confirm" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/buy-confirm" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="street1" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value"></stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">street1</stringProp>
+ </elementProp>
+ <elementProp name="street2" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value"></stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">street2</stringProp>
+ </elementProp>
+ <elementProp name="city" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value"></stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">city</stringProp>
+ </elementProp>
+ <elementProp name="state" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value"></stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">state</stringProp>
+ </elementProp>
+ <elementProp name="zip" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value"></stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">zip</stringProp>
+ </elementProp>
+ <elementProp name="country" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value"></stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">country</stringProp>
+ </elementProp>
+ <elementProp name="CC_TYPE" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${RAND_CC_TYPE}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">CC_TYPE</stringProp>
+ </elementProp>
+ <elementProp name="CC_NAME" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${__RandomString(12,qwertyuiopasdfghjklzxcvbnm)}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">CC_NAME</stringProp>
+ </elementProp>
+ <elementProp name="CC_NUMBER" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">55555555</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">CC_NUMBER</stringProp>
+ </elementProp>
+ <elementProp name="CC_EXPIRY" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">04/01/2017</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">CC_EXPIRY</stringProp>
+ </elementProp>
+ <elementProp name="SHIPPING" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${RAND_SHIPPING}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SHIPPING</stringProp>
+ </elementProp>
+ <elementProp name="SHOPPING_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${SHOPPING_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SHOPPING_ID</stringProp>
+ </elementProp>
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/buy-confirm</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/payment" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="street1" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">true</boolProp>
+ <stringProp name="Argument.value">Izanska c. 233</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">street1</stringProp>
+ </elementProp>
+ <elementProp name="street2" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value"></stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">street2</stringProp>
+ </elementProp>
+ <elementProp name="city" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">Ljubljana</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">city</stringProp>
+ </elementProp>
+ <elementProp name="zip" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">1000</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">zip</stringProp>
+ </elementProp>
+ <elementProp name="country" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">Germany</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">country</stringProp>
+ </elementProp>
+ <elementProp name="CC_TYPE" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${RAND_CC_TYPE}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">CC_TYPE</stringProp>
+ </elementProp>
+ <elementProp name="CC_NAME" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">true</boolProp>
+ <stringProp name="Argument.value">Simon Ivansek</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">CC_NAME</stringProp>
+ </elementProp>
+ <elementProp name="CC_NUMBER" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">12345678</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">CC_NUMBER</stringProp>
+ </elementProp>
+ <elementProp name="CC_EXPIRY" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">true</boolProp>
+ <stringProp name="Argument.value">04/03/2014</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">CC_EXPIRY</stringProp>
+ </elementProp>
+ <elementProp name="SHIPPING" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${RAND_SHIPPING}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SHIPPING</stringProp>
+ </elementProp>
+ <elementProp name="SHOPPING_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${SHOPPING_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SHOPPING_ID</stringProp>
+ </elementProp>
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ <elementProp name="distribution" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">expo</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">distribution</stringProp>
+ </elementProp>
+ <elementProp name="attr1" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">5</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">attr1</stringProp>
+ </elementProp>
+ <elementProp name="attr3" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">2</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">attr3</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/payment</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/order-display" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/order-display" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="username" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${__digSyl(${CUSTOMER_ID})}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">username</stringProp>
+ </elementProp>
+ <elementProp name="password" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${__digSyl(${CUSTOMER_ID})}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">password</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port"></stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/order-display</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/admin-confirm" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/admin-confirm" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="I_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${ITEM_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">I_ID</stringProp>
+ </elementProp>
+ <elementProp name="new_price" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${NEW_PRICE}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">new_price</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/admin-confirm</stringProp>
+ <stringProp name="HTTPSampler.method">POST</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/admin" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/admin" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="I_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${ITEM_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">I_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/admin</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/order-inquiry" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/order-inquiry" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments"/>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/order-inquiry</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/customer-registration" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/customer-registration?SHOPPING_ID=" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="SHOPPING_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${SHOPPING_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SHOPPING_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/customer-registration</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/shopping-cart?ADD_FLAG=N" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/shopping-cart?ADD_FLAG=N" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="ADD_FLAG" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">N</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">ADD_FLAG</stringProp>
+ </elementProp>
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/shopping-cart</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree>
+ <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor - SHOPPING_ID" enabled="true">
+ <stringProp name="RegexExtractor.useHeaders">false</stringProp>
+ <stringProp name="RegexExtractor.refname">SHOPPING_ID</stringProp>
+ <stringProp name="RegexExtractor.regex">SHOPPING_ID=([0-9]+)</stringProp>
+ <stringProp name="RegexExtractor.template">$1$</stringProp>
+ <stringProp name="RegexExtractor.default">0</stringProp>
+ <stringProp name="RegexExtractor.match_number">0</stringProp>
+ <stringProp name="Sample.scope">all</stringProp>
+ <stringProp name="Scope.variable">${SHOPPING_ID}</stringProp>
+ </RegexExtractor>
+ <hashTree/>
+ </hashTree>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/best-sellers" enabled="true"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/best-sellers" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="SUBJECT" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${RAND_SUBJECT}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SUBJECT</stringProp>
+ </elementProp>
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/best-sellers</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree>
+ <BeanShellPostProcessor guiclass="TestBeanGUI" testclass="BeanShellPostProcessor" testname="[BeanShell PostProcessor] get ITEM_ID" enabled="true">
+ <stringProp name="filename"></stringProp>
+ <stringProp name="parameters"></stringProp>
+ <boolProp name="resetInterpreter">false</boolProp>
+ <stringProp name="script">import java.util.regex;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.Random;
+import java.util.ArrayList;
+
+String testString = prev.getResponseDataAsString();
+
+String patternString = "product-detail(.+)\\?I_ID=([0-9]+)(.+)";
+Pattern pattern = Pattern.compile(patternString);
+Matcher matcher = pattern.matcher(testString);
+
+ArrayList ids = new ArrayList();
+
+while(matcher.find())
+{
+ ids.add(matcher.group(2));
+}
+
+Random rand = new Random();
+
+if( ids.size() > 0 )
+{
+ String itemId = String.valueOf(ids.get(rand.nextInt( ids.size() ) ) );
+ vars.put("ITEM_ID", itemId);
+}</stringProp>
+ </BeanShellPostProcessor>
+ <hashTree/>
+ </hashTree>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="search( is SHOPPING_ID?)" enabled="true"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/search?searchField=&keyword=&C_ID=" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="searchField" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${RAND_SEARCHFIELD}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">searchField</stringProp>
+ </elementProp>
+ <elementProp name="keyword" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${__getRandomKeyword(${RAND_SEARCHFIELD}, ${NUM_ITEMS})}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">keyword</stringProp>
+ </elementProp>
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/search</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/search" enabled="true"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/search" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments"/>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/search</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">true</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ </hashTree>
+ </hashTree>
<ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="Summary Report" enabled="false">
<boolProp name="ResultCollector.error_logging">false</boolProp>
<objProp>
evaluation/JMeter/cloudscale-sustain.jmx 1236(+1235 -1)
diff --git a/evaluation/JMeter/cloudscale-sustain.jmx b/evaluation/JMeter/cloudscale-sustain.jmx
index be1a4e5..9b9fb2d 100644
--- a/evaluation/JMeter/cloudscale-sustain.jmx
+++ b/evaluation/JMeter/cloudscale-sustain.jmx
@@ -1544,7 +1544,7 @@ vars.put("RAND_SEARCH_STRING_LENGTH", Integer.toString(price));</strin
<boolProp name="exclude_checkbox_state">false</boolProp>
</kg.apc.jmeter.vizualizers.CorrectedResultCollector>
<hashTree/>
- <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
+ <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="false">
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
<boolProp name="LoopController.continue_forever">false</boolProp>
@@ -2879,6 +2879,1240 @@ vars.put("RAND_SEARCH_STRING_LENGTH", Integer.toString(price));</strin
</kg.apc.jmeter.vizualizers.CorrectedResultCollector>
<hashTree/>
</hashTree>
+ <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Workload forced to cache" enabled="true">
+ <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
+ <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
+ <boolProp name="LoopController.continue_forever">false</boolProp>
+ <stringProp name="LoopController.loops">100</stringProp>
+ </elementProp>
+ <stringProp name="ThreadGroup.num_threads">20</stringProp>
+ <stringProp name="ThreadGroup.ramp_time">1</stringProp>
+ <longProp name="ThreadGroup.start_time">1479978082000</longProp>
+ <longProp name="ThreadGroup.end_time">1479978082000</longProp>
+ <boolProp name="ThreadGroup.scheduler">false</boolProp>
+ <stringProp name="ThreadGroup.duration"></stringProp>
+ <stringProp name="ThreadGroup.delay"></stringProp>
+ </ThreadGroup>
+ <hashTree>
+ <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="[BeanShell PreProcessor] Tresholds" enabled="false">
+ <boolProp name="resetInterpreter">false</boolProp>
+ <stringProp name="parameters"></stringProp>
+ <stringProp name="filename"></stringProp>
+ <stringProp name="script">int ADMIN_CONFIRM = 0;
+int ADMIN_REQUEST = 1;
+int BEST_SELLERS = 2;
+int BUY_CONFIRM = 3;
+int BUY_REQUEST = 4;
+int CUSTOMER_REGISTRATION = 5;
+int HOME = 6;
+int NEW_PRODUCTS = 7;
+int ORDER_DISPLAY = 8;
+int ORDER_INQUIRY = 9;
+int PRODUCT_DETAIL = 10;
+int SEARCH_REQUEST = 11;
+int SEARCH_RESULTS = 12;
+int SHOPPING_CART = 13;
+
+/*
+ * See http://www.tpc.org/tpcw/spec/tpcw_v16.pdf page 94
+ */
+int[][] tresholdsMatrix = {
+ {0, 0, 0, 0, 0, 0, 9952, 0, 0, 0, 0, 9999, 0, 0},
+ {8999, 0, 0, 0, 0, 0, 9999, 0, 0, 0, 0, 0, 0, 0},
+ {0,0,0,0,0, 0, 167, 0,0,0, 472, 9927,0,9999},
+ {0,0,0,0,0, 0, 84, 0,0,0,0,9999,0,0},
+ {0,0,0,4614,0, 0, 6546, 0,0,0,0,0,0,9999},
+ {0,0,0,0,8666, 0, 8760, 0,0,0,0,9999,0,0},
+ {0,0,3124,0,0, 0, 0, 6249,0, 6718,0,7026,0,9999},
+ {0,0,0,0,0, 0, 156, 0,0,0,9735,9784,0,9999},
+ {0,0,0,0,0, 0, 69, 0,0,0,0,9999,0,0},
+ {0,0,0,0,0, 0, 72, 0,8872,0,0,9999,0,0},
+ {0,58,0,0,0, 0, 832, 0,0,0,1288,8603,0,9999},
+ {0,0,0,0,0, 0, 635, 0,0,0,0,0,9135,9999},
+ {0,0,0,0,0, 0, 2657, 0,0,0,9294,9304,0,9999},
+ {0,0,0,0,0, 2585, 9552, 0,0,0,0,0,0,9999},
+};
+
+int nextOperation(int currentOperation)
+{
+ int newOperation = -1;
+
+ Random rand = new Random();
+ int r = 1 + rand.nextInt(9999);
+
+ for( int i = 0; i < tresholdsMatrix[currentOperation].length; i++)
+ {
+ int t = tresholdsMatrix[currentOperation][i];
+ if( r <= t)
+ return i;
+ }
+
+ return newOperation;
+}
+
+previousOperation = vars.get("OPERATION");
+newOp = nextOperation(Integer.parseInt(previousOperation));
+vars.put("OPERATION", String.valueOf(newOp));</stringProp>
+ </BeanShellPreProcessor>
+ <hashTree/>
+ <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="[BeanShell PreProcessor] ITEM_ID" enabled="true">
+ <boolProp name="resetInterpreter">false</boolProp>
+ <stringProp name="parameters"></stringProp>
+ <stringProp name="filename"></stringProp>
+ <stringProp name="script">import java.util.Random;
+import java.util.ArrayList;
+
+prevTreshold = vars.get("TRESHOLD");
+prevSwitchId = vars.get("SWITCH_ID");
+numItems = Integer.parseInt(vars.get("NUM_ITEMS"));
+
+Random rand = new Random();
+item = 1 + rand.nextInt(numItems);
+vars.put("ITEM_ID", Integer.toString(item));
+
+treshold = 1+rand.nextInt(numItems);
+vars.put("TRESHOLD", Integer.toString(treshold));
+
+//System.out.println("Treshold1 = " + treshold);
+//System.out.println("ITEM_ID1 = " + item);
+</stringProp>
+ </BeanShellPreProcessor>
+ <hashTree/>
+ <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="[BeanShell PreProcessor] probability3" enabled="false">
+ <boolProp name="resetInterpreter">false</boolProp>
+ <stringProp name="parameters"></stringProp>
+ <stringProp name="filename"></stringProp>
+ <stringProp name="script">import org.apache.commons.math3.distribution.EnumeratedDistribution;
+import org.apache.commons.math3.util.Pair;
+import java.util.ArrayList;
+
+class Item
+{
+ String operation;
+ double probability;
+ int jmeterIndex;
+
+ public Item(String operation, double probability, int jmeterIndex)
+ {
+ this.operation = operation;
+ this.probability = probability;
+ this.jmeterIndex = jmeterIndex;
+ }
+}
+
+ArrayList items = new ArrayList(){{
+ add(new Item("Home", 29, 7));
+ add(new Item("New products", 11, 8));
+ add(new Item("Best Sellers", 11, 3));
+ add(new Item("Product Detail", 21, 11));
+ add(new Item("Search Request", 12, 12));
+ add(new Item("Search Results", 11, 13));
+ add(new Item("Shopping Cart", 1.25, 14));
+ add(new Item("Customer Registration", 0.82, 6));
+ add(new Item("Buy Request", 0.75, 5));
+ add(new Item("Buy Confirm", 0.69, 4));
+ add(new Item("Order Inquiry", 0.30, 10));
+ add(new Item("Order Display", 0.25, 9));
+ add(new Item("Admin Request", 0.10, 2));
+ add(new Item("Admin Confirm", 0.09, 1));
+}};
+
+ArrayList itemWeights = new ArrayList();
+for(Item i : items)
+{
+ itemWeights.add(new Pair(i, i.probability));
+}
+
+newOperation = new EnumeratedDistribution(itemWeights).sample();
+
+vars.put("SWITCH_ID", String.valueOf(newOperation.jmeterIndex));</stringProp>
+ </BeanShellPreProcessor>
+ <hashTree/>
+ <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="[BeanShell PreProcessor] probability2" enabled="true">
+ <boolProp name="resetInterpreter">false</boolProp>
+ <stringProp name="parameters"></stringProp>
+ <stringProp name="filename"></stringProp>
+ <stringProp name="script">import java.util.Random;
+
+Random rand = vars.getObject("RANDOM");
+if(rand == null)
+{
+ rand = new Random();
+ vars.putObject("RANDOM", rand);
+}
+
+int[] browsingMix = {
+ //2900, //home
+ //2100, // product-detail
+ 1100, // new-products
+ //75, //buy
+ //69, // buy-confirm
+ //25, // order-display
+ //9, // admin confirm
+ //10, // admin request
+ //30, // order-inquiry
+ //82, //customer-registration
+ //125, // shopping-cart
+ 1100, // best-sellers
+ 1100, // search-result
+ //1200, // search-request
+};
+
+int probSum = 0;
+
+for( int i=0; i < browsingMix.length; i++)
+{
+ probSum += browsingMix[i];
+}
+
+int[] range = new int[2 * browsingMix.length];
+
+for( int i=0; i < browsingMix.length; i++)
+{
+ int sum = 0;
+ for( int j=0; j<i; j++)
+ {
+ sum += browsingMix[j];
+ }
+
+ range[i] = sum;
+ range[i+1] = range[i] + browsingMix[i];
+}
+
+
+int randNum = rand.nextInt(probSum);
+
+for(int i=0; i < browsingMix.length; i++)
+{
+ if( randNum >= range[i] && randNum < range[i+1] )
+ {
+ vars.put("SWITCH_ID", String.valueOf(i));
+ return;
+ }
+}
+</stringProp>
+ </BeanShellPreProcessor>
+ <hashTree/>
+ <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="[BeanShell PreProcessor] buy-confirm" enabled="true">
+ <boolProp name="resetInterpreter">false</boolProp>
+ <stringProp name="parameters"></stringProp>
+ <stringProp name="filename"></stringProp>
+ <stringProp name="script">import java.util.Random;
+
+Random rand = new Random();
+
+String[] ccTypes = {
+ "Visa",
+ "MasterCard",
+ "Discover",
+ "Amex",
+ "Diners"
+};
+
+String[] shippingTypes = {
+ "AIR",
+ "UPS",
+ "FEDEX",
+ "SHIP",
+ "COURIER",
+ "MAIL"
+};
+
+int min = 0;
+int max = ccTypes.length -1;
+
+ccType = ccTypes[rand.nextInt((max - min) + 1) + min];
+
+max = shippingTypes.length-1;
+
+shipping = shippingTypes[rand.nextInt((max - min) + 1) + min];
+
+vars.put("RAND_CC_TYPE", ccType);
+vars.put("RAND_SHIPPING", shipping);</stringProp>
+ </BeanShellPreProcessor>
+ <hashTree/>
+ <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="[BeanShell PreProcessor] Random subject" enabled="true">
+ <stringProp name="filename"></stringProp>
+ <stringProp name="parameters"></stringProp>
+ <boolProp name="resetInterpreter">true</boolProp>
+ <stringProp name="script">import java.util.*;
+
+String[] subjects = {
+ "ARTS",
+ "BIOGRAPHIES",
+ "BUSINESS",
+ "CHILDREN",
+ "COMPUTERS",
+ "COOKING",
+ "HEALTH",
+ "HISTORY",
+ "HOME",
+ "HUMOR",
+ "LITERATURE",
+ "MYSTERY",
+ "NON-FICTION",
+ "PARENTING",
+ "POLITICS",
+ "REFERENCE",
+ "RELIGION",
+ "ROMANCE",
+ "SELF-HELP",
+ "SCIENCE-NATURE",
+ "SCIENCE-FICTION",
+ "SPORTS",
+ "YOUTH",
+ "TRAVEL"
+ };
+
+min = 0;
+max = subjects.length-1;
+
+Random rand = new Random();
+subject = subjects[rand.nextInt((max - min) + 1) + min];
+
+vars.put("RAND_SUBJECT", subject);</stringProp>
+ <stringProp name="TestPlan.comments">Random subject</stringProp>
+ </BeanShellPreProcessor>
+ <hashTree/>
+ <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="[BeanShell PreProcessor] Random searchField" enabled="true">
+ <boolProp name="resetInterpreter">false</boolProp>
+ <stringProp name="parameters"></stringProp>
+ <stringProp name="filename"></stringProp>
+ <stringProp name="script">import java.util.Random;
+
+Random rand = new Random();
+
+String[] searchFields = {
+ "author",
+ "title",
+ "subject"
+};
+
+min = 0;
+max = searchFields.length -1;
+
+searchField = searchFields[rand.nextInt((max - min) + 1) + min];
+
+vars.put("RAND_SEARCHFIELD", searchField);</stringProp>
+ </BeanShellPreProcessor>
+ <hashTree/>
+ <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="[BeanShell PreProcessor] Random new_price" enabled="true">
+ <boolProp name="resetInterpreter">false</boolProp>
+ <stringProp name="parameters"></stringProp>
+ <stringProp name="filename"></stringProp>
+ <stringProp name="script">import java.util.Random;
+
+Random rand = new Random();
+max = 300;
+min = 10;
+price = rand.nextInt((max - min) + 1) + min;
+
+vars.put("NEW_PRICE", Integer.toString(price));</stringProp>
+ </BeanShellPreProcessor>
+ <hashTree/>
+ <SwitchController guiclass="SwitchControllerGui" testclass="SwitchController" testname="Switch Controller" enabled="true">
+ <stringProp name="SwitchController.value">${SWITCH_ID}</stringProp>
+ </SwitchController>
+ <hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/home" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="SHOPPING_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${SHOPPING_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SHOPPING_ID</stringProp>
+ </elementProp>
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">true</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree>
+ <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
+ <collectionProp name="Asserion.test_strings"/>
+ <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
+ <boolProp name="Assertion.assume_success">true</boolProp>
+ <intProp name="Assertion.test_type">16</intProp>
+ <stringProp name="Assertion.scope">all</stringProp>
+ </ResponseAssertion>
+ <hashTree/>
+ </hashTree>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/product-detail" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/product-detail" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ <elementProp name="I_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${ITEM_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">I_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/product-detail</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/new-products" enabled="true"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/new-products" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="SUBJECT" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${RAND_SUBJECT}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SUBJECT</stringProp>
+ </elementProp>
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/new-products</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/buy" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/shopping-cart?I_ID=&QTY=1&ADD_FLAG=Y" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="I_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${ITEM_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">I_ID</stringProp>
+ </elementProp>
+ <elementProp name="QTY" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">1</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">QTY</stringProp>
+ </elementProp>
+ <elementProp name="ADD_FLAG" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">Y</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">ADD_FLAG</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/shopping-cart</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree>
+ <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor - SHOPPING_ID" enabled="true">
+ <stringProp name="RegexExtractor.useHeaders">false</stringProp>
+ <stringProp name="RegexExtractor.refname">SHOPPING_ID</stringProp>
+ <stringProp name="RegexExtractor.regex">SHOPPING_ID=([0-9]+)</stringProp>
+ <stringProp name="RegexExtractor.template">$1$</stringProp>
+ <stringProp name="RegexExtractor.default">0</stringProp>
+ <stringProp name="RegexExtractor.match_number">0</stringProp>
+ </RegexExtractor>
+ <hashTree/>
+ </hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/buy?RETURNING_FLAG=Y" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="RETURNING_FLAG" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">Y</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">RETURNING_FLAG</stringProp>
+ </elementProp>
+ <elementProp name="SHOPPING_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${SHOPPING_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SHOPPING_ID</stringProp>
+ </elementProp>
+ <elementProp name="username" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${__digSyl(${CUSTOMER_ID})}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">username</stringProp>
+ </elementProp>
+ <elementProp name="password" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${__digSyl(${CUSTOMER_ID})}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">password</stringProp>
+ </elementProp>
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/buy</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">false</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/buy-confirm" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/buy-confirm" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="street1" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value"></stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">street1</stringProp>
+ </elementProp>
+ <elementProp name="street2" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value"></stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">street2</stringProp>
+ </elementProp>
+ <elementProp name="city" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value"></stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">city</stringProp>
+ </elementProp>
+ <elementProp name="state" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value"></stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">state</stringProp>
+ </elementProp>
+ <elementProp name="zip" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value"></stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">zip</stringProp>
+ </elementProp>
+ <elementProp name="country" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value"></stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">country</stringProp>
+ </elementProp>
+ <elementProp name="CC_TYPE" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${RAND_CC_TYPE}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">CC_TYPE</stringProp>
+ </elementProp>
+ <elementProp name="CC_NAME" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${__RandomString(12,qwertyuiopasdfghjklzxcvbnm)}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">CC_NAME</stringProp>
+ </elementProp>
+ <elementProp name="CC_NUMBER" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">55555555</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">CC_NUMBER</stringProp>
+ </elementProp>
+ <elementProp name="CC_EXPIRY" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">04/01/2017</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">CC_EXPIRY</stringProp>
+ </elementProp>
+ <elementProp name="SHIPPING" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${RAND_SHIPPING}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SHIPPING</stringProp>
+ </elementProp>
+ <elementProp name="SHOPPING_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${SHOPPING_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SHOPPING_ID</stringProp>
+ </elementProp>
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/buy-confirm</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/payment" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="street1" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">true</boolProp>
+ <stringProp name="Argument.value">Izanska c. 233</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">street1</stringProp>
+ </elementProp>
+ <elementProp name="street2" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value"></stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">street2</stringProp>
+ </elementProp>
+ <elementProp name="city" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">Ljubljana</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">city</stringProp>
+ </elementProp>
+ <elementProp name="zip" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">1000</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">zip</stringProp>
+ </elementProp>
+ <elementProp name="country" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">Germany</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">country</stringProp>
+ </elementProp>
+ <elementProp name="CC_TYPE" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${RAND_CC_TYPE}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">CC_TYPE</stringProp>
+ </elementProp>
+ <elementProp name="CC_NAME" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">true</boolProp>
+ <stringProp name="Argument.value">Simon Ivansek</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">CC_NAME</stringProp>
+ </elementProp>
+ <elementProp name="CC_NUMBER" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">12345678</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">CC_NUMBER</stringProp>
+ </elementProp>
+ <elementProp name="CC_EXPIRY" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">true</boolProp>
+ <stringProp name="Argument.value">04/03/2014</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">CC_EXPIRY</stringProp>
+ </elementProp>
+ <elementProp name="SHIPPING" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${RAND_SHIPPING}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SHIPPING</stringProp>
+ </elementProp>
+ <elementProp name="SHOPPING_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${SHOPPING_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SHOPPING_ID</stringProp>
+ </elementProp>
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ <elementProp name="distribution" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">expo</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">distribution</stringProp>
+ </elementProp>
+ <elementProp name="attr1" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">5</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">attr1</stringProp>
+ </elementProp>
+ <elementProp name="attr3" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">2</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">attr3</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/payment</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/order-display" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/order-display" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="username" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${__digSyl(${CUSTOMER_ID})}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">username</stringProp>
+ </elementProp>
+ <elementProp name="password" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${__digSyl(${CUSTOMER_ID})}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">password</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port"></stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/order-display</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/admin-confirm" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/admin-confirm" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="I_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${ITEM_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">I_ID</stringProp>
+ </elementProp>
+ <elementProp name="new_price" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${NEW_PRICE}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">new_price</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/admin-confirm</stringProp>
+ <stringProp name="HTTPSampler.method">POST</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/admin" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/admin" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="I_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${ITEM_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">I_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/admin</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/order-inquiry" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/order-inquiry" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments"/>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/order-inquiry</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/customer-registration" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/customer-registration?SHOPPING_ID=" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="SHOPPING_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${SHOPPING_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SHOPPING_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/customer-registration</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/shopping-cart?ADD_FLAG=N" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/shopping-cart?ADD_FLAG=N" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="ADD_FLAG" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">N</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">ADD_FLAG</stringProp>
+ </elementProp>
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/shopping-cart</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree>
+ <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor - SHOPPING_ID" enabled="true">
+ <stringProp name="RegexExtractor.useHeaders">false</stringProp>
+ <stringProp name="RegexExtractor.refname">SHOPPING_ID</stringProp>
+ <stringProp name="RegexExtractor.regex">SHOPPING_ID=([0-9]+)</stringProp>
+ <stringProp name="RegexExtractor.template">$1$</stringProp>
+ <stringProp name="RegexExtractor.default">0</stringProp>
+ <stringProp name="RegexExtractor.match_number">0</stringProp>
+ <stringProp name="Sample.scope">all</stringProp>
+ <stringProp name="Scope.variable">${SHOPPING_ID}</stringProp>
+ </RegexExtractor>
+ <hashTree/>
+ </hashTree>
+ <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
+ <stringProp name="ConstantTimer.delay">7000</stringProp>
+ </ConstantTimer>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/best-sellers" enabled="true"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/best-sellers" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="SUBJECT" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${RAND_SUBJECT}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">SUBJECT</stringProp>
+ </elementProp>
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/best-sellers</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="search( is SHOPPING_ID?)" enabled="true"/>
+ <hashTree>
+ <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="[BeanShell PreProcessor] Random new_price" enabled="true">
+ <boolProp name="resetInterpreter">false</boolProp>
+ <stringProp name="parameters"></stringProp>
+ <stringProp name="filename"></stringProp>
+ <stringProp name="script">import java.util.Random;
+
+Random rand = new Random();
+max = 10;
+min = 3;
+price = rand.nextInt((max - min) + 1) + min;
+
+vars.put("RAND_SEARCH_STRING_LENGTH", Integer.toString(price));</stringProp>
+ </BeanShellPreProcessor>
+ <hashTree/>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/search?searchField=&keyword=&C_ID=" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments">
+ <elementProp name="searchField" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${RAND_SEARCHFIELD}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">searchField</stringProp>
+ </elementProp>
+ <elementProp name="keyword" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${__RandomString(${RAND_SEARCH_STRING_LENGTH},abcdefghijklmnopqrstuvwxyz,)}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">keyword</stringProp>
+ </elementProp>
+ <elementProp name="C_ID" elementType="HTTPArgument">
+ <boolProp name="HTTPArgument.always_encode">false</boolProp>
+ <stringProp name="Argument.value">${CUSTOMER_ID}</stringProp>
+ <stringProp name="Argument.metadata">=</stringProp>
+ <boolProp name="HTTPArgument.use_equals">true</boolProp>
+ <stringProp name="Argument.name">C_ID</stringProp>
+ </elementProp>
+ </collectionProp>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/search</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">false</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ </hashTree>
+ <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="/search" enabled="false"/>
+ <hashTree>
+ <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/search" enabled="true">
+ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
+ <collectionProp name="Arguments.arguments"/>
+ </elementProp>
+ <stringProp name="HTTPSampler.domain">${HOST}</stringProp>
+ <stringProp name="HTTPSampler.port">${PORT}</stringProp>
+ <stringProp name="HTTPSampler.connect_timeout"></stringProp>
+ <stringProp name="HTTPSampler.response_timeout"></stringProp>
+ <stringProp name="HTTPSampler.protocol"></stringProp>
+ <stringProp name="HTTPSampler.contentEncoding"></stringProp>
+ <stringProp name="HTTPSampler.path">${SHOWCASE}/search</stringProp>
+ <stringProp name="HTTPSampler.method">GET</stringProp>
+ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
+ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
+ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
+ <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
+ <boolProp name="HTTPSampler.image_parser">true</boolProp>
+ <boolProp name="HTTPSampler.monitor">true</boolProp>
+ <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
+ </HTTPSamplerProxy>
+ <hashTree/>
+ </hashTree>
+ </hashTree>
+ <kg.apc.jmeter.vizualizers.CorrectedResultCollector guiclass="kg.apc.jmeter.vizualizers.SynthesisReportGui" testclass="kg.apc.jmeter.vizualizers.CorrectedResultCollector" testname="jp@gc - Synthesis Report (filtered)" enabled="true">
+ <boolProp name="ResultCollector.error_logging">false</boolProp>
+ <objProp>
+ <name>saveConfig</name>
+ <value class="SampleSaveConfiguration">
+ <time>false</time>
+ <latency>false</latency>
+ <timestamp>true</timestamp>
+ <success>false</success>
+ <label>false</label>
+ <code>false</code>
+ <message>false</message>
+ <threadName>false</threadName>
+ <dataType>false</dataType>
+ <encoding>false</encoding>
+ <assertions>false</assertions>
+ <subresults>false</subresults>
+ <responseData>false</responseData>
+ <samplerData>false</samplerData>
+ <xml>false</xml>
+ <fieldNames>true</fieldNames>
+ <responseHeaders>false</responseHeaders>
+ <requestHeaders>false</requestHeaders>
+ <responseDataOnError>false</responseDataOnError>
+ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
+ <assertionsResultsToSave>0</assertionsResultsToSave>
+ </value>
+ </objProp>
+ <stringProp name="filename">/home/jhonnymertz/Desktop/report.csv</stringProp>
+ <longProp name="interval_grouping">500</longProp>
+ <boolProp name="graph_aggregated">false</boolProp>
+ <stringProp name="include_sample_labels"></stringProp>
+ <stringProp name="exclude_sample_labels"></stringProp>
+ <stringProp name="start_offset"></stringProp>
+ <stringProp name="end_offset"></stringProp>
+ <boolProp name="include_checkbox_state">false</boolProp>
+ <boolProp name="exclude_checkbox_state">false</boolProp>
+ </kg.apc.jmeter.vizualizers.CorrectedResultCollector>
+ <hashTree/>
+ </hashTree>
</hashTree>
</hashTree>
</jmeterTestPlan>
evaluation/JMeter/Shopizer.jmx 6(+3 -3)
diff --git a/evaluation/JMeter/Shopizer.jmx b/evaluation/JMeter/Shopizer.jmx
index 5c6040f..e7e8343 100644
--- a/evaluation/JMeter/Shopizer.jmx
+++ b/evaluation/JMeter/Shopizer.jmx
@@ -6027,9 +6027,9 @@ vars.put("PRODUCT_ID",Integer.toString(id));</stringProp>
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Contr�leur Boucle" enabled="true">
<boolProp name="LoopController.continue_forever">false</boolProp>
- <stringProp name="LoopController.loops">1000</stringProp>
+ <stringProp name="LoopController.loops">500</stringProp>
</elementProp>
- <stringProp name="ThreadGroup.num_threads">50</stringProp>
+ <stringProp name="ThreadGroup.num_threads">1</stringProp>
<stringProp name="ThreadGroup.ramp_time">1</stringProp>
<longProp name="ThreadGroup.start_time">1361531541000</longProp>
<longProp name="ThreadGroup.end_time">1361531541000</longProp>
@@ -9510,7 +9510,7 @@ vars.put("PRODUCT_ID",Integer.toString(id));</stringProp>
</GaussianRandomTimer>
<hashTree/>
</hashTree>
- <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
+ <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="false">
<boolProp name="ResultCollector.error_logging">false</boolProp>
<objProp>
<name>saveConfig</name>
experiments.sh 42(+27 -15)
diff --git a/experiments.sh b/experiments.sh
index 6b88bf0..8aa85bc 100755
--- a/experiments.sh
+++ b/experiments.sh
@@ -4,22 +4,22 @@
#mongod &
#sudo service mysql start
-applicationfolder="/home/jhonnymertz/workspace/adaptive-caching-framework/evaluation/Applications/"
+applicationfolder="~/workspace/adaptive-caching-framework/evaluation/Applications/"
#configs=("NO" "DEV" "AP")
configs=("NO")
-workloadfolder="/home/jhonnymertz/workspace/adaptive-caching-framework/evaluation/JMeter/"
-jmeter="/home/jhonnymertz/dev/apache-jmeter-3.0/bin/jmeter.sh"
+workloadfolder="~/workspace/adaptive-caching-framework/evaluation/JMeter/"
+jmeter="~/dev/apache-jmeter-3.0/bin/jmeter"
## take care of the order
#applications=("CloudStore" "shopizer/sm-shop" "spring-petclinic")
#databases=("CloudStore" "shopizer/sm-shop" "spring-petclinic")
#workloads=("cloudscale-sustain.jmx" "Shopizer.jmx" "petclinic_test_plan.jmx")
-applications=("spring-petclinic")
-databases=("petclinic")
-workloads=("petclinic_test_plan.jmx")
+applications=("CloudStore")
+#databases=("petclinic")
+workloads=("cloudscale-sustain.jmx")
-numberOfExecutions=10
+numberOfExecutions=1
for (( i=1; i <= $numberOfExecutions; ++i ))
do
## now loop through the above array
@@ -27,32 +27,44 @@ do
do
for iapp in "${!applications[@]}"
do
- echo "Processing ${applications[$iapp]}-$config..."
+ echo "Processing execution $i of ${applications[$iapp]}-$config"
+ echo "Killing any process up into port 8080..."
+ fuser -k 8080/tcp1
+ echo "Killing any process up into port 8080... done"
## setup database (clean, create, populate)
##todo run database config as a script
- echo "drop database ${databases[$iapp]}" | mysql -u "root" "-proot"
- echo "create database ${databases[$iapp]}" | mysql -u "root" "-proot"
+ #echo "drop database ${databases[$iapp]}" | mysql -u "root" "-proot"
+ #echo "create database ${databases[$iapp]}" | mysql -u "root" "-proot"
## enter the folder
echo "Entering into $applicationfolder$config/${applications[$iapp]}..."
cd "$applicationfolder$config/${applications[$iapp]}"
## compile and run web server
- mvn clean install tomcat7:run-war -DskipTests & mvnpid=$!
+ echo "Running tomcat..."
+ mvn clean install tomcat7:run-war -DskipTests -q & mvnpid=$!
+ echo "Running tomcat... done"
## wait for maven to compile and tomcat to run
- sleep 1m
+ echo "Waiting until tomcat is up..."
+ sleep 10s
+ echo "Waiting until tomcat is up... done"
## run jmeter
+ echo "Running jmeter..."
sh $jmeter -n -t $workloadfolder${workloads[$iapp]}
+ echo "Running jmeter... done"
## copy jmeter results
- mv /home/jhonnymertz/Desktop/report.csv /home/jhonnymertz/Desktop/${applications[$iapp]}-$config-$i.csv
+ echo "Copying and renaming results of execution $i of ${applications[$iapp]}-$config..."
+ mv ~/Desktop/report.csv ~/Desktop/${applications[$iapp]}-$config-$i.csv
+ echo "Copying and renaming results of execution $i of ${applications[$iapp]}-$config... done"
## kill maven after all
kill -9 $mvnpid
-
done
done
-done
\ No newline at end of file
+done
+
+#TRP: (N-samples/(timestamp_fim-timestap_ini))*1000
framework/autonomicmanager/pom.xml 2(+1 -1)
diff --git a/framework/autonomicmanager/pom.xml b/framework/autonomicmanager/pom.xml
index a9913fa..7f56f08 100644
--- a/framework/autonomicmanager/pom.xml
+++ b/framework/autonomicmanager/pom.xml
@@ -6,7 +6,7 @@
<groupId>br.ufrgs.inf.prosoft.adaptivecaching</groupId>
<artifactId>autonomicmanager</artifactId>
- <version>0.4.0-SNAPSHOT</version>
+ <version>0.5.0-SNAPSHOT</version>
<properties>
<aspectj.version>1.8.10</aspectj.version>
framework/autonomicmanager/README.md 6(+3 -3)
diff --git a/framework/autonomicmanager/README.md b/framework/autonomicmanager/README.md
index 3809956..2f83648 100644
--- a/framework/autonomicmanager/README.md
+++ b/framework/autonomicmanager/README.md
@@ -23,8 +23,8 @@ Required Tools
- Java 8
###### Optional
-- To store application traces: MongoDB or Redis
-- To cache data: Redis or Memcached
+- To store application traces: MongoDB or Redis or In-memory
+- To cache data: Redis or Memcached or In-memory
Build and Dependency
--------------------
@@ -37,7 +37,7 @@ If your project is maven-based, in your `pom.xml`:
<dependency>
<groupId>br.ufrgs.inf.prosoft.adaptivecaching</groupId>
<artifactId>autonomicmanager</artifactId>
- <version>0.4.0-SNAPSHOT</version>
+ <version>0.5.0-SNAPSHOT</version>
</dependency>
</dependencies>
```
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/Analyzer.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/Analyzer.java
index bc05fe2..ce1af06 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/Analyzer.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/Analyzer.java
@@ -26,6 +26,7 @@ import org.slf4j.LoggerFactory;
import java.lang.annotation.Annotation;
import java.util.List;
import java.util.Set;
+import java.util.stream.Collectors;
public class Analyzer implements Runnable {
@@ -48,6 +49,82 @@ public class Analyzer implements Runnable {
this.adaptiveConfig = adaptiveConfig;
}
+ @Override
+ public void run() {
+
+ if (!TracerAspect.analyzerEnabled) {
+ logger.info("Analyzer disabled, not running...");
+ return;
+ }
+
+ List all = dataSource.findAll();
+
+// if(all.size() < 300)
+// return;
+
+ Set<MethodEntry> process = analyzeAndReturn(all);
+
+ //if there is a repository to save cacheable values
+ if (dataTarget != null) {
+ dataTarget.removeAll();
+ process.forEach(dataTarget::save);
+ }
+
+ //todo maybe clean the cache here?
+ TracerAspect.cacheableMethods = process;
+ TracerAspect.cacheableMethodKeys = process.stream().map(MethodEntry::getMethodInfoKey).collect(Collectors.toSet());
+
+// TracerAspect.cacheableMethodKeys = new HashSet<>();
+// for (MethodEntry me : process){
+// TracerAspect.cacheableMethodKeys.add(me.getMethodInfoKey());
+// }
+
+ String methods = "";
+ for (MethodEntry me : process) methods = methods.concat(me.getMethodInfo().getSignature() + ",");
+
+ //TODO maybe after the analysis end, new data would be already registered, which should not be deleted
+ if (adaptiveConfig.modelling().equals(Modelling.FULLEXPLORATION)) {
+ dataSource.removeAll();
+ logger.info("Old monitoring data deleted.");
+ }
+
+ if (adaptiveConfig.analyzeOnce())
+ TracerAspect.analyzerEnabled = false;
+ }
+
+
+ public Set<MethodEntry> analyzeAndReturn(List<LogTrace> logList) {
+ logger.info("Starting the analysis of cacheable methods from logs: " + logList.size() + " loaded.");
+ //TODO trigger by number of logs
+// if(logList.size() < 500000)
+// return;
+
+ CacheabilityPatternDecider decider = new CacheabilityPatternDecider(logList.size());
+ FlowchartWorkFlow workflow = new FlowchartWorkFlow(decider, cacheInfo, logList);
+ Set<MethodEntry> process = workflow.filterCacheableMethods(adaptiveConfig.expiryInterval());
+ logger.info(process.size() + " cacheable methods identified.");
+
+
+
+// //TODO find by annotations @Ignore and remove the methods marked
+//
+// // for (MethodInfo method : cacheableStats.getMethodsInfoMap().keySet()) {
+//// if(cacheableStats.getMethodsInfoMap().get(method).hitRatio() > 10)
+//// System.out.println(method.getSignature() + ": " + cacheableStats.getMethodsInfoMap().get(method).hitRatio());
+//// }
+
+
+// //TODO if disable monitoring, should not schedule future analysis
+ if (adaptiveConfig.disableMonitoringAfterAnalysis()) {
+ TracerAspect.tracerEnabled = false;
+ logger.info("Adaptive caching monitoring disabled since the model was built.");
+ }
+ return process;
+ }
+
+
+
+ //used to test
public static void main(String[] args) {
//TODO db according to properties file...
MongoClient mongo = new MongoClient("localhost", 27017);
@@ -173,68 +250,4 @@ public class Analyzer implements Runnable {
//TODO trigger by time?
analyzer.run();
}
-
- @Override
- public void run() {
-
- if (!TracerAspect.analyzerEnabled) {
- logger.info("Analyzer disabled, not running...");
- return;
- }
-
- List all = dataSource.findAll();
-
-// if(all.size() < 300)
-// return;
-
- Set<MethodEntry> process = analyzeAndReturn(all);
-
- if (dataTarget != null) {
- dataTarget.removeAll();
- process.forEach(dataTarget::save);
- }
-
- //todo maybe clean the cache here?
- TracerAspect.cacheableMethods = process;
-
- String methods = "";
- for (MethodEntry me : process) methods = methods.concat(me.getMethodInfo().getSignature() + ",");
-
- //TODO maybe after the analysis end, new data would be already registered, which should not be deleted
- if (adaptiveConfig.modelling().equals(Modelling.FULLEXPLORATION)) {
- dataSource.removeAll();
- logger.info("Old monitoring data deleted.");
- }
-
- if (adaptiveConfig.analyzeOnce())
- TracerAspect.analyzerEnabled = false;
- }
-
-
- public Set<MethodEntry> analyzeAndReturn(List<LogTrace> logList) {
- logger.info("Starting the analysis of cacheable methods from logs: " + logList.size() + " loaded.");
- //TODO trigger by number of logs
-// if(logList.size() < 500000)
-// return;
-
- CacheabilityPatternDecider decider = new CacheabilityPatternDecider(logList.size());
- FlowchartWorkFlow workflow = new FlowchartWorkFlow(decider, cacheInfo, logList);
- Set<MethodEntry> process = workflow.filterCacheableMethods(adaptiveConfig.expiryInterval());
- logger.info(process.size() + " cacheable methods identified.");
-
-// //TODO find by annotations @Ignore and remove the methods marked
-//
-// // for (MethodInfo method : cacheableStats.getMethodsInfoMap().keySet()) {
-//// if(cacheableStats.getMethodsInfoMap().get(method).hitRatio() > 10)
-//// System.out.println(method.getSignature() + ": " + cacheableStats.getMethodsInfoMap().get(method).hitRatio());
-//// }
-
-
-// //TODO if disable monitoring, should not schedule future analysis
- if (adaptiveConfig.disableMonitoringAfterAnalysis()) {
- TracerAspect.tracerEnabled = false;
- logger.info("Adaptive caching monitoring disabled since the model was built.");
- }
- return process;
- }
}
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/model/MethodEntry.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/model/MethodEntry.java
index 3ce0440..6e42ed9 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/model/MethodEntry.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/model/MethodEntry.java
@@ -22,6 +22,10 @@ public class MethodEntry {
return methodInfo;
}
+ public Object getMethodInfoKey() {
+ return methodInfo.getKey();
+ }
+
public MethodStats getMethodStats() {
return methodStats;
}
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/cacher/key/generic/SimpleKey.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/cacher/key/generic/SimpleKey.java
index 5f53eba..be0f7e8 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/cacher/key/generic/SimpleKey.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/cacher/key/generic/SimpleKey.java
@@ -23,10 +23,9 @@ import java.io.Serializable;
import java.util.Arrays;
/**
- * A simple key as returned from the {@link SimpleKeyGenerator}.
+ * A simple key as returned from the {@link ParamsBasedKeyGenerator}.
*
- * @author Phillip Webb
- * @see SimpleKeyGenerator
+ * @see ParamsBasedKeyGenerator
* @since 4.0
*/
@SuppressWarnings("serial")
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/cacher/key/Key.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/cacher/key/Key.java
index c73bafd..9968d91 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/cacher/key/Key.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/cacher/key/Key.java
@@ -91,9 +91,20 @@ public class Key {
return tgt;
}
+// @Override
+// public final String toString() {
+// return Mnemos.toText(this.method, this.arguments, true, false);
+// }
+
@Override
- public final String toString() {
- return Mnemos.toText(this.method, this.arguments, true, false);
+ public String toString() {
+ return "Key{" +
+ "start=" + start +
+ ", accessed=" + accessed +
+ ", method=" + method +
+ ", target=" + target +
+ ", arguments=" + Arrays.toString(arguments) +
+ '}';
}
@Override
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/model/support/SimpleCacheManager.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/model/support/SimpleCacheManager.java
index af4f78d..0780462 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/model/support/SimpleCacheManager.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/model/support/SimpleCacheManager.java
@@ -16,8 +16,8 @@
package br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.model.support;
+import br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.extensions.AbstractCacheManager;
import br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.model.Cache;
-import br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.util.support.AbstractCacheManager;
import java.util.Collection;
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/util/CacheManagerFactory.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/util/CacheManagerFactory.java
index 22dea02..a8009cd 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/util/CacheManagerFactory.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/util/CacheManagerFactory.java
@@ -18,7 +18,7 @@ import java.lang.management.ManagementFactory;
public class CacheManagerFactory {
static Logger logger = LoggerFactory.getLogger(CacheManagerFactory.class);
- public static CacheManager getCacheManager(CacheProviderType cacheProviderType) {
+ public static CacheManager getCacheManager(CacheProviderType cacheProviderType, long expiryInterval) {
switch (cacheProviderType) {
case GUAVA:
logger.debug("Cache provider is configured to Guava.");
@@ -51,8 +51,9 @@ public class CacheManagerFactory {
net.sf.ehcache.Cache adaptiveCache = new net.sf.ehcache.Cache(
new CacheConfiguration("adaptivecaching", 10000)
.memoryStoreEvictionPolicy(MemoryStoreEvictionPolicy.LRU)
- .eternal(true)
+ //.eternal(true)
.overflowToOffHeap(false)
+ .timeToLiveSeconds(expiryInterval)
.persistence(new PersistenceConfiguration().strategy(PersistenceConfiguration.Strategy.NONE)));
cm.addCache(adaptiveCache);
return new EhCacheCacheManager(cm);
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/configuration/annotation/AdaptiveCaching.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/configuration/annotation/AdaptiveCaching.java
index d76b790..186428d 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/configuration/annotation/AdaptiveCaching.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/configuration/annotation/AdaptiveCaching.java
@@ -23,16 +23,16 @@ public @interface AdaptiveCaching {
Modelling modelling() default Modelling.ACCUMULATION;
- long expiryInterval() default 5; //in minutes
- long firstExpiry() default 6; //in minutes
+ long expiryInterval() default 300000; //5 minutes
+ long firstExpiry() default 300000; //5 minutes
//todo when analysis based on trigger do not make sense to have this, its similar to trigger by time
- @Deprecated long analysisInterval() default 5; //in minutes
- @Deprecated long firstAnalysis() default 2; //in minutes
+ @Deprecated long analysisInterval() default 300000; //5 minutes
+ @Deprecated long firstAnalysis() default 120000; //2 minutes
TriggerType triggerType() default TriggerType.TIME; //if were not by time, load the class that implements the interface @Trigger
- long triggerTime() default 5; //in minutes
+ long triggerTime() default 300000; //in minutes
//enables the analyzer to be executed just once
boolean analyzeOnce() default false;
@@ -40,6 +40,9 @@ public @interface AdaptiveCaching {
//disable the monitoring after the first analyses
boolean disableMonitoringAfterAnalysis() default false;
+ /**
+ * @deprecated async use may consume too much memory and cause stack overflow
+ */
@Deprecated boolean traceAsync() default true;
boolean clearMonitoringDataOnStart() default false;
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/aspects/TracerAspect.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/aspects/TracerAspect.java
index 3023e29..877c53b 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/aspects/TracerAspect.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/aspects/TracerAspect.java
@@ -2,13 +2,12 @@ package br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.aspects;
import br.ufrgs.inf.prosoft.adaptivecaching.analysis.Analyzer;
import br.ufrgs.inf.prosoft.adaptivecaching.analysis.decision.flowchart.model.MethodEntry;
-import br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.util.CacheManagerFactory;
import br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.cacher.key.Key;
import br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.model.Cache;
import br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.model.CacheManager;
import br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.model.ValueWrapper;
+import br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.util.CacheManagerFactory;
import br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.util.threads.NamedThreads;
-import br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.util.threads.VerboseRunnable;
import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.AdaptiveCaching;
import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.ComponentScan;
import br.ufrgs.inf.prosoft.adaptivecaching.exceptions.CacheProviderException;
@@ -56,8 +55,12 @@ import static java.lang.System.currentTimeMillis;
@Aspect
public class TracerAspect {
- public static Set<MethodEntry> cacheableMethods;
- public static List<String> methodBlackList;
+ //used in case the method info is required
+ public static Set<MethodEntry> cacheableMethods = new HashSet<>();
+ //used in case the method info is not required
+ public static Set<Object> cacheableMethodKeys = new HashSet<>();
+
+ public static List<String> methodBlackList = new ArrayList<>();
/**
* Enable and disable tracer
*/
@@ -181,7 +184,7 @@ public class TracerAspect {
} else tracerEnabled = false;
- this.cacheManager = CacheManagerFactory.getCacheManager(cachingConfig.cacheProvider());
+ this.cacheManager = CacheManagerFactory.getCacheManager(cachingConfig.cacheProvider(), cachingConfig.expiryInterval());
this.cache = cacheManager.getCache("adaptivecaching");
this.cacheMonitor = CacheMonitorFactory.getCacheMonitor(this.cache, cachingConfig.cacheProvider());
@@ -194,14 +197,15 @@ public class TracerAspect {
//maybe we should kill it or delete the object?
analyzerExecutor.scheduleWithFixedDelay(
new Analyzer(repository, cacheMonitor.getCacheInfo(), cachingConfig),
- cachingConfig.firstAnalysis(), cachingConfig.analysisInterval(), TimeUnit.MINUTES);
+ cachingConfig.firstAnalysis(), cachingConfig.analysisInterval(), TimeUnit.MILLISECONDS);
}
//TODO trigger by time
- this.expirationExecutor.scheduleWithFixedDelay(
- new VerboseRunnable(() -> TracerAspect.this.clean()),
- cachingConfig.firstExpiry(), cachingConfig.expiryInterval(), TimeUnit.MINUTES
- );
+ //TODO in some cases (Ehcache) it is better to set a timetolive directcly on cache provider
+// this.expirationExecutor.scheduleWithFixedDelay(
+// new VerboseRunnable(() -> TracerAspect.this.clean()),
+// cachingConfig.firstExpiry(), cachingConfig.expiryInterval(), TimeUnit.MILLISECONDS
+// );
// if (adaptiveConfig.analyzerEnabled()) {
// this.loaderExecutor.scheduleWithFixedDelay(
@@ -231,39 +235,53 @@ public class TracerAspect {
}
}
-
@Around("anyCall()")
public Object aroundMethods(ProceedingJoinPoint joinPoint) throws Throwable {
//see if a method is being caught
//traceSpecificMethod(joinPoint);
- if (tracerEnabled) {
+ if(!isAllowed(joinPoint))
+ return joinPoint.proceed();
+ Key key = null;
+
+ if(cacheableMethodKeys.contains(key)) {
//generate a hash of the method that will be used as: key to cache and compare if the method is allowed or not
+ key = new Key(joinPoint);
- //when method cached, no trace will be generated
- //caching methods
- //todo optimize this logic to build and compare methods
- for (MethodEntry methodAnalysis : cacheableMethods) {
- if (joinPoint.getSignature().toLongString().equals(methodAnalysis.getMethodInfo().getSignature())) {
+ //when method is already cached and obtained from it, no trace will be generated
+ //System.out.println(key + "generated to " + joinPoint.getSignature().toLongString());
- MethodInfo methodInfo = new MethodInfo(joinPoint.getSignature().toLongString(), joinPoint.getArgs());
+ //System.out.println(key + "is a cacheable method");
+ return cache(key, joinPoint);
- //TODO hash or not???
- // methodInfo.setArguments(HashCodeBuilder.reflectionHashCode(joinPoint.getArgs()));
- // methodInfo.setReturnedValue(HashCodeBuilder.reflectionHashCode(result));
+ //caching methods
+// for (MethodEntry methodAnalysis : cacheableMethods) {
+// if (joinPoint.getSignature().toLongString().equals(methodAnalysis.getMethodInfo().getSignature())) {
+//
+// MethodInfo methodInfo = new MethodInfo(joinPoint.getSignature().toLongString(), joinPoint.getArgs());
+//
+// //TODO hash or not???
+// // methodInfo.setArguments(HashCodeBuilder.reflectionHashCode(joinPoint.getArgs()));
+// // methodInfo.setReturnedValue(HashCodeBuilder.reflectionHashCode(result));
+//
+// if (methodAnalysis.getMethodInfo().equalsWithoutReturnedValue(methodInfo)) {
+// //todo we should trace cached methods in order to provide the runtime, otherwise the cached method
+// //will not be cacheable on the second time
+// return cache(joinPoint);
+// }
+// }
+// }
+ }
- if (methodAnalysis.getMethodInfo().equalsWithoutReturnedValue(methodInfo)) {
- //todo we should trace cached methods in order to provide the runtime, otherwise the cached method
- //will not be cacheable on the second time
- return cache(joinPoint);
- }
- }
- }
+ if (tracerEnabled) {
+ if(key == null)
+ key = new Key(joinPoint);
- if (isAllowed(joinPoint)) trace(joinPoint);
+ trace(key, joinPoint);
}
+
return joinPoint.proceed();
}
@@ -285,7 +303,11 @@ public class TracerAspect {
return false;
}
- private Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
+ private Object trace(Key key, ProceedingJoinPoint joinPoint) throws Throwable {
+
+ //method calls can change the args, so it is better to get it at the beginning
+ Object[] joinPointArgs = joinPoint.getArgs();
+
long startTime = currentTimeMillis();
Object result = joinPoint.proceed();
long endTime = currentTimeMillis();
@@ -302,7 +324,7 @@ public class TracerAspect {
//TODO declare on properties the class name which implements UserGetter, parse and initialize
logTrace.setUserId(userGetter.getCurrentUser());
- MethodInfo methodInfo = new MethodInfo(joinPoint.getSignature().toLongString(), joinPoint.getArgs(), result);
+ MethodInfo methodInfo = new MethodInfo(joinPoint.getSignature().toLongString(), joinPointArgs, result, key);
logTrace.setMethodInfo(methodInfo);
//in case of batch processing...
@@ -337,8 +359,16 @@ public class TracerAspect {
}
private Object cache(ProceedingJoinPoint joinPoint) throws Throwable {
-
final Key key = new Key(joinPoint);
+ return cache(key, joinPoint);
+ }
+
+
+ private Object cache(Object key, ProceedingJoinPoint joinPoint) throws Throwable {
+
+ //already calculated
+ //final Key key = new Key(joinPoint);
+ //final SimpleKey key = (SimpleKey) joinPointKeyGenerator.generate(joinPoint);
ValueWrapper value = cache.get(key);
if (value != null) {
@@ -347,7 +377,6 @@ public class TracerAspect {
}
Object result;
-
try {
result = joinPoint.proceed();
} catch (Exception ex) {
@@ -371,7 +400,7 @@ public class TracerAspect {
*/
private void clean() {
cache.clear();
- logger.info("Expired cached values were removed.");
+ logger.info("All cached values were removed.");
}
private void stats() {
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfo.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfo.java
index 874d064..18c3c40 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfo.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfo.java
@@ -1,6 +1,6 @@
package br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.metadata;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
+import br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.cacher.key.Key;
import java.util.Objects;
@@ -12,6 +12,8 @@ public class MethodInfo {
private Object returnedValue;
+ private Key key;
+
// private Integer hashedReturnedValue;
// private Integer hashedArguments;
@@ -41,6 +43,11 @@ public class MethodInfo {
// }
}
+ public MethodInfo(String s, Object[] joinPointArgs, Object result, Key key) {
+ this(s, joinPointArgs, result);
+ this.key = key;
+ }
+
public String getSignature() {
return this.signature;
}
@@ -53,6 +60,10 @@ public class MethodInfo {
return this.returnedValue;
}
+ public Object getKey() {
+ return key;
+ }
+
public boolean equalsWithoutReturnedValue(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
diff --git a/framework/autonomicmanager/src/test/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/Learner.java b/framework/autonomicmanager/src/test/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/Learner.java
index a5ccf8e..a84bd59 100644
--- a/framework/autonomicmanager/src/test/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/Learner.java
+++ b/framework/autonomicmanager/src/test/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/Learner.java
@@ -157,7 +157,22 @@ public class Learner {
}
@Override
- public long expiry() {
+ public long expiryInterval() {
+ return 0;
+ }
+
+ @Override
+ public long firstExpiry() {
+ return 0;
+ }
+
+ @Override
+ public long analysisInterval() {
+ return 0;
+ }
+
+ @Override
+ public long firstAnalysis() {
return 0;
}
@@ -192,6 +207,11 @@ public class Learner {
}
@Override
+ public boolean enableBlacklist() {
+ return false;
+ }
+
+ @Override
public boolean tracerEnabled() {
return true;
}
README.md 34(+17 -17)
diff --git a/README.md b/README.md
index f383150..fdde6f3 100644
--- a/README.md
+++ b/README.md
@@ -5,20 +5,19 @@ Meeting performance and scalability requirements while delivering services is a
Application-level caching is mainly characterized by caching techniques employed along with the application code, i.e. business, presentation and data logic. Therefore, it is not tied up to a specific caching location (server-side, proxy or client-side), because it can be conceived at the server-side, to speed up a Java-based application that produces HTML pages sent to users, as well as at the client-side, as a JavaScript-based application that executes part of its logic directly on the client's browser. In both situations, developers can reason about caching and implement a caching logic to satisfy their needs.
-Identifying cacheable methods automatically
+Evaluation set up - Identifying cacheable methods automatically
---------
-###### Evaluation setup
+Simulations were performed using three different caching configurations: (i) no application-level caching (NO), (ii) application-level caching manually designed and implemented by developers (DEV); and (iii) our approach (AP).
+######## Set up
- Three applications
-- Three application setups each: NO, DEV, AP
-- Three randomized simulation of execution for each application
-
-Simulations were performed using three different caching configurations: (i) no application-level caching (NO), (ii) application-level caching manually designed and implemented by developers (DEV); and (iii) our approach (AP).
+- Three set ups for each application: NO, DEV, AP
+- A simulation of a randomized workload for each set up
Required Tools
---------
-- [Jmeter] (http://jmeter.apache.org/)
+- [Jmeter 3.3] (http://jmeter.apache.org/)
- MySQL
- Java 8
- Maven 3
@@ -49,12 +48,13 @@ This application requires the installation of Elasticsearch (https://www.elastic
Installation and configuration:
- Create schema `SALESMANAGER` on the database
- Configure the file `database.properties` with your database info
-- Database population: in the file `shopizer-properties.xml` there is the tag `<prop key="POPULATE_TEST_DATA">true</prop>`. Such configuration will provide 7 categories, 6 products, addresses USA, one customer, one admin, shipping info in the database in the first initialization of the system.
-- Compilar e rodar a aplicação: `mvn clean install tomcat7:run-war -DskipTests`
+- Database population: in the file `shopizer-properties.xml` there is the tag `<prop key="POPULATE_TEST_DATA">true</prop>`. For AP and DEV, such configuration will provide 7 categories, 6 products, addresses USA, one customer, one admin, shipping info in the database in the first initialization of the system. For NO, it will be generated a lot of more randomized data. For more information on how the database is populated, please refer to `InitData.class` and its implementations.
+- Compile and run: `mvn clean install tomcat7:run-war -DskipTests`
-Use the urls above to access system's features
-- /shop → Páginas da loja
-- /admin → Administração com login: admin:password
+Use the urls below to access system's features
+- http://localhost:8080/sm-shop/<profile>
+- /shop → Store page
+- /admin → Administration page where the login and password are: admin:password
[Petclinic] (https://github.com/spring-projects/spring-petclinic)
@@ -62,16 +62,16 @@ Installation and configuration:
- Create schema `perclinic` on the database
- Configure database on the file `pom.xml`
- Populate database: on the first initialization it will be populated automatically
-- Compilar e rodar a aplicação: `mvn clean install tomcat7:run-war -DskipTests`
+- Compile and run: `mvn clean install tomcat7:run-war -DskipTests`
- Url to access the system: http://localhost:9966/petclinic/
-[CloudStore] (https://github.com/CloudScale-Project/CloudStore
+[CloudStore] (https://github.com/CloudScale-Project/CloudStore)
Installation and configuration:
- Restore the [dump](https://github.com/CloudScale-Project/CloudStore) located in `DEV/database/rds-tpcw-dump-latest.sql`, such dump has 10000 books
- Configure database on file `src/main/resources/database/database.hibernate.properties`
-- Compilar e rodar a aplicação: `mvn clean install tomcat7:run-war -DskipTests`
-- Url to access the system: http://localhost:9966/cloudstore/
+- Compile and run: `mvn clean install tomcat7:run-war -DskipTests`
+- Url to access the system: http://localhost:8080/showcase/
Simulations
-----------
@@ -88,4 +88,4 @@ Metrics
To assess performance, we used two metrics: throughput (number of requests handled per second) and hit ratio, because they are well-known in the context of web applications and cache performance tests.
- Throughput is obtained from Jmeter reports
-- Hit ratio must be acquired from `jconsole` after the end of the simulation. The hit ratio will be showed at EhCache → Estatistics → Hits
\ No newline at end of file
+- Hit absolute and Hit ratio can be acquired from `jconsole` after the end of the simulation. Such metrics will be presented at EhCache → Estatistics → <cache name>
\ No newline at end of file