Migration Guidelines
General update checklist
- updating an existing installation
- updating a MapStore project created for a previous version
To update an existing installation you usually have to do nothing except eventually to execute queries on your database to update the changes to the database schema.
In case of a project it becomes a little more complicated, depending on the customization.
This is a list of things to check if you want to update from a previous version valid for every version.
- Take a list to migration notes below for your version
- Take a look to the release notes
- update your
package.json
to latest libs versions - take a look at your custom files to see if there are some changes (e.g.
localConfig.js
,proxy.properties
) - Some changes that may need to be ported could be present also in
pom.xml
files and inconfigs
directory. - check for changes also in
web/src/main/webapp/WEB-INF/web.xml
. - Optionally check also accessory files like
.eslinrc
, if you want to keep aligned with lint standards. - Follow the instructions below, in order, from your version to the one you want to update to.
Migration from 2021.02.01 to 2021.02.02
Style parsers dynamic import
The style parser libraries introduced a dynamic import to reduce the initial bundle size. This change reflects to the getStyleParser
function provided by the VectorStyleUtils module. If a downstream project of MapStore is using getStyleParser
it should update it to this new version:
1 2 3 4 5 6 7 8 9 10 |
|
Migration from 2021.02.00 to 2021.02.01
This update contains a fix for a minor vulnerability found in log4j
library.
For this reason you may need to update the dependencies of your project
Note
This vulnerability is not CVE-2021-44228
but only a couple of smaller ones, that involve Log4J
( CVE-2021-44228 is for Log4J2
).
Anyway MapStore is not prone to these vulnerabilities with the default configuration.
For more information, see the dedicated blog post
here the instructions:
Align pom.xml
files
Here the changes in pom.xml
and web/pom.xml
to update:
- Change
mapstore-backend
intomapstore-services
and set the version to1.2.2
1 2 3 4 5 6 7 8 |
|
- Set
geostore-webapp
version to1.7.1
1 2 3 4 5 6 7 8 |
|
- Set
http_proxy
version to1.1.1
(should already be there)
1 2 3 4 5 6 7 8 9 |
|
- Set
print-lib
versiongeosolutions-2.0
to versiongeosolutions-2.0.1
1 2 3 4 5 6 |
|
Migration from 2021.01.04 to 2021.02.00
Theme updates and CSS variables
The theme of MapStore has been updated to support CSS variables for some aspects of the style, in particular colors and font families.
The web/client/themes/default/variables.less
file contains all the available variables described under the @ms-theme-vars
ruleset.
It is suggested to :
- update the lesscss variables in the projects because the variables starting with
@ms2-
will be deprecated soon:
@ms2-color-text
-> @ms-main-color
@ms2-color-background
-> @ms-main-bg
@ms2-color-shade-lighter
-> @ms-main-border-color
@ms2-color-code
-> @ms-code-color
@ms2-color-text-placeholder
-> @ms-placeholder-color
@ms2-color-disabled
-> @ms-disabled-bg
@ms2-color-text-disabled
-> @ms-disabled-color
@ms2-color-text-primary
-> @ms-primary-contrast
@ms2-color-primary
-> @ms-primary
@ms2-color-info
-> @ms-info
@ms2-color-success
-> @ms-success
@ms2-color-warning
-> @ms-warning
@ms2-color-danger
-> @ms-danger
- The font family has been update to
Noto Sans
so all the html need to be updated removing the previous font link with:
1 2 |
|
- if you are importing
react-select
orreact-widgets
inline css/less in your own project, you have to remove the import. Now the stile of these libraries is managed at project level
Project system
During this release MapStore we started an rewrite of the project system, organized in different phases.
The first phase of this migration has been identified by this pull request. In this phase we are supporting the backward compatibility as much as possible, introducing the new project system in parallel with the new one (experimental). In the future the current script will be deprecated in favor of the new one.
Here below the breaking changes introduced in this release to support this new system:
This section will tell you how to migrate to support the following changes:
- Minor changes to
prod-webpack.config.js
- Move front-end configuration files in
configs
folder - Back-end has been reorganized
Minor changes to prod-webpack.config.js
Minor changes to prod-webpack.config.js
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
|
Move front-end configuration files in configs
folder
We suggest you to move them as well from root to configs folder, and align your app.jsx
configuration with the new standard (if you changed the location of configs).
This will allow to use the data dir in an easy way. So:
- Move the following files in
configs
directory: localConfig.json
new.json
pluginsConfig.json
config.json
simple.json
- If changed something in
app.jsx
about configuration, align to get the files moved in config. - To allow MapStore to copy the correct file in the final war, you have to change
web/pom.xml
executioncopy-resources
for idconfig files
this way (this only if you didn't customizedlocalConfig.json
):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Back-end has been reorganized
In particular:
- all the java code has been moved from
web/src/
to thejava/
andproduct/
directories (andrelease
, already existing). mapstore-backend
has been renamed intomapstore-services
.- Some servlets have been added in order to provide native support to data dir and make it work with the new
configs
directory.
So you will have to:
- Align the
pom.xml
to the latest versions of the libs - Edit the
web.xml
and change the*-servlet.xml
files to expose the new services
Note
Future evolution of the project will avoid you to keep your own copies of the pom files as much as possible, reducing the boilerplate and making migration a lot easier. For this reasons these migration guidelines will change soon.
Here below the details of the changes.
Align pom.xml
files to latest versions of the libs
Here the changes in pom.xml
and `web/pom.xml to update:
- Change
mapstore-backend
intomapstore-services
and set the version to1.2.0
1 2 3 4 5 6 7 8 |
|
- Set
geostore-webapp
version to1.7.0
1 2 3 4 5 6 7 8 |
|
- Set
http_proxy
version to1.1.0
(should already be there)
1 2 3 4 5 6 7 8 9 |
|
Edit the web.xml
and change the *-servlet.xml
files to expose the new services
- Copy from mapstore to folder
web/src/main/webapp/WEB-INF/
the files: configs-servlet.xml
extensions-servlet.xml
loadAssets-servlet.xml
- Remove the old
dispatcher-servlet.xml
(it has been replaced byloadAssets-servlet.xml
for backward compatibility) - Align
web/src/main/webapp/WEB-INF/web.xml
with the new servlets as changes below (removedispatcher
entry in favour of the following).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
|
Data directory has been reorganized and is now available also for product
The new organization of the data directory is:
configs
will contain all json files (localConfig.json
,new.json
,pluginsConfig.json
, ...) and all the.patch
files applied to them.extensions
folder contains all the data for the extensions, includingextensions.json
- The root contains the properties files to configure database, proxy and other configs
To organize your old data directory accordingly to the new specification.
- Move all
.json
and.json.patch
files inconfigs
folder (exceptextensions.json
) - Move the directory
dist/extensions
to simplyextensions
. - The file
extensions.json
have to be moved inextensions/extensions.json
. - Edit the file
extensions/extensions.json
changing the paths fromdist/extensions/<Plugin-Name>/...
to<Plugin-Name>/...
You can set it up by configuring datadir.location
java system property. Changes to paths or configuration files are not required anymore.
Configurations
- Embedded now uses popup as default. Align localConfig.json
plugins --> embedded --> Identify
with the latest one:
1 2 3 4 5 6 7 8 9 |
|
Migration from 2021.01.01 to 2021.01.03
Generally speaking this is not properly a breaking change, but more a fix to apply to your installations. Certificate for 'cesiumjs.org' has expired at 2021.05.05, so to continue using CesiumJS with MapStore
you will have to replace all the URLs like https://cesiumjs.org/releases/1.17
in https://cesium.com/downloads/cesiumjs/releases/1.17
. This is the main fix of this minor release.
See this pull request on GitHub as a sample to apply these changes to your project.
Migration from 2021.01.00 to 2021.01.01
Update embedded entry to load the correct configuration
Existing MapStore project could have an issue with the loading of map embedded page due to the impossibility to change some configuration such as localConfig.json or translations path in the javascript entry.
This issue can be solved following these steps:
1 - add a custom entry named embedded.jsx
in the js/
directory of the project with the content:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
2 - update the path of the embedded entry inside the webpack.config.js
and prod-webpack.config.js
files with:
1 2 |
|
Locate plugin configuration
Configuration for Locate plugin has changed and it is not needed anymore inside the Map plugin
- old localConfig.json configuration needed 'locate' listed as tool inside the Map plugin and as a separated Locate plugin
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
- new localConfig.json configuration removes 'locate' from tools array and it keeps only the plugin configuration
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Update an existing project to include embedded Dashboards and GeoStories
Embedded Dashboards and GeoStories need a new set of javascript entries, html templates and configuration files to make them completely available in an existing project.
The steps described above assume this structure of the MapStore2 project for the files that need update:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
1) create the entries files for the embedded application named dashboardEmbedded.jsx
and geostoryEmbedded.jsx
in the js/ folder with the following content (see links):
- dashboardEmbedded.jsx
- geostoryEmbedded.jsx
2) add the html files and templates in the root directory of the project with these names and content (see links): - dashboard-embedded-template.html - dashboard-embedded.html - geostory-embedded-template.html - geostory-embedded.html
3) update webpack configuration for development and production with the new entries and the related configuration:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
|
4) Add configuration to localConfig.json in the plugins section related to Share functionalities (Only with custom localConfig.json in the project):
- Dashboard share configuration
js
"dashboard": [
// ...
{
"name": "Share",
"cfg": {
"showAPI": false,
"advancedSettings": false,
"shareUrlRegex": "(h[^#]*)#\\/dashboard\\/([A-Za-z0-9]*)",
"shareUrlReplaceString": "$1dashboard-embedded.html#/$2",
"embedOptions": {
"showTOCToggle": false,
"showConnectionsParamToggle": true
}
}
},
// ...
]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
5) update the web/pom.xml to copy all the related resources in the final *.war file with these new executions
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
|
Migration from 2020.02.00 to 2021.01.00
Update to webpack 5 - Module federation
MapStore migrated to webpack 5 and provided the extension system using "Webpack Module Federation". Here the steps to update the existing files in your project.
package.json:
- dev server scripts changed syntax. now you need to use
webpack serve
instead ofwebpack-dev-server
. Replace also all--colors
with--color
in your scripts that use webpack / webpack-dev-server. - Align
dependencies
anddevDependencies
with MapStore's one, reading thepackage.json
, as usual. - To support extensions in your project, you need to add
ModuleFederationPlugin
to yourprod-webpack.config.js
andwebpack.config.js
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Other the other changes required are applied automatically in buildConfig.js
.
Eslint config
Now eslint configuration is shared in a separate npm module. To update your custom project you have to remove the following files:
.eslintignore
.eslintconfig
And add to package.json
the following entry, in the root:
1 2 3 4 5 6 7 8 9 10 |
|
If you have aproject that includes MapStore as a dependency, you can run npm run updateDevDeps
to finalize the update. Otherwise make you sure to include:
- devDependencies:
- add
"@mapstore/eslint-config-mapstore": "1.0.1",
- delete
babel-eslint
- dependencies:
- update `"eslint": "7.8.1"
App structure review
From this version some base components of MapStore App (StandardApp
, StandardStore
...) has been restructured and better organized. Here a list of the breaking change you can find in a depending project
web/client/product/main.jsx
has been updated to newimport
andexport
syntax (removedrequire
andexports.module
). So if you are importing it (usually in yourapp.jsx
) you have to use theimport
syntax or userequire(...).default
in your project. The same for the other files.- New structure of arguments in web/client/stores/StandardStore.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
-
Moved standard epics, standard reducers and standard rootReducer function from web/client/stores/StandardStore.js to a separated file web/client/stores/defaultOptions.js
-
loading extensions functionalities inside StandardApp has been moved to an specific withExtensions HOC, so if you are not using
main.js
but directlyStandardApp
and you need extensions you need to add this HOC to your StandardApp
Migration from 2020.01.00 to 2020.02.00
New authentication rule for internal services
With this new version the support for uploading extensions has been introduced. A new entry point needs administration authorization to allow the upload of new plugins by the administrator. So:
- In
localConfig.json
add the following entry in theauthenticationRules
array:
1 2 3 4 |
|
the final entry should look like this
1 2 3 4 5 6 7 |
|
Translation files
- The translations file extension has been changed into JSON. Now translation files has been renamed from
data.<locale>
todata.<locale>.json
. This change makes the.json
extension mandatory for all translation files. This means that depending projects with custom translation files should be renabled in the same name. E.g.data.it-IT
have to be renamed asdata.it-IT.json
Database Update
Database schema has changed. To update your database you need to apply this SQL scripts to your database
- Update the user schema run the script available here:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
- Add new categories
1 2 3 4 5 6 7 8 |
|
Backend update
For more details see this commit
new files have been added:
web/src/main/webapp/WEB-INF/dispatcher-servlet.xml
web/src/main/resources/mapstore.properties
some files has been changed:
web/src/main/webapp/WEB-INF/web.xml
pom.xml
web/pom.xml
Migration from 2019.02.01 to 2020.01.00
With MapStore 2020.01.00 some dependencies that were previously hosted on github, have now been published on the npm registry, and package.json has been updated accordingly. Here is the PR that documents how to update local package.json and local webpack if not using the mapstore buildConfig/testConfig common files.
After updating package.json run npm install Now you should be able to run locally with npm start
For more info see the related issue
Moreover a new category has been added for future features, called GEOSTORY.
It is not necessary for this release, but, to follow the update sequence, you can add it by executing the following line.
1 |
|
Migration from 2019.01.00 to 2019.01.01
MapStore 2019.01.01 changes the location of some of the build and test configuration files. This also affects projects using MapStore build files, sp if you update MapStore subproject to the 2019.01.01 version you also have to update some of the project configuration files. In particular:
- webpack.config.js and prod-webpack.config.js:
- update path to themes.js from ./MapStore2/themes.js to ./MapStore2/build/themes.js
- update path to buildConfig from ./MapStore2/buildConfig to ./MapStore2/build/buildConfig
- karma.conf.continuous-test.js and karma.config.single-run.js: update path to testConfig from ./MapStore2/testConfig to ./MapStore2/build/testConfig
Migration from 2017.05.00 to 2018.01.00
MapStore 2018.01.00 introduced theme and js and css versioning.
This allows to auto-invalidates cache files for each version of your software.
For custom projects you could choose to ignore this changes by setting version: "no-version" in your app.jsx StandardRouter
selector:
1 2 3 4 5 6 7 8 9 10 11 |
|
Support js/theme versioning in your project
Take a look to this pull request as reference. Basically versioning is implemented in 2 different ways for css and js files :
- Add at build time the js files inclusion to the files, with proper hashes.
- Load theme css files appending to the URL the ?{version} where version is the current mapstore2 version The different kind of loading for css files is needed to continue supporting the theme switching capabilities. For the future we would like to unify these 2 systems. See this issue.
You have to:
- Add the version file to the root (
version.txt
). - Create a template for each html file you have. These files will replace the html files when you build the final war file. These files are like the original ones but without the
[bundle].js
file inclusion and without theme css. - Add
HtmlWebpackPlugin
for production only, one for each js file. This plugin will add to the template file the script inclusion (example). - if you have to include the script in the head (e.g.
api.html
has some script that need the js to be loaded before executing the inline scripts), use the optioninject: 'head'
- change each entry point (
app.jsx
,api.jsx
,embedded.jsx
,yourcoustomentrypoint.jsx
) this way (example): version
reducer inStandardRouter
loadVersion
action ininitialActions
version
andloadAfterTheme
selectors toStandardRouter
state.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
- Add to your
pom.xml
some execution steps to replace html files with the ones generated in 'dist' directory. (example). And copyversion.txt
- Override the version file in your build process (e.g. you can use the commit hash)
Migration from 2017.05.00 to 2017.03.00 and previews
In 2017.03.00 the createProject.js
script created only a custom project. From version 2017.04.00 we changed the script to generate 2 kind of projects:
- custom: the previous version
- standard: mapstore standard
Standard project wants to help to generate a project that is basically the MapStore product, where you can add your own plugins and customize your theme (before this you had to create a project similar to MapStore on your own)
Depending on our usage of custom project, this may introduce some breaking changes.
If you previously included some file from product
folder, now app.jsx
has been changed to call main.jsx
. Please take a look on how the main product uses this to migrate your changes inside your custom project.
Migration from 2017.01.00 to 2017.02.00
The version 2017.02.00 has many improvements and changes:
- introduced
redux-observable
- updated
webpack
to version 2 - updated
react-intl
to version 2.x - updated
react
to [version 15.4.2] (https://facebook.github.io/react/blog/2016/04/07/react-v15.html) - updated
react-bootstrap
to version 0.30.7
We suggest you to:
- align your package.json with the latest version of 2017.02.00.
- update your webpack files (see below).
- update your tests to react 15 version. see upgrade guide
- Update your
react-bootstrap
custom components with the new one (see below).
Side Effect Management - Introduced redux-observable
To manage complex asynchronous operations the thunk middleware is not enough. When we started with MapStore there was no alternative to thunk. Now we have some options. After a spike (results available here) we chose to use redux-observable. For the future, we strongly recommend to use this library to perform asynchronous tasks.
Introducing this library will allow to :
- remove business logic from the components event handlers
- now all new
actionCreators
should return pure actions. All async stuff will be deferred to the epics. - avoid bouncing between components and state to trigger side effect
- speed up development with
rxjs
functionalities - Existing thunk integration will be maintained since all the thunks will be replaced.
If you are using the Plugin system and the StandardStore, you may have only to include the missing new dependencies in your package.json (redux-observable and an updated version of redux).
Check the current package.json to get he most recent versions. For testing we included also redux-mockup-store as a dependency, but you are free to test your epics as you want.
For more complex integrations check this pull request to see how to integrate redux-observable or follow the guide on the redux-observable site.
Webpack update to version 2
We updated webpack (old one is deprecated), check this pull request to find out how to update your webpack files. here a list of what we had to update:
- module.loaders are now module.rules
- update your package.json with latest versions of webpack, webpack plugins and karma libs and integrations (Take a look to the changes on package.json in the pull request if you want a detailed list of what to update in this case).
- change your test proxy configuration with the new one.
More details on the webpack site.
react-intl update to 2.x
See this pull request for the details. You should only have to update your package.json
react update to 15.4.2
Check this pull request to see how to:
- update your package.json
- update your tests
React Bootstrap update
The version we are using is not documented anymore, and not too much compatible with react 15 (too many warnings). So this update can not be postponed anymore.
The bigger change in this case is that the Input component do not exists anymore. You will have to replace all your Input with the proper components, and update the package.json
. See this pull request for details.