Elastic Path Commerce 8.3.x Release Notes
Learn about changes to Elastic Path Commerce for this release. Fixes since the release are summarized in the changelog.
Changelog
The changelog contains the list of fixes and improvements made to Elastic Path Commerce 8.3 since its release date. To learn how to consume the updates, see Consuming Support Fixes.
- 3137fa20: Offer search results can sometimes return the wrong result from the cache. (10-Jun-2022)
- cbbee5e3: Fixed issue with extension point proxy that could cause a
ClassCastException
if an extension is extended. (10-Jun-2022) - cba24ffa: Refactored most logging calls from using Log4j2 classes to SLF4j classes to allow these log messages to appear properly in Cortex (which uses Logback for logging). (1-Jun-2022)
- f6114979: Improved thread safety around search index rule compilation. (25-May-2022)
- bdfa11f9: Added IDs to anonymous beans in
validators.xml
. (25-May-2022) - 7e0e3531: Removed unnecessary event handler that was loading price lists into memory during authentication. (9-May-2022)
- 98c8d61f: Allow business users to add "not sold separately" products as associations. (6-May-2022)
- 94549899: Fixed search indexing to allow each index to commit as soon as it is complete instead of waiting for all indexes to complete. (4-May-2022)
- 7f2c1bbc: Fixed issue where cart item modifiers on shopping cart child line items cannot be updated. (2-May-2022)
- f4236235: Upgraded ActiveMQ to version 5.16.4 which uses Reload4j instead of Log4j to address several security vulnerabilities. (2-May-2022)
- 4e92241b: Fixed an issue where service logs were not being written to the correct location. They are now always written to
[user.home]/ep/logs
. (29-Apr-2022) - a4dd4104: Significantly improves the performance of customer, account, and order searches in Commerce Manager. Also fixes several bugs in these searches and adds support for search by billing and shipping address fields. (29-Apr-2022)
- 836b2650: Changed attribute value
LONG_TEXT_VALUE
field fromCLOB
toVARCHAR
to prevent JPA from making additional database queries for each attribute value. (25-Apr-2022) - 31262109: Extend expiry date for test Commerce Manager passwords to correct test failures. (4-Apr-2022)
- da13caf2: Fixed some intermittent Selenium test failures. (1-Apr-2022)
- 57f2b07c: Inject producer template into
RelayOutboxMessageBatchProcessor
via Spring instead of@EndpointInject
annotation. (30-Mar-2022) - bcee841a: Fixed boolean datatype for the "deleted" column of the
TCATALOGHISTORY
table (on PostgreSQL). (24-Mar-2022) - 6200a188: Removed ability for tax plugins to modify an item subtotal to avoid bugs in tax plugin implementations. (22-Mar-2022)
- 7c724e86: Removed the requirement to set the
ep.catalog.batch.database.*
JVM parameters on the Batch Server for non-MySQL databases. The database type is now detected automatically. (17-Mar-2022) - d486a35b: Modified the keyword search functionality to return all matching product skus instead of the default sku for matching products. (28-Feb-2022)
- 79fc469c: Fix for failing email file attachments Cucumber test due to change in place-hold it URL (22-Feb-2022)
- 7ec7d030: Disabled unnecessary dependency retrieval when exporting through Import/Export API to greatly improve performance. Also fixed
DIRECT_ONLY
flag inexportconfiguration.xml
so it correctly excludes associated products from the product export. (17-Feb-2022) - 6dafe5d4: Increased the number of primary key sequence values that are retrieved in a batch for additional transactional entities to improve record insert performance. (9-Feb-2022)
- 95544ad2: Added cucumber tests for fixed issue where the Cortex resource returned no results if the
x-ep-account-shared-id
header was set. (9-Feb-2022) - 5e87b034: Fix for purchase lookup form not finding orders that were placed on behalf of the account that is specified in x-ep-account-shared-id. (8-Feb-2022)
- 951bba66: Fixed issues with Liquibase scripts that caused an error during data upgrade. (7-Feb-2022)
- b21e519a: Revert ep-xpf-spi version. (7-Feb-2022)
- dbb0c8ff: Upgraded Apache SOLR from version 7.4 to 8.11.1. (4-Feb-2022)
- 0d72c2f9: Upgraded Apache Shiro from 1.3.2 to 1.8.0. (4-Feb-2022)
- 7dde7dd8: Added ability to set customer username as a data policy data point so that Personally Identifiable Information (PII) data in that field (usually email address) is removed when consent is revoked. (1-Feb-2022)
- af7ab40c: Modified Cortex to allow it to continue functioning normally if ActiveMQ is overloaded or offline. (17-Jan-2022)
- a33020ed: Upgraded Log4j2 to version 2.17.1. (13-Jan-2022)
- d02c60c6: Allow base amounts to be added/edited/deleted without first adding the price list to the changeset. (29-Dec-2021)
- c30440c5: Fixed an issue with
AbstractPageObject
where it would miss a button’s state change, causing test instability. (17-Dec-2021) - 0c37c7ae: Upgraded Log4j2 to version 2.15.0 to fix zero-day exploit CVE-2021-44228. (17-Dec-2021)
- 5d263df3: Fixed issue where the
wishlistmemberships
Cortex resource returned no results if thex-ep-account-shared-id
header was set. (10-Dec-2021) - b16db638: Improved upgrade performance of liquibase changeset
2020-05-cart-cleanup-jobs-recreate-FKs-with-cascade-delete
. (30-Nov-2021) - 8b4d19ea: When a promotion can apply to multiple cart line items, this fix ensures that the
appliedpromotions
resource shows the promotion for all of the applicable line items. (25-Nov-2021) - 04d36474: Improved upgrade performance of liquibase changesets:
7.6.0-torder-make-cart-order-guids-unique
,2020-09-convert-customer-passwords-to-bcrypt
,2020-08-flatten-order-sku-tree-for-better-performance
,2020-03-payment-configurations-preserve-all-authorization-codes-as-payment-data
,2020-05-update-accountmanagement-customertype
. (25-Nov-2021)
Changelog Announcements
LONG_TEXT_VALUE
field from CLOB
to VARCHAR
Changed attribute value This patch changes the type of the LONG_TEXT_VALUE
field in all attribute value tables (TCATEGORYATTRIBUTEVALUE
, TCUSTOMERPROFILEVALUE
, TPRODUCTSKUATTRIBUTEVALUE
, and TPRODUCTATTRIBUTEVALUE
) from CLOB
to VARCHAR
. This is done to avoid an extra select query on the database for each record returned in these tables. These extra select queries significantly slows performance when retrieving customers, categories, products, and product skus from the database, even when the LONG_TEXT_VALUE
field is not populated.
Before deploying this change to production, note the following impacts:
- If any of the tables listed above contain a large amount of data in the
LONG_TEXT_VALUE
field for any single record, the data population process may fail.- For MySQL, the new limit is 20,000 characters.
- For PostgreSQL, the new limit is 65535 bytes (note that each unicode character can consume between 1 and 4 bytes).
- For Oracle, the new limit is 32767 bytes (note that each unicode character can consume between 1 and 4 bytes).
- The data population process may take several minutes or hours to execute, depending on the number of records in the tables listed above, database type used, and database size. While data population is running, Cortex operations may fail or be very slow due to database load and database table locks.
- Teams using Oracle must ensure that the
MAX_STRING_SIZE
parameter is set toEXTENDED
before running data population process or it will fail.
For all these reasons, before deploying this change to production, your teams should test the data population process on a snapshot of your production database in a pre-production environment. Verify that the process is able to complete successfully and make note of how long the data population process takes. Also validate the behaviour of Cortex during the data population process; you may need to plan for downtime during this process if the Cortex impact is significant.
For teams using Oracle, follow these instructions to change your database MAX_STRING_SIZE
parameter to EXTENDED
:
Modified Cortex to allow it to continue functioning normally if ActiveMQ is overloaded or offline
Cortex sends event notifications in a number of circumstances, as documented here. Before this patch, those event notifications were sent to ActiveMQ in real-time. Therefore, if ActiveMQ was overloaded, Cortex performance would suffer. Furthermore, if ActiveMQ was offline, Cortex operations would fail.
After this change, all Cortex event notifications are recorded in the TOUTBOXMESSAGE
table, and relayed to ActiveMQ by a Batch Server job that runs every second. This means that Cortex will continue to function regardless of the state of ActiveMQ, and performance will not be affected. If ActiveMQ is offline temporarily, messages will be relayed from the outbox table once it comes back online.
Note that Cortex still maintains a connection to ActiveMQ so it can listen for Operational Insights requests, so if ActiveMQ is offline, a thread will attempt to reconnect every few seconds. However, this will not affect Cortex operation in any way.
8.3.0
Released: Nov 2021
Release highlights
Extension Point Framework
Elastic Path Commerce 8.3.0
is the first release to support the Extension Point Framework. Developers can use this framework to extend and customize Elastic Path Commerce by creating plugin JARs outside of the Elastic Path source code repository.
The Extension Point Framework helps to address the complexity and upgrade costs associated with extending the Elastic Path Commerce platform. The following extension points are supported in Elastic Path Commerce 8.3.0
:
- HTTP Request Tag Set Populator
- Order Data Populator
- Order Hold Determination
- Product Recommendations
- Setting Value Retrieval
- System Information
- Validate Product Sku at Add-to-Cart Read
- Validate Product Sku at Add-to-Cart
- Validate Product Sku at Checkout
- Validate Shopping Cart at Cart Create or Update
- Validate Shopping Cart at Checkout
- Validate Shopping Item at Add-to-Cart
- Validate Shopping Item at Checkout
- Validate Shopping Item at Remove from Cart
important
We recommend using the Extension Point Framework External Plugins approach whenever a developer wants to use an Extension Point that is available to support the customization.
For more information, see the Extension Point Framework Documentation.
Operational Insights
Operational Insights is a tool for validating the configuration and health of an Elastic Path Commerce environment. This tool has two parts:
- An Integration Server REST API that returns information about the state of all Elastic Path Commerce services in a running environment.
- A web-based standalone tool that queries the REST API and presents the information along with recommendations for updating any values that indicate potential issues.
For more information, see the Operational Insights documentation.
Performance Insights for Cucumber Tests
Performance Insights for Cucumber tests tool provides an easy and reliable way to discover performance issues during early development, focusing only on the database operations. The tool executes a set of Cucumber tests that run through various code paths to measure the number of database operations. Database operations are measured using Elastic Path’s Database Query Analyzer Tool, which is used for database profiling and investigation of the performance issues. The results of the tests are available in CSV, JSON, and HTML formats.
For more information, see Performance Insights for Cucumber Tests.
Certified for use with MySQL 8.0
Elastic Path Commerce 8.3 is now certified for use on both MySQL 5.7 and 8.0 versions. Both versions are supported with the same JDBC
driver. You only need to configure JNDI
to connect to the appropriate database endpoint.
Amazon AWS supports MySQL 8.0 on RDS.For more information, see Supported Technologies and Local Database Setup.
note
MySQL 5.7 end of life details are provided in the following table:
- MySQL 5.7 | Oct 21, 2023
- MySQL 5.7 on Amazon Aurora | Feb 29, 2024
- MySQL 5.7 on Amazon RDS | Not yet announced
Certified for use with Postgres 13.3
Elastic Path Commerce 8.3 is now certified for use on Postgres 13.3.
Amazon AWS supports Postgres 13 on RDS and Postgres 13 on Aurora.
For more information, see the Supported Technologies and Local Database Setup documentation.
System requirements and compatibility
Elastic Path Commerce 8.3.0
is now certified for use with the following technologies:
Technology | Old Certification | New Certification |
---|---|---|
MySQL | 5.7.31 | 5.7.34 |
MySQL | N/A | 8.0.25 |
PostgresSQL | N/A | 13.3 |
Tomcat | 9.0.16 | 9.0.50 |
Elastic Path Commerce 8.3.0
is compatible with the following Elastic Path releases:
Elastic Path Component | Compatibility |
---|---|
Extension Point Framework | Extension Point Framework compatibility matrix |
CloudOps for Kubernetes | CloudOps for Kubernetes compatibility matrix |
For more information, see Supported Technologies.
New in this release
In addition to the Release Highlights, this release contains the following updates:
Added recommendations link on offers in Cortex
In Commerce Manager, product associations are configured based on the source and target products. With a new recommendations
link on the Cortex offer
resource, the target offer for each associated product is returned. Previously, the recommendations
link, which returns product association details, was exposed in the Cortex items
resource and returned the default item SKU for each target product.
For more information, see Cortex Recommendations.
ShoppingCart
, and CustomerSession
objects
Simplified object graph between Shopper, The domain object graph between Shopper, ShoppingCart
, and CustomerSession
was unnecessarily complex. There were two main issues:
- ShoppingCart and Shopper both held a reference to CustomerSession
- There was a bidirectional relationship between Shopper and CustomerSession.
Simplified the object graph by removing references from ShoppingCart
to CustomerSession
and CustomerSession
to Shopper
.
Modified Commerce Manager address editor to be consistent with Cortex
- Phone number is now optional in Commerce Manager to be consistent with Cortex.
- The organization field is now visible and editable in Commerce Manager to be consistent with Cortex.
Cortex Studio no longer makes Zoom Builder requests unless Zoom Builder is open
Whenever Cortex Studio made a GET
request to Cortex, multiple additional requests were made to populate the Zoom Builder view. This frequently led to confusion for developers when using Cortex Studio for debugging.
Cortex Studio now only makes Zoom Builder requests if the Zoom Builder tab is open. Otherwise, the additional Cortex requests are skipped.
Added ability for business users to delete accounts
Business users can now delete accounts through Commerce Manager. You can delete an account only if the account and the all of its children have no purchases associated with them. When you delete an account, the account’s children are also deleted.
For more information, see Deleting an Account record.
Added ability for payment plugins to determine how many reservations have been attempted for an order
Added Integer rereserveCount
to ReserveCapabilityRequest
to ensure that the reference number for the payment gateway is unique across all requests. When the reserve
method is invoked on a payment plugin, the request parameter includes the Integer rereserveCount
value. For the first reservation attempt, rereserveCount
is null. For each subsequent reservation attempt, the value is incremented, starting at 1.
permissionsLookupRank
Added Helix validation to ensure that extension bundles implement Added permissionsLookupRank
method to AbstractHelixModule
, so that the extension bundles can specify a priority and Cortex can use this to consume the right permission.properties
file. To ensure that this change is made, new checks are added to the REST definition validation Maven plugin. The following errors are returned incase of a problem:
The wiring module {} doesn't implement 'permissionsLookupRank()' method.
The wiring module {} has a permission rank lower than its parent. You have to implement 'permissionsLookupRank()' method with the ranking higher than that of the parent.
Account hierarchy closure table
Created a closure table named TCUSTOMERCLOSURE
, which contains links from every account to each of its descendants to address the performance issue related to the account queries. With this table, you can look up descendants or ancestors with a single query. Previously, AccountIdParameterStrategy
retrieved a list of all account GUIDs that a buyer is allowed to access along with all descendants of each of the account.
For example, for a hierarchy similar to the following example:
The closure table contains the following information:
ANCESTOR | DESCENDANT | ANCESTOR_DEPTH |
---|---|---|
1 | 11 | 0 |
1 | 12 | 0 |
1 | 111 | 0 |
1 | 112 | 0 |
1 | 121 | 0 |
1 | 122 | 0 |
11 | 111 | 1 |
11 | 112 | 1 |
12 | 121 | 1 |
12 | 122 | 1 |
Ability to determine version on a running Elastic Path Commerce service
Added the following mechanisms for identifying the current version of Elastic Path Commerce:
Maven
pom
files now have access to a property namedep.release.version
.The
META-INF/MANIFEST.MF
file for each webapp containsImplementation-Title
,Implementation-Vendor
, andImplementation-Version
properties.Application code can access the version using
getClass().getPackage().getImplementationVersion()
.All webapps now display the following message to the logs at startup:
Commerce Version: {Service Name} {Version} by Elastic Path Software, Inc
A new About dialog is added to the top-right corner menu in the Commerce Manager user interface.
Denormalized modifier field data to improve database query performance
Elastic Path Commerce supports modifier fields that allow projects to specify custom fields that are associated to shopping carts, shopping cart line items, orders, and order line items.
Removed the related tables, where the modifier field values were stored, to avoid the additional queries made due to limitations in OpenJPA. Now the modifier field values are stored in a CLOB
field on the parent table.
For more information, see Database Changes.
Removed customer SOLR index
The customer SOLR index has been removed for the following reasons:
- Records in the customer table have unbounded growth over time and index gets very large and require significant disk space, which makes customer records a poor candidate for SOLR indexing.
- Search indexes might require full rebuilds from time-to-time for various reasons. These rebuilds might take a very long time for databases with large customer tables.
- The customer SOLR index was only used by Commerce Manager and Import and Export tool. You can manage searchable fields by indexing the fields in database and by using database queries.
All customer search lookups have been replaced with equivalent database queries, and all code related to building the customer SOLR index is removed.
New methods have been added to CustomerService
to facilitate customer searches by criteria:
/**
* Find customers by search criteria.
*
* @param searchCriteria the search criteria
* @param startIndex start index
* @param pagination the pagination
* @return the customers list
*/
List<Customer> findCustomersBySearchCriteria(CustomerSearchCriteria searchCriteria, int startIndex, int pagination);
/**
* Get count of customers by search criteria.
*
* @param searchCriteria the search criteria
* @return the count
*/
long getCustomerCountBySearchCriteria(CustomerSearchCriteria searchCriteria);
/**
* Find accounts by search criteria.
*
* @param searchCriteria the search criteria
* @param startIndex start index
* @param pagination the pagination
* @return the customers list
*/
List<Customer> findAccountsBySearchCriteria(AccountSearchCriteria searchCriteria, int startIndex, int pagination);
/**
* Get count of accounts by search criteria.
*
* @param searchCriteria the search criteria
* @return the count
*/
long getAccountCountBySearchCriteria(AccountSearchCriteria searchCriteria);
Fixed Issues
Fixed an issue where stores were accessible regardless of the state of the state. Shoppers can now access only those stores that are enabled and in the
Open
state. If a client attempts to access any Cortex API for a scope associated to a store that is disabled or notOpen
, a400 HTTP
response is returned with the following structured error message:{ "type": "error", "id": "store.disabled", "debug-message": "The selected store is disabled or not in an OPEN state.", "data": { "store-code": "mobee" } }
Reviewed all the domain classes for transactional tables and updated the following classes to use
HIGH_CONCURRENCY_ALLOCATION_SIZE
so that performance bottleneck in Cortex under high volume scenarios are avoided:OrderImpl
CustomerRoleImpl
CustomerPaymentInstrumentImpl
CartOrderPaymentInstrumentImpl
OrderPaymentDataImpl
CustomerDefaultPaymentInstrumentImpl
DataChangedImpl
ChangeTransactionImpl
ChangeTransactionMetadataImpl
AbstractChangeOperationImpl
ShoppingItemImpl
AppliedCouponImpl
OutboxMessageImpl
Removed core integration test dependency
ep-rs-authentication-epcommerce
on Cortex library fromep-core-itests
. Instead, a new Cortex integrations module ,cortex-itests
, which contains the integration test that depends on theep-core-itests
module, is created.Fixed an issue where JMS messages were not distributed evenly when running multiple Integration Servers by changing the JMS broker URL in the
context.xml
files to the following:brokerURL="failover:(${ep.jms.url})?maxReconnectAttempts=2&jms.prefetchPolicy.all=20"
Fixed the issue where orders were left in the
CREATED
state instead of theFAILED
state when a specific checkout method returned an exception.Fixed an issue where the Integration Server used wrong cache configuration settings from
ehcache-importexport.xml
file instead of the file defined by theep.external.ehcache.xml.path
property. Theehcache-importexport.xml
file sets all caches to be infinite time-to-live, so you can only use it in the Import/Export CLI.Fixed an issue where a
NullPointerException
message was returned when you click Edit without selecting an item from the item list in Commerce Manager.Fixed an issue where the GUID was modified for the existing products to match the SKU code specified in the CSV file when importing products using the Import Manager tool.
Fixed an issue where the following misleading error appeared in the logs during Cortex startup:
WARN los.webapp.osgi.impl.JarBundleLoaderImpl - Tried to load a jar that is not an OSGi bundle: /ep/source/ep-commerce/extensions/cortex/ext-cortex-webapp/target/ext-cortex-webapp-0.0.0-SNAPSHOT/WEB-INF/bundles/ep-rest-definitions-schema-1.46.0.4e10c9b033.jar ERROR: Bundle org.glassfish.hk2.osgi-resource-locator [56] EventDispatcher: Error during dispatch. (java.lang.IllegalStateException: The bundle is uninstalled.)
However, this error did not cause any issues or prevent Cortex from starting.
Fixed an issue where Cortex was generating two
TCUSTOMERAUTHENTICATION
customer authentication records during registration: One associated to theTCUSTOMER
record throughTCUSTOMER.AUTHENTICATION_UID
and a second orphaned record.Fixed an issue where some of the Cortex servlet filters were returning structured error messages in the wrong format as in the following example:
{ "type": { "ordinal": 1, "name": "error" }, "messageId": "authentication.account.not.found", "debugMessage": "No account found for the provided shared ID.", "data": {}, "resolution": { "present": false } }
The correct format is:
{ "type": "error", "id": "authentication.account.not.found", "debug-message": "No account found for the provided shared ID.", "data": {} }
Some Cortex operations, such as viewing shopping cart line item applied promotions, require loading the corresponding promotion from the database. Due to a misconfigured eager relationship, JPA was also loading all other promotions from the database unnecessarily.
Removed unnecessary caching of the promotion rules cache in the
findRuleBaseByScenario
andfindChangedStoreRuleBases
methods. Additionally, when promotion caches were empty at Cortex startup, multiple threads might fall through the cache simultaneously, leading to resource exhaustion.Fixed an issue where Integration Server was unable to find configured payment plugins, resulting in payment capture failure.
Fixed an issue where Commerce Manager order searches returned duplicate rows for the same order.
Fixed an issue in Commerce Manager so that the product SKU code search returns the exact matches only.
Fixed an issue in Commerce Manager where sorting customers by email caused incorrect number of results to appear and resulted in pagination errors.
Fixed an issue where exceptions thrown by Advisors were not handled properly, the form action was not blocked and the exception was not logged. Now, all exceptions returned are logged, and the advisor returns a blocking structured message as in the following example:
{ "type": "error", "id": "advisor.internal.error", "debug-message": "An internal error occurred in the advisor.", "data": {} }
Fixed an issue where no information about the jar file was returned when api-generator-maven-plugin encountered a corrupt jar file. Now the plugin throws an exception as in the following example:
Exception in thread "main" java.lang.InternalError: Problem occurred while attempting to open /Users/mlavrov/.m2/repository/com/elasticpath/rest/ep-rest-api/1.46.0.2b1561f0dc/ep-rest-api-1.46.0.2b1561f0dc.jar
Using this information, developers can now delete the problematic jar so that it is re-downloaded by Maven.
Fixed performance issues where some of the databases didn’t have indexes by adding indexes on all foreign key relationships explicitly. For example, MySQL implicitly adds an index on foreign key base columns, but other databases, such as Oracle or PostgresSQL, do not. For customers on MySQL, the implicit index are automatically replaced with the explicit index and this change does not cause any noticeable difference in performance.
Fixed an issue where code in the JWT processing logic that populated the cart modifier fields with user details, such as
user-id
,user-name
, anduser-email
values. The following changes are made to remove this issue:Removed
user-id
,user-name
, anduser-email
from thereservedCartModifierKeys
extensible list.Renamed the
CustomerAndUserEmailAddressesExtractionStrategyImpl
class toCustomerEmailAddressExtractionStrategyImpl
and refactored the class so that it reads the email address only from the customer record, and not from the order data.Deleted the following Cucumber tests:
orderShipmentConfirmationEmailsToMultipleRecipients.feature
orderConfirmationEmailsToMultipleRecipients.feature
rmaEmailsToMultipleRecipients.feature
Fixed an issue where the logged message for Import/Export exception was not useful, by improving logging to include full stack trace.
Fixed issues with the re-population of
skuOptionsCache
which caused the cache to become ineffective after the TTL expires.Fixed a performance issue for users with a large number of address records by updating customer domain object so that addresses are no longer eagerly loaded and are only retrieved when needed.
Fixed intermittent test failures related to search indexes by improving
IndexBuildStatusUpdater
so that we can re-initialize it at runtime to avoid possible issues during the DB reset while the search server is running. Also, fixedep-core-tool
test for rebuilding search indexes and it now checks the index statuses in the database, rather than through the Commerce Manager user interface.Fixed an issue where Elastic Path services automatically attempts to re-connect to ActiveMQ connection endlessly leaving the thread stuck Cortex Request threads could hang if ActiveMQ connection could not be re-established. The
JMS
connection parameters are modified so that the services now only attempt to reconnect twice before throwing an exception.Fixed invalid JMS connection pool attributes in
context.xml
, such asmaxConnections
,maximumActiveSessionPerConnection
, andidleTimeout
to the correct parameterspoolMaxConnections, poolMaximumActiveSessionPerConnection
, andpoolIdleTimeout
.Eliminated contention on "Frequency" SKU option retrieval in Payment Schedule Helper. The "Frequency" sku option is now loaded and cached indefinitely at service startup to avoid contention under high load when the cache expired.
Fixed an issue where the
ShoppingCartServiceImpl#touch
method retrieved a fully-loaded shopping cart just to update the last modified date. Now you can update it using a simpleJPQL UPDATE
statement.Reduced the packages that are considered for OpenJPA enhancement to improve build performance. Previously the OpenJPA enhancement plugin, for
ep-core
, was configured to consider all classes withinep-core
. It now only considers classes that match thecom/elasticpath/**/domain/**/*.class
patterns.Fixed the issues with the
_scrollToTableItemWithText
function inep-test-support.js
which caused Selenium tests fail intermittently due to issues with finding items in a scrollable list. To address this issue, Maven configuration is updated to allow IntelliJ to run tests without errors. A special profile is added to Maven that is automatically activated by IntelliJ, using which you can disable the setting that treats Java compilation warnings as errors, so that IntelliJ can successfully run unit tests within the IDE.Fixed the race condition bug in facets so that when running Cortex API requests on offer search that includes a zoom into the to faceting resources, the
facetselector
resource is not missing anymore.Fixed an issue with password reset functionality that prevented users from logging in if they changes password after their password hash was upgraded from
SHA-256
to BCrypt when migrated from EPC 8.1 to 8.2.Improved Commerce Manager performance for catalogs with large volumes of base amounts, such as millions.
Fixed a performance issue when accessing links on the
deliveries
resource for users with many saved shopping carts. Now all of the shopping carts are not checked to determine if links within thedeliveries
resource must be displayed.Fixed an issue where database deadlocks occurred causing operations to fail under high load conditions. Now, whenever a deadlock is detected, Elastic Path re-attempts to commit the transaction up to 3 times before giving up and throwing an exception.
Optimized the
inventoryJournalRollupJob
batch job. This job is responsible for combining multipleTINVENTORYJOURNAL
records into a single record so that queries to determine inventory counts don’t need to sum as many records, which can be a very inefficient database operation. The query was changed to use native SQL to give us more control for each supported database. Also, the job was modified to run every minute instead of once per day.Fixed the
hashCode
algorithm forSellingContextCacheKey
to separate objects into different buckets efficiently.Fixed intermittent
NullPointerException
in Hibernate validators. Due to inconsistencies in the order thatjpa-persistence.xml
files are loaded at startup, there was a chance that a service could start in a state where the Hibernate validation mode was set incorrectly. This would cause aNullPointerException
to be thrown during various Cortex operations.Performance issue in the validator used to ensure that cart and cart item modifier values are valid. It was discovered that the Hibernate validator used to validate cart and cart item modifier values is very slow to initialize. This initialization was being done every time cart and cart item modifiers were checked. This change now caches the validator initialization to significantly improve performance.
Searching for product names with special characters in Commerce Manager caused an error. When searching for product names in Commerce Manager with special characters such as + and / it causes the search to throw an error. This was due to a problem with the way that the values were being escaped. This is now resolved.
Fixed an issue with the payment capture re-attempts so that the authorization and second capture are recorded. When a physical product ships and the payment capture attempt fails, Elastic Path re-creates the authorization and capture.
Resolved the issue where the applied promotion was only appearing on the first shopping cart line item to which it applies. For example, if a shopping cart line item promotion is created that applies to multiple lines, the
applied-promotions
resource only showed the promotion for the first line item in the shopping cart. The promotion now correctly appears for all cart line item to which it applies.Fixed an issue where the
pagination
object showed a results count that did not match the number of links returned When viewing recommendations.Fixed an issue when using the back button in Cortex Studio after using a lookup form such as
itemlookupform
to find a resource, following one of the links, and clicking back, the browser returned to the lookup form. Now the browser returns to the previous resource as expected.Fixed an issue where triggering catalog projection rebuild for a very large catalog caused out of memory error in the Batch Server.
Fixed an issue where the Search server processing of index update notification records cause out of memory issues in the server if the
TINDEXNOTIFY
table contained a large number of records to be processed. The job now loads the records in batches to prevent this issue.
Upgrade notes
The upgrading Elastic Path guide provides general instructions on upgrading Elastic Path projects.
Core commerce
- Log4j is upgraded from 1.x to 2.x. You must convert all
log4j.properties
files tolog4j2.xml
and update references to the Log4j classes,Logger
andLogManager
. For more information, see the following section. - Removed or replaced a few methods in
ShopperService
. The following section provides details on replacing the existing code with new code. - Removed or replaced a few methods in
ShoppingCartService
.The following section provides details on replacing the existing code with new code. - Changed the
CustomerService#findById
method signatures. The following section provides details on replacing the existing code with new code. - Replaced
Shopper#updateTransientDataWith
withShopper#setCustomerSession
. - Moved
Shopper#getCache
toCustomerSession#getCache
. - Removed
ShoppingCart#getCustomerSession
. UseShoppingCart.getShopper().getCustomerSession()
instead. - Removed
CustomerSession#getShopper
. Use theShopperService
orShopperRepository
methods to obtain aShopper
instead. - Removed
ConditionEvalulationCacheKey
because it was unused. - All bean definitions related to buyer permissions are moved from
service.xml
to the newpermissions.xml
file.
Upgraded MySQL JDBC driver
After upgrading to mysql-connector-java-8.0.25.jar
, developers might get server timezone errors when starting local services.Ensure that the default timezone is specified in the MySQL configuration, as described in these instructions.
commons-lang
to commons-lang3
Upgraded from All dependencies on commons-lang
have been removed and replaced with commons-lang3
. Search through your extension code for import org.apache.commons.lang.
and update them to import org.apache.commons.lang3.
. Some additional changes may be required but in most cases the updated classes are backwards compatible.
Log4j 1.x to 2.x upgrade
- Update any custom code that defines a Log4j
Logger
to use the Log4j2LogManager
as in the following example:
- Convert any custom modules containing a
log4j.properties
file tolog4j2.xml
, as in the following example:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<File name="FILE"
fileName="${user.home}/ep/logs/ep-datasync.log"
append="false">
<PatternLayout pattern="[EP-DataSync] %-5p %t %d{ISO8601} %c - %m%n" />
</File>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="[EP-DataSync] %-5p %t %d{ISO8601} %c - %m%n" />
</Console>
</Appenders>
<Loggers>
<Logger name="com.elasticpath" level="${ep.log.level}" additivity="false">
${ep.log.to}
</Logger>
<Logger name="com.elasticpath.extensions" level="${ep.log.level}" additivity="false">
${ep.log.to}
</Logger>
<Root level="info">
${ep.log.to}
</Root>
</Loggers>
</Configuration>
Refactored core service methods
The following table provides a list of removed methods and the new equivalent methods:
Get a shopper record:
- Old:
Shopper shopper = shopperService.createAndSaveShopper(storeCode);
- New:
Shopper shopper = shopperService.findOrCreateShopper(customer, storeCode);
- Old:
Get a shopper record:
- Old:
Shopper shopper = shopperService.findByCustomerGuid(customerGuid);
- New:
Shopper shopper = ShopperService#findOrCreateShopper(customerGuid, storeCode);
- Old:
Get a shopper record:
- Old:
Shopper shopper = shopperService.findByCustomerGuidAndAccountSharedIdAndStore(customerGuid, accountSharedId, storeCode);
- New:
Shopper shopper = shopperService.findOrCreateShopper(customerGuid, accountSharedId, storeCode);
- Old:
Get a shopper record:
- Old:
Shopper shopper = shopperService.findByCustomerGuidAndStoreCode(customerGuid, storeCode);
- New:
Shopper shopper = shopperService.findOrCreateShopper(customerGuid, storeCode);
- Old:
Get a shopper record:
Old:
Shopper shopper = shopperService.findByCustomerSharedIdAndStoreCode(customerSharedId, storeCode);
New:
String customerGuid = customerService.findCustomerGuidBySharedId(customerSharedId, CustomerType.REGISTERED_USER); Shopper shopper = shopperService.findOrCreateShopper(customerGuid, storeCode);
Get a shopper record:
Old:
Shopper shopper = shopperService.findByCustomerSharedIdAndAccountSharedIdAndStore(customerSharedId, accountSharedId, storeCode);
New:
String customerGuid = customerService.findCustomerGuidBySharedId(customerSharedId, CustomerType.REGISTERED_USER); Shopper shopper = shopperService.findOrCreateShopper(customerGuid, accountSharedId, storeCode);
Get a shopping cart.:
- Old:
ShoppingCart shoppingCart = shoppingCartService.findOrCreateByShopper(shopper);
- New:
ShoppingCart shoppingCart = shoppingCartService.findOrCreateDefaultCartByShopper(shopper);
- Old:
Get a shopping cart:
- Old:
ShoppingCart shoppingCart = shoppingCartService.findOrCreateDefaultCartByCustomerSession(customerSession);
- New: No direct equivalent. Get a shopper and invoke
ShoppingCartService#findOrCreateDefaultCartByShopper(shopper)
.
- Old:
Get a shopping cart:
- Old:
String shoppingCartGuid = shoppingCartService.findOrCreateDefaultCartByCustomerSession(customerSession);
- New: No direct equivalent. Get a shopper and invoke
ShoppingCartService#findOrCreateDefaultCartGuidByShopper(shopper)
.
- Old:
Create a shopping cart:
- Old:
ShoppingCart shoppingCart = shoppingCartService.createByCustomerSession(customerSession);
- New: No direct equivalent. Get a shopper and invoke
ShoppingCartService#findOrCreateDefaultCartByShopper(shopper)
- Old:
Lookup a customer:
- Old:
Customer customer = customerService.findBySharedId(sharedId); Customer customer = customerService.findBySharedId(sharedId, storeCode);
- New:
Customer customer = customerService.findBySharedId(sharedId, customerType);
- Old:
Cortex
- The
CustomerSessionRepository
class is replaced with theShopperRepository
class. The following section provides details on replacing the existing code with new code. - The constructors for all Cortex repository classes aren changed from package private to public to make it easier for extension modules to add additional injected services.
Refactored repository methods
The following table provides a list of removed methods and the new equivalent methods:
Get a customer session:
- Old:
Single<CustomerSession> customerSessionSingle = customerSessionRepository.findOrCreateCustomerSession();
- New:
Single<CustomerSession> customerSessionSingle = shopperRepository.findOrCreateShopper().map(Shopper::getCustomerSession);
- Old:
Get a shopper:
- Old:
Single<Shopper> shopper = customerSessionRepository.findOrCreateCustomerSession().map(ShopperReference::getShopper);
- New:
Single<Shopper> ShopperSingle = shopperRepository.findOrCreateShopper();
- Old:
Create a customer session:
- Old:
Single<CustomerSession> customerSessionSingle = customerSessionRepository.createCustomerSessionAsSingle();
- New:
Single<CustomerSession> customerSessionSingle = shopperRepository.findOrCreateShopper().map(Shopper::getCustomerSession);
|
- Old:
Get a customer session:
- Old:
Single<CustomerSession> customerSessionSingle = reactiveAdapter.fromRepositoryAsSingle(() -> customerSessionRepository.findCustomerSessionByGuidAndStoreCode(customerGuid, storeCode));
- New:
Single<CustomerSession> customerSessionSingle = shopperRepository.findOrCreateShopper(customerGuid, storeCode).map(Shopper::getCustomerSession);
- Old:
Get a customer session:
- Old:
Single<CustomerSession> customerSessionSingle = customerSessionRepository.findCustomerSessionByGuidAndStoreCodeAsSingle(customerGuid, storeCode);
- New:
Single<CustomerSession> customerSessionSingle = shopperRepository.findOrCreateShopper(customerGuid, storeCode).map(Shopper::getCustomerSession);
- Old:
Get a customer session:
- Old:
Single<CustomerSession> customerSessionSingle = customerSessionRepository.findCustomerSessionByGuidAndAccountSharedIdAsSingle(customerGuid, accountSharedId);
- New: No direct equivalent. Obtain a store code and invoke
ShopperRepository#findOrCreateShopper(customerGuid, accountSharedId, storeCode)
- Old:
Get a customer session:
Old:
Single<CustomerSession> customerSessionSingle = reactiveAdapter.fromRepositoryAsSingle(() -> customerSessionRepository.findCustomerSessionBySharedId(storeCode, customerSharedId));
New:
String customerGuid = customerService.findCustomerGuidBySharedId(customerSharedId, CustomerType.REGISTERED_USER); Single<CustomerSession> customerSessionSingle = shopperRepository.findOrCreateShopper(customerGuid, storeCode).map(Shopper::getCustomerSession);
Get a customer session:
- Old:
Single<CustomerSession> customerSessionSingle = reactiveAdapter.fromRepositoryAsSingle(() -> customerSessionRepository.findCustomerSessionByCustomerGuidAndAccountSharedId(customerGuid, accountSharedId, storeCode));
- New:
Single<CustomerSession> customerSessionSingle = shopperRepository.findOrCreateShopper(customerGuid, storeCode).map(Shopper::getCustomerSession);
- Old:
Get a customer session:
- Old:
ExecutionResult<CustomerSession> customerSessionSingle = customerSessionRepository.findCustomerSessionByUserIdAndAccountSharedId(customerSharedId, accountSharedId, storeCode);
- New:
Single<CustomerSession> customerSessionSingle = shopperRepository.findOrCreateShopper(customerGuid, accountSharedId, storeCode).map(Shopper::getCustomerSession);
- Old:
Invalidate a customer session.:
- Old:
Completable completable customerSessionRepository.invalidateCustomerSessionByGuid(customerGuid);
- New: No longer necessary.
- Old:
Database changes
Added
CASCADE
onDELETE
on the following foreign key relationships:TCUSTOMER.UIDPK
<--TSHOPPER.ACCOUNT_CUSTOMER_UID
TCUSTOMER.GUID
<--TUSERACCOUNTASSOCIATION.ACCOUNT_CUSTOMER_GUID
For more information, see
core-changelog-2020-11-user-account-associations-cascade-delete.xml
andcore-changelog-2021-04-cascade-shopper-account.xml
.Added primary key on
JPA_GENERATED_KEYS.ID
field for improved performance.Updated
TOUTBOXMESSAGE.UIDPK
field type fromINT
toBIGINT
.Updated
DATABASECHANGELOG.ID
field type fromVARCHAR(63)
toVARCHAR(255)
. Note that this change is required only if the database was originally created in an old version of Elastic Path Commerce that used Liquibase 2.0.3.Added explicit indexes on all foreign key relationships, which were created implicitly by MySQL but not other database types. For more information, see the
core-changelog-2021-09-create-indices-on-FK-columns.xml
file.Added
MODIFIER_FIELDS
(CLOB
) andHAS_MODIFIERS
(BOOLEAN
) fields to the following tables to avoid an expensive table join:TORDER
TORDERSKU
TSHOPPINGCART
TCARTITEM
During the upgrade, data is migrated from the join tables into the
MODIFIER_FIELDS
field encoded as a JSON object.Related to the above change, the following tables are dropped:
TORDERDATA
TORDERITEMDATA
TSHOPPINGITEMDATA
TCARTDATA
Added a
TCUSTOMERCLOSURE
table that contains relationships between accounts and all subaccounts at all levels of the hierarchy.Expanded the fields in the
TINVENTORYJOURNAL.I_INV_JOURNAL_SKU_WAREHOUSE
composite index fromSKUCODE
,WAREHOUSE_UID
toSKUCODE
,WAREHOUSE_UID
,ALLOCATED_QUANTITY_DELTA
,QUANTITY_ON_HAND_DELTA
.Added index on
TSTORE.UPPER(STORECODE)
for improved performance (PostgresSQL only).
Upgraded libraries
The following libraries are upgraded as part of this release, primarily to address vulnerabilities detected within these libraries:
Library | Change |
---|---|
accessors-smart-2.4.7.jar | Version changed from 1.2 |
activemq-broker-5.16.1.jar | Version changed from 5.16.0 |
activemq-camel-5.16.1.jar | Version changed from 5.16.0 |
activemq-client-5.16.1.jar | Version changed from 5.16.0 |
activemq-console-5.16.1.jar | Version changed from 5.16.0 |
activemq-jms-pool-5.16.1.jar | Version changed from 5.16.0 |
activemq-kahadb-store-5.16.1.jar | Version changed from 5.16.0 |
activemq-openwire-legacy-5.16.1.jar | Version changed from 5.16.0 |
activemq-pool-5.16.1.jar | Version changed from 5.16.0 |
activemq-spring-5.16.1.jar | Version changed from 5.16.0 |
activemq-stomp-5.16.1.jar | Version changed from 5.16.0 |
activemq-web-5.16.1.jar | Version changed from 5.16.0 |
activemq-web-console-5.16.1.war | Version changed from 5.16.0 |
asm-1.0.2.jar | Removed |
asm-9.1.jar | Added |
c3p0-0.9.5.4.jar | Added |
cal10n-api-0.7.4.jar | Removed |
camel-core-2.25.3.jar | Version changed from 2.23.4 |
camel-core-xml-2.25.3.jar | Version changed from 2.23.4 |
camel-groovy-2.25.3.jar | Version changed from 2.23.4 |
camel-http-common-2.25.3.jar | Version changed from 2.23.4 |
camel-jackson-2.25.3.jar | Version changed from 2.23.4 |
camel-jaxb-2.25.3.jar | Version changed from 2.23.4 |
camel-jms-2.25.3.jar | Version changed from 2.23.4 |
camel-jsonpath-2.25.3.jar | Version changed from 2.23.4 |
camel-mail-2.25.3.jar | Version changed from 2.23.4 |
camel-script-2.25.3.jar | Version changed from 2.23.4 |
camel-servlet-2.25.3.jar | Version changed from 2.23.4 |
camel-spring-2.25.3.jar | Version changed from 2.23.4 |
camel-swagger-java-2.25.3.jar | Version changed from 2.23.4 |
camel-test-2.25.3.jar | Version changed from 2.23.4 |
camel-test-spring-2.25.3.jar | Version changed from 2.23.4 |
commons-collections4-4.4.jar | Version changed from 4.2 |
commons-daemon-1.2.3.jar | Version changed from 1.2.2 |
commons-io-2.8.0.jar | Added |
commons-lang-2.4.jar | Version changed from 2.3 |
commons-net-3.7.2.jar | Added |
commons-pool2-2.9.0.jar | Version changed from 2.8.0 |
disruptor-3.4.0.jar | Added |
HikariCP-java7-2.4.13.jar | Added |
hppc-0.8.1.jar | Version changed from 0.7.3 |
jackson-databind-2.9.10.8.jar | Version changed from 2.9.10.4 |
jackson-dataformat-smile-2.9.5.jar | Version changed from 2.5.4 |
jackson-dataformat-xml-2.9.10.jar | Version changed from 2.9.9 |
jackson-dataformat-yaml-2.9.10.jar | Version changed from 2.9.9 |
jackson-datatype-joda-2.9.10.jar | Version changed from 2.9.9 |
java-semver-0.9.0.jar | Added |
jcl-over-slf4j-1.7.26.jar | Added |
jna-5.8.0.jar | Added |
jna-platform-5.8.0.jar | Added |
json-path-2.4.0.jar | Removed |
json-smart-2.3.jar | Removed |
json-smart-2.4.7.jar | Version changed from 2.1.0 |
liquibase-core-3.10.3.jar | Version changed from 3.4.2 |
log4j-api-2.13.3.jar | Added |
log4j-core-2.13.3.jar | Added |
log4j-over-slf4j-1.7.26.jar | Added |
log4j-slf4j-impl-2.13.3.jar | Added |
log4j-web-2.13.3.jar | Added |
lombok-1.18.20.jar | Added |
lucene-analyzers-common-7.4.0.jar | Version changed from 7.2.1 |
lucene-analyzers-kuromoji-7.4.0.jar | Version changed from 7.2.1 |
lucene-analyzers-phonetic-7.4.0.jar | Version changed from 7.2.1 |
lucene-backward-codecs-7.4.0.jar | Version changed from 7.2.1 |
lucene-classification-7.4.0.jar | Version changed from 7.2.1 |
lucene-codecs-7.4.0.jar | Version changed from 7.2.1 |
lucene-core-7.4.0.jar | Version changed from 7.2.1 |
lucene-expressions-7.4.0.jar | Version changed from 7.2.1 |
lucene-grouping-7.4.0.jar | Version changed from 7.2.1 |
lucene-highlighter-7.4.0.jar | Version changed from 7.2.1 |
lucene-join-7.4.0.jar | Version changed from 7.2.1 |
lucene-memory-7.4.0.jar | Version changed from 7.2.1 |
lucene-misc-7.4.0.jar | Version changed from 7.2.1 |
lucene-queries-7.4.0.jar | Version changed from 7.2.1 |
lucene-queryparser-7.4.0.jar | Version changed from 7.2.1 |
lucene-sandbox-7.4.0.jar | Version changed from 7.2.1 |
lucene-spatial-extras-7.4.0.jar | Version changed from 7.2.1 |
lucene-spatial3d-7.4.0.jar | Version changed from 7.2.1 |
lucene-suggest-7.4.0.jar | Version changed from 7.2.1 |
mchange-commons-java-0.2.15.jar | Added |
metrics-jetty9-3.2.6.jar | Version changed from 3.2.2 |
metrics-jvm-3.2.6.jar | Version changed from 3.2.2 |
mxparser-1.2.2.jar | Added |
mysql-connector-java-8.0.25.jar | Version changed from 8.0.22 |
openjpa-2.4.0-ep2.4.jar | Version changed from 2.4.0-ep2.3 |
openjpa-jdbc-2.4.0-ep2.3.jar | Removed |
openjpa-jest-2.4.0-ep2.3.jar | Removed |
openjpa-kernel-2.4.0-ep2.3.jar | Removed |
openjpa-lib-2.4.0-ep2.3.jar | Removed |
openjpa-persistence-2.4.0-ep2.3.jar | Removed |
openjpa-persistence-jdbc-2.4.0-ep2.3.jar | Removed |
org.apache.servicemix.bundles.quartz-2.3.2.RELEASE_1.jar | Version changed from 2.1.7.RELEASE_1 |
org.apache.servicemix.bundles.spring-aop-4.3.30.RELEASE_1.jar | Version changed from 4.3.25.RELEASE_1 |
org.apache.servicemix.bundles.spring-beans-4.3.30.RELEASE_1.jar | Version changed from 4.3.25.RELEASE_1 |
org.apache.servicemix.bundles.spring-context-4.3.30.RELEASE_1.jar | Version changed from 4.3.25.RELEASE_1 |
org.apache.servicemix.bundles.spring-context-support-4.3.30.RELEASE_1.jar | Version changed from 4.3.25.RELEASE_1 |
org.apache.servicemix.bundles.spring-core-4.3.30.RELEASE_1.jar | Version changed from 4.3.25.RELEASE_1 |
org.apache.servicemix.bundles.spring-expression-4.3.30.RELEASE_1.jar | Version changed from 4.3.25.RELEASE_1 |
org.apache.servicemix.bundles.spring-jdbc-4.3.30.RELEASE_1.jar | Version changed from 4.3.25.RELEASE_1 |
org.apache.servicemix.bundles.spring-jms-4.3.30.RELEASE_1.jar | Version changed from 4.3.25.RELEASE_1 |
org.apache.servicemix.bundles.spring-orm-4.3.30.RELEASE_1.jar | Version changed from 4.3.25.RELEASE_1 |
org.apache.servicemix.bundles.spring-tx-4.3.30.RELEASE_1.jar | Version changed from 4.3.25.RELEASE_1 |
org.apache.servicemix.bundles.spring-web-4.3.30.RELEASE_1.jar | Version changed from 4.3.25.RELEASE_1 |
org.apache.servicemix.bundles.spring-webmvc-4.3.30.RELEASE_1.jar | Version changed from 4.3.25.RELEASE_1 |
org.apache.servicemix.bundles.xstream-1.4.18_1.jar | Version changed from 1.4.11.1_1 |
oshi-core-5.7.4.jar | Added |
pf4j-3.6.0.jar | Added |
postgresql-42.2.23.jar | Added |
quartz-2.3.2.jar | Version changed from 2.1.7 |
rome-1.15.0.jar | Version changed from 1.12.2 |
rome-utils-1.15.0.jar | Version changed from 1.12.2 |
rrd4j-3.2.jar | Added |
slf4j-api-1.7.26.jar | Added |
slf4j-ext-1.7.26.jar | Version changed from 1.6.3 |
solr-core-7.4.0.jar | Version changed from 7.2.1 |
solr-solrj-7.4.0.jar | Version changed from 7.2.1 |
spatial4j-0.7.jar | Version changed from 0.6 |
spring-aop-4.3.26.RELEASE.jar | Removed |
spring-aop-4.3.30.RELEASE.jar | Version changed from 4.3.25.RELEASE |
spring-beans-4.3.30.RELEASE.jar | Version changed from 4.3.26.RELEASE |
spring-context-4.3.26.RELEASE.jar | Removed |
spring-context-4.3.30.RELEASE.jar | Version changed from 4.3.25.RELEASE |
spring-context-support-4.3.30.RELEASE.jar | Version changed from 4.3.25.RELEASE |
spring-core-4.3.30.RELEASE.jar | Version changed from 4.3.26.RELEASE |
spring-expression-4.3.26.RELEASE.jar | Removed |
spring-expression-4.3.30.RELEASE.jar | Version changed from 4.3.25.RELEASE |
spring-jdbc-4.3.30.RELEASE.jar | Version changed from 4.3.25.RELEASE |
spring-jms-4.3.30.RELEASE.jar | Version changed from 4.3.25.RELEASE |
spring-messaging-4.3.30.RELEASE.jar | Version changed from 4.3.25.RELEASE |
spring-orm-4.3.30.RELEASE.jar | Version changed from 4.3.25.RELEASE |
spring-test-4.3.30.RELEASE.jar | Version changed from 4.3.25.RELEASE |
spring-tx-4.3.30.RELEASE.jar | Added |
spring-web-4.3.26.RELEASE.jar | Removed |
spring-web-4.3.30.RELEASE.jar | Version changed from 4.3.25.RELEASE |
spring-webmvc-4.3.26.RELEASE.jar | Removed |
spring-webmvc-4.3.30.RELEASE.jar | Version changed from 4.3.25.RELEASE |
transactions-4.0.6.jar | Added |
transactions-api-4.0.6.jar | Added |
transactions-jdbc-4.0.6.jar | Added |
transactions-jms-4.0.6.jar | Added |
transactions-jta-4.0.6.jar | Added |
woodstox-core-5.3.0.jar | Version changed from 5.1.0 |
xbean-asm5-shaded-3.17.jar | Removed |
xbean-spring-4.18.jar | Version changed from 4.17 |
xmlbeans-3.0.0.jar | Version changed from 2.4.0 |
xstream-1.4.15.jar | Added |
xstream-1.4.18.jar | Version changed from 1.4.11.1 |